Search in sources :

Example 36 with Query

use of com.facebook.presto.sql.tree.Query in project presto by prestodb.

the class RelationPlanner method visitTable.

@Override
protected RelationPlan visitTable(Table node, Void context) {
    Query namedQuery = analysis.getNamedQuery(node);
    Scope scope = analysis.getScope(node);
    if (namedQuery != null) {
        RelationPlan subPlan = process(namedQuery, null);
        // Add implicit coercions if view query produces types that don't match the declared output types
        // of the view (e.g., if the underlying tables referenced by the view changed)
        Type[] types = scope.getRelationType().getAllFields().stream().map(Field::getType).toArray(Type[]::new);
        RelationPlan withCoercions = addCoercions(subPlan, types);
        return new RelationPlan(withCoercions.getRoot(), scope, withCoercions.getFieldMappings());
    }
    TableHandle handle = analysis.getTableHandle(node);
    ImmutableList.Builder<VariableReferenceExpression> outputVariablesBuilder = ImmutableList.builder();
    ImmutableMap.Builder<VariableReferenceExpression, ColumnHandle> columns = ImmutableMap.builder();
    for (Field field : scope.getRelationType().getAllFields()) {
        VariableReferenceExpression variable = variableAllocator.newVariable(getSourceLocation(node), field.getName().get(), field.getType());
        outputVariablesBuilder.add(variable);
        columns.put(variable, analysis.getColumn(field));
    }
    List<VariableReferenceExpression> outputVariables = outputVariablesBuilder.build();
    PlanNode root = new TableScanNode(getSourceLocation(node.getLocation()), idAllocator.getNextId(), handle, outputVariables, columns.build(), TupleDomain.all(), TupleDomain.all());
    return new RelationPlan(root, scope, outputVariables);
}
Also used : ColumnHandle(com.facebook.presto.spi.ColumnHandle) Query(com.facebook.presto.sql.tree.Query) ImmutableList.toImmutableList(com.google.common.collect.ImmutableList.toImmutableList) ImmutableList(com.google.common.collect.ImmutableList) ImmutableMap(com.google.common.collect.ImmutableMap) Field(com.facebook.presto.sql.analyzer.Field) TypeUtils.isEnumType(com.facebook.presto.common.type.TypeUtils.isEnumType) ArrayType(com.facebook.presto.common.type.ArrayType) RowType(com.facebook.presto.common.type.RowType) MapType(com.facebook.presto.common.type.MapType) Type(com.facebook.presto.common.type.Type) RelationType(com.facebook.presto.sql.analyzer.RelationType) PlanNode(com.facebook.presto.spi.plan.PlanNode) Scope(com.facebook.presto.sql.analyzer.Scope) TableScanNode(com.facebook.presto.spi.plan.TableScanNode) VariableReferenceExpression(com.facebook.presto.spi.relation.VariableReferenceExpression) TableHandle(com.facebook.presto.spi.TableHandle)

Example 37 with Query

use of com.facebook.presto.sql.tree.Query in project presto by prestodb.

the class QueryRewriter method rewriteNonStorableColumns.

