Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.trino.sql.analyzer;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multiset;
import com.google.common.collect.Streams;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import com.google.errorprone.annotations.Immutable;
import io.trino.metadata.AnalyzeMetadata;
import io.trino.metadata.QualifiedObjectName;
import io.trino.metadata.ResolvedFunction;
import io.trino.metadata.TableExecuteHandle;
import io.trino.metadata.TableHandle;
import io.trino.metadata.TableLayout;
import io.trino.security.AccessControl;
import io.trino.security.SecurityContext;
import io.trino.spi.QueryId;
import io.trino.spi.connector.CatalogHandle;
import io.trino.spi.connector.CatalogHandle.CatalogVersion;
import io.trino.spi.connector.ColumnHandle;
import io.trino.spi.connector.ColumnSchema;
import io.trino.spi.connector.ConnectorTableMetadata;
import io.trino.spi.connector.ConnectorTransactionHandle;
import io.trino.spi.eventlistener.BaseViewReferenceInfo;
import io.trino.spi.eventlistener.ColumnDetail;
import io.trino.spi.eventlistener.ColumnInfo;
import io.trino.spi.eventlistener.ColumnMaskReferenceInfo;
import io.trino.spi.eventlistener.MaterializedViewReferenceInfo;
import io.trino.spi.eventlistener.RoutineInfo;
import io.trino.spi.eventlistener.RowFilterReferenceInfo;
import io.trino.spi.eventlistener.TableInfo;
import io.trino.spi.eventlistener.TableReferenceInfo;
import io.trino.spi.eventlistener.ViewReferenceInfo;
import io.trino.spi.function.table.Argument;
import io.trino.spi.function.table.ConnectorTableFunctionHandle;
import io.trino.spi.security.Identity;
import io.trino.spi.type.RowType;
import io.trino.spi.type.Type;
import io.trino.sql.analyzer.JsonPathAnalyzer.JsonPathAnalysis;
import io.trino.sql.analyzer.PatternRecognitionAnalysis.PatternInputAnalysis;
import io.trino.sql.planner.PartitioningHandle;
import io.trino.sql.tree.AllColumns;
import io.trino.sql.tree.DataType;
import io.trino.sql.tree.ExistsPredicate;
import io.trino.sql.tree.Expression;
import io.trino.sql.tree.FieldReference;
import io.trino.sql.tree.FunctionCall;
import io.trino.sql.tree.GroupingOperation;
import io.trino.sql.tree.Identifier;
import io.trino.sql.tree.InPredicate;
import io.trino.sql.tree.Join;
import io.trino.sql.tree.JsonTable;
import io.trino.sql.tree.JsonTableColumnDefinition;
import io.trino.sql.tree.LambdaArgumentDeclaration;
import io.trino.sql.tree.MeasureDefinition;
import io.trino.sql.tree.Node;
import io.trino.sql.tree.NodeRef;
import io.trino.sql.tree.Offset;
import io.trino.sql.tree.OrderBy;
import io.trino.sql.tree.Parameter;
import io.trino.sql.tree.QualifiedName;
import io.trino.sql.tree.QuantifiedComparisonExpression;
import io.trino.sql.tree.Query;
import io.trino.sql.tree.QuerySpecification;
import io.trino.sql.tree.RangeQuantifier;
import io.trino.sql.tree.Relation;
import io.trino.sql.tree.RowPattern;
import io.trino.sql.tree.SampledRelation;
import io.trino.sql.tree.Statement;
import io.trino.sql.tree.SubqueryExpression;
import io.trino.sql.tree.SubsetDefinition;
import io.trino.sql.tree.Table;
import io.trino.sql.tree.TableFunctionInvocation;
import io.trino.sql.tree.Unnest;
import io.trino.sql.tree.WindowFrame;
import io.trino.sql.tree.WindowOperation;
import io.trino.transaction.TransactionId;
import jakarta.annotation.Nullable;
import java.time.Instant;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Deque;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.OptionalLong;
import java.util.Set;
import static com.google.common.base.MoreObjects.toStringHelper;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.collect.ImmutableList.toImmutableList;
import static com.google.common.collect.ImmutableMap.toImmutableMap;
import static com.google.common.collect.ImmutableSet.toImmutableSet;
import static io.trino.sql.analyzer.QueryType.DESCRIBE;
import static io.trino.sql.analyzer.QueryType.EXPLAIN;
import static java.lang.Boolean.FALSE;
import static java.lang.String.format;
import static java.util.Collections.emptyList;
import static java.util.Collections.unmodifiableList;
import static java.util.Collections.unmodifiableMap;
import static java.util.Collections.unmodifiableSet;
import static java.util.Objects.requireNonNull;
public class Analysis
{
@Nullable
private final Statement root;
private final Map, Expression> parameters;
private String updateType;
private Optional target = Optional.empty();
private boolean skipMaterializedViewRefresh;
private Optional tableExecuteReadsData;
private final Map, Query> namedQueries = new LinkedHashMap<>();
// map expandable query to the node being the inner recursive reference
private final Map, Node> expandableNamedQueries = new LinkedHashMap<>();
// map inner recursive reference in the expandable query to the recursion base scope
private final Map, Scope> expandableBaseScopes = new LinkedHashMap<>();
// Synthetic scope when a query does not have a FROM clause
// We need to track this separately because there's no node we can attach it to.
private final Map, Scope> implicitFromScopes = new LinkedHashMap<>();
private final Map, Scope> scopes = new LinkedHashMap<>();
private final Map, ResolvedField> columnReferences = new LinkedHashMap<>();
// a map of users to the columns per table that they access
private final Map>> tableColumnReferences = new LinkedHashMap<>();
// Record fields prefixed with labels in row pattern recognition context
private final Map, Optional> labels = new LinkedHashMap<>();
private final Map, Range> ranges = new LinkedHashMap<>();
private final Map, Set> undefinedLabels = new LinkedHashMap<>();
private final Map, MeasureDefinition> measureDefinitions = new LinkedHashMap<>();
// Pattern function analysis (classifier, match_number, aggregations and prev/next/first/last) in the context of the given node
private final Map, List> patternInputsAnalysis = new LinkedHashMap<>();
// FunctionCall nodes corresponding to any of the special pattern recognition functions
private final Set> patternRecognitionFunctionCalls = new LinkedHashSet<>();
// FunctionCall nodes corresponding to any of the navigation functions (prev/next/first/last)
private final Set> patternNavigationFunctions = new LinkedHashSet<>();
private final Map, String> resolvedLabels = new LinkedHashMap<>();
private final Map, Set> subsets = new LinkedHashMap<>();
// for JSON features
private final Map, JsonPathAnalysis> jsonPathAnalyses = new LinkedHashMap<>();
private final Map, ResolvedFunction> jsonInputFunctions = new LinkedHashMap<>();
private final Map, ResolvedFunction> jsonOutputFunctions = new LinkedHashMap<>();
private final Map, JsonTableAnalysis> jsonTableAnalyses = new LinkedHashMap<>();
private final Map, List> aggregates = new LinkedHashMap<>();
private final Map, List> orderByAggregates = new LinkedHashMap<>();
private final Map, GroupingSetAnalysis> groupingSets = new LinkedHashMap<>();
private final Map, Expression> where = new LinkedHashMap<>();
private final Map, Expression> having = new LinkedHashMap<>();
private final Map, List> orderByExpressions = new LinkedHashMap<>();
private final Set> redundantOrderBy = new HashSet<>();
private final Map, List> selectExpressions = new LinkedHashMap<>();
// Store resolved window specifications defined in WINDOW clause
private final Map, Map, ResolvedWindow>> windowDefinitions = new LinkedHashMap<>();
// Store resolved window specifications for window functions and row pattern measures
private final Map, ResolvedWindow> windows = new LinkedHashMap<>();
private final Map, List> windowFunctions = new LinkedHashMap<>();
private final Map, List> orderByWindowFunctions = new LinkedHashMap<>();
private final Map, List> windowMeasures = new LinkedHashMap<>();
private final Map, List> orderByWindowMeasures = new LinkedHashMap<>();
private final Map, Long> offset = new LinkedHashMap<>();
private final Map, OptionalLong> limit = new LinkedHashMap<>();
private final Map, List> selectAllResultFields = new LinkedHashMap<>();
private final Map, Expression> joins = new LinkedHashMap<>();
private final Map, JoinUsingAnalysis> joinUsing = new LinkedHashMap<>();
private final Map, SubqueryAnalysis> subqueries = new LinkedHashMap<>();
private final Map, PredicateCoercions> predicateCoercions = new LinkedHashMap<>();
private final Map, TableEntry> tables = new LinkedHashMap<>();
private final Map, Type> types = new LinkedHashMap<>();
private final Map, Type> coercions = new LinkedHashMap<>();
private final Map, Type> sortKeyCoercionsForFrameBoundCalculation = new LinkedHashMap<>();
private final Map, Type> sortKeyCoercionsForFrameBoundComparison = new LinkedHashMap<>();
private final Map, ResolvedFunction> frameBoundCalculations = new LinkedHashMap<>();
private final Map, List> relationCoercions = new LinkedHashMap<>();
private final Map, RoutineEntry> resolvedFunctions = new LinkedHashMap<>();
private final Map, LambdaArgumentDeclaration> lambdaArgumentReferences = new LinkedHashMap<>();
private final Map columns = new LinkedHashMap<>();
private final Map, Double> sampleRatios = new LinkedHashMap<>();
private final Map, List> groupingOperations = new LinkedHashMap<>();
private final Multiset rowFilterScopes = HashMultiset.create();
private final Map, List> rowFilters = new LinkedHashMap<>();
private final Map, List> checkConstraints = new LinkedHashMap<>();
private final Multiset columnMaskScopes = HashMultiset.create();
private final Map, Map> columnMasks = new LinkedHashMap<>();
private final Map, UnnestAnalysis> unnestAnalysis = new LinkedHashMap<>();
private Optional create = Optional.empty();
private Optional insert = Optional.empty();
private Optional refreshMaterializedView = Optional.empty();
private Optional delegatedRefreshMaterializedView = Optional.empty();
private Optional analyzeMetadata = Optional.empty();
private Optional> updatedColumns = Optional.empty();
private Optional mergeAnalysis = Optional.empty();
private final QueryType queryType;
// for recursive view detection
private final Deque