private Query rewriteNonStorableColumns(Query query, ResultSetMetaData metadata) {
    // Skip if all columns are storable
    List<Type> columnTypes = getColumnTypes(typeManager, metadata);
    if (columnTypes.stream().noneMatch(type -> getColumnTypeRewrite(type).isPresent())) {
        return query;
    }
    // Cannot handle SELECT query with top-level SetOperation
    if (!(query.getQueryBody() instanceof QuerySpecification)) {
        return query;
    }
    QuerySpecification querySpecification = (QuerySpecification) query.getQueryBody();
    List<SelectItem> selectItems = querySpecification.getSelect().getSelectItems();
    // Cannot handle SELECT *
    if (selectItems.stream().anyMatch(AllColumns.class::isInstance)) {
        return query;
    }
    List<SelectItem> newItems = new ArrayList<>();
    checkState(selectItems.size() == columnTypes.size(), "SelectItem count (%s) mismatches column count (%s)", selectItems.size(), columnTypes.size());
    for (int i = 0; i < selectItems.size(); i++) {
        SingleColumn singleColumn = (SingleColumn) selectItems.get(i);
        Optional<Type> columnTypeRewrite = getColumnTypeRewrite(columnTypes.get(i));
        if (columnTypeRewrite.isPresent()) {
            newItems.add(new SingleColumn(new Cast(singleColumn.getExpression(), columnTypeRewrite.get().getTypeSignature().toString()), singleColumn.getAlias()));
        } else {
            newItems.add(singleColumn);
        }
    }
    return new Query(query.getWith(), new QuerySpecification(new Select(querySpecification.getSelect().isDistinct(), newItems), querySpecification.getFrom(), querySpecification.getWhere(), querySpecification.getGroupBy(), querySpecification.getHaving(), querySpecification.getOrderBy(), Optional.empty(), querySpecification.getLimit()), query.getOrderBy(), Optional.empty(), query.getLimit());
}
Also used : Cast(com.facebook.presto.sql.tree.Cast) Query(com.facebook.presto.sql.tree.Query) ArrayList(java.util.ArrayList) AllColumns(com.facebook.presto.sql.tree.AllColumns) SingleColumn(com.facebook.presto.sql.tree.SingleColumn) QuerySpecification(com.facebook.presto.sql.tree.QuerySpecification) ClusterType(com.facebook.presto.verifier.framework.ClusterType) MapType(com.facebook.presto.common.type.MapType) DecimalType(com.facebook.presto.common.type.DecimalType) ArrayType(com.facebook.presto.common.type.ArrayType) Type(com.facebook.presto.common.type.Type) RowType(com.facebook.presto.common.type.RowType) SelectItem(com.facebook.presto.sql.tree.SelectItem) Select(com.facebook.presto.sql.tree.Select) CreateTableAsSelect(com.facebook.presto.sql.tree.CreateTableAsSelect)

Example 38 with Query

use of com.facebook.presto.sql.tree.Query in project presto by prestodb.

the class QueryRewriter method rewriteQuery.

public QueryObjectBundle rewriteQuery(@Language("SQL") String query, ClusterType clusterType) {
    checkState(prefixes.containsKey(clusterType), "Unsupported cluster type: %s", clusterType);
    Statement statement = sqlParser.createStatement(query, PARSING_OPTIONS);
    QualifiedName prefix = prefixes.get(clusterType);
    List<Property> properties = tableProperties.get(clusterType);
    if (statement instanceof CreateTableAsSelect) {
        CreateTableAsSelect createTableAsSelect = (CreateTableAsSelect) statement;
        QualifiedName temporaryTableName = generateTemporaryName(Optional.of(createTableAsSelect.getName()), prefix);
        return new QueryObjectBundle(temporaryTableName, ImmutableList.of(), new CreateTableAsSelect(temporaryTableName, createTableAsSelect.getQuery(), createTableAsSelect.isNotExists(), applyPropertyOverride(createTableAsSelect.getProperties(), properties), createTableAsSelect.isWithData(), createTableAsSelect.getColumnAliases(), createTableAsSelect.getComment()), ImmutableList.of(new DropTable(temporaryTableName, true)), clusterType);
    }
    if (statement instanceof Insert) {
        Insert insert = (Insert) statement;
        QualifiedName originalTableName = insert.getTarget();
        QualifiedName temporaryTableName = generateTemporaryName(Optional.of(originalTableName), prefix);
        return new QueryObjectBundle(temporaryTableName, ImmutableList.of(new CreateTable(temporaryTableName, ImmutableList.of(new LikeClause(originalTableName, Optional.of(INCLUDING))), false, properties, Optional.empty())), new Insert(temporaryTableName, insert.getColumns(), insert.getQuery()), ImmutableList.of(new DropTable(temporaryTableName, true)), clusterType);
    }
    if (statement instanceof Query) {
        QualifiedName temporaryTableName = generateTemporaryName(Optional.empty(), prefix);
        ResultSetMetaData metadata = getResultMetadata((Query) statement);
        List<Identifier> columnAliases = generateStorageColumnAliases(metadata);
        Query rewrite = rewriteNonStorableColumns((Query) statement, metadata);
        return new QueryObjectBundle(temporaryTableName, ImmutableList.of(), new CreateTableAsSelect(temporaryTableName, rewrite, false, properties, true, Optional.of(columnAliases), Optional.empty()), ImmutableList.of(new DropTable(temporaryTableName, true)), clusterType);
    }
    if (statement instanceof CreateView) {
        CreateView createView = (CreateView) statement;
        QualifiedName temporaryViewName = generateTemporaryName(Optional.empty(), prefix);
        ImmutableList.Builder<Statement> setupQueries = ImmutableList.builder();
        // Otherwise, do not pre-create temporary view.
        try {
            String createExistingViewQuery = getOnlyElement(prestoAction.execute(new ShowCreate(VIEW, createView.getName()), REWRITE, SHOW_CREATE_VIEW_CONVERTER).getResults());
            CreateView createExistingView = (CreateView) sqlParser.createStatement(createExistingViewQuery, PARSING_OPTIONS);
            setupQueries.add(new CreateView(temporaryViewName, createExistingView.getQuery(), false, createExistingView.getSecurity()));
        } catch (QueryException e) {
        // no-op
        }
        return new QueryObjectBundle(temporaryViewName, setupQueries.build(), new CreateView(temporaryViewName, createView.getQuery(), createView.isReplace(), createView.getSecurity()), ImmutableList.of(new DropView(temporaryViewName, true)), clusterType);
    }
    if (statement instanceof CreateTable) {
        CreateTable createTable = (CreateTable) statement;
        QualifiedName temporaryTableName = generateTemporaryName(Optional.empty(), prefix);
        return new QueryObjectBundle(temporaryTableName, ImmutableList.of(), new CreateTable(temporaryTableName, createTable.getElements(), createTable.isNotExists(), applyPropertyOverride(createTable.getProperties(), properties), createTable.getComment()), ImmutableList.of(new DropTable(temporaryTableName, true)), clusterType);
    }
    throw new IllegalStateException(format("Unsupported query type: %s", statement.getClass()));
}
Also used : LikeClause(com.facebook.presto.sql.tree.LikeClause) Query(com.facebook.presto.sql.tree.Query) Statement(com.facebook.presto.sql.tree.Statement) ImmutableList.toImmutableList(com.google.common.collect.ImmutableList.toImmutableList) ImmutableList(com.google.common.collect.ImmutableList) QualifiedName(com.facebook.presto.sql.tree.QualifiedName) DropView(com.facebook.presto.sql.tree.DropView) CreateTable(com.facebook.presto.sql.tree.CreateTable) DropTable(com.facebook.presto.sql.tree.DropTable) Insert(com.facebook.presto.sql.tree.Insert) CreateView(com.facebook.presto.sql.tree.CreateView) ResultSetMetaData(java.sql.ResultSetMetaData) QueryException(com.facebook.presto.verifier.framework.QueryException) Identifier(com.facebook.presto.sql.tree.Identifier) ShowCreate(com.facebook.presto.sql.tree.ShowCreate) CreateTableAsSelect(com.facebook.presto.sql.tree.CreateTableAsSelect) QueryObjectBundle(com.facebook.presto.verifier.framework.QueryObjectBundle) Property(com.facebook.presto.sql.tree.Property)

Example 39 with Query

use of com.facebook.presto.sql.tree.Query in project presto by prestodb.

the class LimitQueryDeterminismAnalyzer method analyzeInternal.

private LimitQueryDeterminismAnalysis analyzeInternal() {
    if (!enabled) {
        return NOT_RUN;
    }
    Query query;
    // A query is rewritten to either an Insert or a CreateTableAsSelect
    if (statement instanceof Insert) {
        query = ((Insert) statement).getQuery();
    } else if (statement instanceof CreateTableAsSelect) {
        query = ((CreateTableAsSelect) statement).getQuery();
    } else {
        return NOT_RUN;
    }
    // Flatten TableSubquery
    if (query.getQueryBody() instanceof TableSubquery) {
        Optional<With> with = query.getWith();
        while (query.getQueryBody() instanceof TableSubquery) {
            // ORDER BY and LIMIT must be empty according to syntax
            if (query.getOrderBy().isPresent() || query.getLimit().isPresent()) {
                return NOT_RUN;
            }
            query = ((TableSubquery) query.getQueryBody()).getQuery();
            // WITH must be empty according to syntax
            if (query.getWith().isPresent()) {
                return NOT_RUN;
            }
        }
        query = new Query(with, query.getQueryBody(), query.getOrderBy(), query.getOffset(), query.getLimit());
    }
    if (query.getQueryBody() instanceof QuerySpecification) {
        return analyzeQuerySpecification(query.getWith(), (QuerySpecification) query.getQueryBody());
    }
    return analyzeQuery(query);
}
Also used : QuerySpecification(com.facebook.presto.sql.tree.QuerySpecification) Query(com.facebook.presto.sql.tree.Query) QueryUtil.simpleQuery(com.facebook.presto.sql.QueryUtil.simpleQuery) CreateTableAsSelect(com.facebook.presto.sql.tree.CreateTableAsSelect) Insert(com.facebook.presto.sql.tree.Insert) TableSubquery(com.facebook.presto.sql.tree.TableSubquery) With(com.facebook.presto.sql.tree.With)

Example 40 with Query

use of com.facebook.presto.sql.tree.Query in project presto by prestodb.

the class DataVerification method verify.

@Override
public DataMatchResult verify(QueryObjectBundle control, QueryObjectBundle test, Optional<QueryResult<Void>> controlQueryResult, Optional<QueryResult<Void>> testQueryResult, ChecksumQueryContext controlChecksumQueryContext, ChecksumQueryContext testChecksumQueryContext) {
    List<Column> controlColumns = getColumns(getHelperAction(), typeManager, control.getObjectName());
    List<Column> testColumns = getColumns(getHelperAction(), typeManager, test.getObjectName());
    Query controlChecksumQuery = checksumValidator.generateChecksumQuery(control.getObjectName(), controlColumns);
    Query testChecksumQuery = checksumValidator.generateChecksumQuery(test.getObjectName(), testColumns);
    controlChecksumQueryContext.setChecksumQuery(formatSql(controlChecksumQuery));
    testChecksumQueryContext.setChecksumQuery(formatSql(testChecksumQuery));
    QueryResult<ChecksumResult> controlChecksum = callAndConsume(() -> getHelperAction().execute(controlChecksumQuery, CONTROL_CHECKSUM, ChecksumResult::fromResultSet), stats -> stats.getQueryStats().map(QueryStats::getQueryId).ifPresent(controlChecksumQueryContext::setChecksumQueryId));
    QueryResult<ChecksumResult> testChecksum = callAndConsume(() -> getHelperAction().execute(testChecksumQuery, TEST_CHECKSUM, ChecksumResult::fromResultSet), stats -> stats.getQueryStats().map(QueryStats::getQueryId).ifPresent(testChecksumQueryContext::setChecksumQueryId));
    return match(checksumValidator, controlColumns, testColumns, getOnlyElement(controlChecksum.getResults()), getOnlyElement(testChecksum.getResults()));
}
Also used : ChecksumResult(com.facebook.presto.verifier.checksum.ChecksumResult) Query(com.facebook.presto.sql.tree.Query) QueryStats(com.facebook.presto.jdbc.QueryStats)

Aggregations

Query (com.facebook.presto.sql.tree.Query)40 QueryUtil.simpleQuery (com.facebook.presto.sql.QueryUtil.simpleQuery)21 WithQuery (com.facebook.presto.sql.tree.WithQuery)18 Test (org.testng.annotations.Test)18 QuerySpecification (com.facebook.presto.sql.tree.QuerySpecification)17 AllColumns (com.facebook.presto.sql.tree.AllColumns)16 Identifier (com.facebook.presto.sql.tree.Identifier)13 LongLiteral (com.facebook.presto.sql.tree.LongLiteral)12 Table (com.facebook.presto.sql.tree.Table)12 CreateTableAsSelect (com.facebook.presto.sql.tree.CreateTableAsSelect)9 FunctionCall (com.facebook.presto.sql.tree.FunctionCall)8 OrderBy (com.facebook.presto.sql.tree.OrderBy)8 StringLiteral (com.facebook.presto.sql.tree.StringLiteral)8 QueryUtil.quotedIdentifier (com.facebook.presto.sql.QueryUtil.quotedIdentifier)7 CreateTable (com.facebook.presto.sql.tree.CreateTable)7 DropTable (com.facebook.presto.sql.tree.DropTable)7 QualifiedName (com.facebook.presto.sql.tree.QualifiedName)7 RenameTable (com.facebook.presto.sql.tree.RenameTable)6 QualifiedObjectName (com.facebook.presto.common.QualifiedObjectName)5 Expression (com.facebook.presto.sql.tree.Expression)5