Search in sources :

Example 1 with QueryBody

use of io.prestosql.sql.tree.QueryBody in project hetu-core by openlookeng.

the class AstBuilder method visitQueryNoWith.

@Override
public Node visitQueryNoWith(SqlBaseParser.QueryNoWithContext context) {
    QueryBody term = (QueryBody) visit(context.queryTerm());
    Optional<OrderBy> orderBy = Optional.empty();
    if (context.ORDER() != null) {
        orderBy = Optional.of(new OrderBy(getLocation(context.ORDER()), visit(context.sortItem(), SortItem.class)));
    }
    Optional<Node> limit = Optional.empty();
    if (context.FETCH() != null) {
        limit = Optional.of(new FetchFirst(Optional.of(getLocation(context.FETCH())), getTextIfPresent(context.fetchFirst), context.TIES() != null));
    } else if (context.LIMIT() != null) {
        limit = Optional.of(new Limit(Optional.of(getLocation(context.LIMIT())), getTextIfPresent(context.limit).orElseThrow(() -> new IllegalStateException("Missing LIMIT value"))));
    }
    Optional<Offset> offset = Optional.empty();
    if (context.OFFSET() != null) {
        offset = Optional.of(new Offset(Optional.of(getLocation(context.OFFSET())), getTextIfPresent(context.offset).orElseThrow(() -> new IllegalStateException("Missing OFFSET row count"))));
    }
    if (term instanceof QuerySpecification) {
        // When we have a simple query specification
        // followed by order by, offset, limit or fetch,
        // fold the order by, limit, offset or fetch clauses
        // into the query specification (analyzer/planner
        // expects this structure to resolve references with respect
        // to columns defined in the query specification)
        QuerySpecification query = (QuerySpecification) term;
        return new Query(getLocation(context), Optional.empty(), new QuerySpecification(getLocation(context), query.getSelect(), query.getFrom(), query.getWhere(), query.getGroupBy(), query.getHaving(), orderBy, offset, limit), Optional.empty(), Optional.empty(), Optional.empty());
    }
    return new Query(getLocation(context), Optional.empty(), term, orderBy, offset, limit);
}
Also used : OrderBy(io.prestosql.sql.tree.OrderBy) Query(io.prestosql.sql.tree.Query) WithQuery(io.prestosql.sql.tree.WithQuery) Node(io.prestosql.sql.tree.Node) TerminalNode(org.antlr.v4.runtime.tree.TerminalNode) Offset(io.prestosql.sql.tree.Offset) QuerySpecification(io.prestosql.sql.tree.QuerySpecification) SortItem(io.prestosql.sql.tree.SortItem) Limit(io.prestosql.sql.tree.Limit) QueryBody(io.prestosql.sql.tree.QueryBody) FetchFirst(io.prestosql.sql.tree.FetchFirst)

Example 2 with QueryBody

use of io.prestosql.sql.tree.QueryBody in project hetu-core by openlookeng.

the class AstBuilder method visitSetOperation.

@Override
public Node visitSetOperation(SqlBaseParser.SetOperationContext context) {
    QueryBody left = (QueryBody) visit(context.left);
    QueryBody right = (QueryBody) visit(context.right);
    boolean distinct = context.setQuantifier() == null || context.setQuantifier().DISTINCT() != null;
    switch(context.operator.getType()) {
        case SqlBaseLexer.UNION:
            return new Union(getLocation(context.UNION()), ImmutableList.of(left, right), distinct);
        case SqlBaseLexer.INTERSECT:
            return new Intersect(getLocation(context.INTERSECT()), ImmutableList.of(left, right), distinct);
        case SqlBaseLexer.EXCEPT:
            return new Except(getLocation(context.EXCEPT()), left, right, distinct);
    }
    throw new IllegalArgumentException("Unsupported set operation: " + context.operator.getText());
}
Also used : Intersect(io.prestosql.sql.tree.Intersect) QueryBody(io.prestosql.sql.tree.QueryBody) Union(io.prestosql.sql.tree.Union) Except(io.prestosql.sql.tree.Except)

Example 3 with QueryBody

use of io.prestosql.sql.tree.QueryBody in project hetu-core by openlookeng.

the class QueryRewriter method getColumns.

private List<Column> getColumns(Connection connection, CreateTableAsSelect createTableAsSelect) throws SQLException {
    io.prestosql.sql.tree.Query createSelectClause = createTableAsSelect.getQuery();
    // Rewrite the query to select zero rows, so that we can get the column names and types
    QueryBody innerQuery = createSelectClause.getQueryBody();
    io.prestosql.sql.tree.Query zeroRowsQuery;
    if (innerQuery instanceof QuerySpecification) {
        QuerySpecification querySpecification = (QuerySpecification) innerQuery;
        innerQuery = new QuerySpecification(querySpecification.getSelect(), querySpecification.getFrom(), querySpecification.getWhere(), querySpecification.getGroupBy(), querySpecification.getHaving(), querySpecification.getOrderBy(), querySpecification.getOffset(), Optional.of(new Limit("0")));
        zeroRowsQuery = new io.prestosql.sql.tree.Query(createSelectClause.getWith(), innerQuery, Optional.empty(), Optional.empty(), Optional.empty());
    } else {
        zeroRowsQuery = new io.prestosql.sql.tree.Query(createSelectClause.getWith(), innerQuery, Optional.empty(), Optional.empty(), Optional.of(new Limit("0")));
    }
    ImmutableList.Builder<Column> columns = ImmutableList.builder();
    try (java.sql.Statement jdbcStatement = connection.createStatement()) {
        ExecutorService executor = newSingleThreadExecutor();
        TimeLimiter limiter = SimpleTimeLimiter.create(executor);
        java.sql.Statement limitedStatement = limiter.newProxy(jdbcStatement, java.sql.Statement.class, timeout.toMillis(), TimeUnit.MILLISECONDS);
        try (ResultSet resultSet = limitedStatement.executeQuery(formatSql(zeroRowsQuery, Optional.empty()))) {
            ResultSetMetaData metaData = resultSet.getMetaData();
            for (int i = 1; i <= metaData.getColumnCount(); i++) {
                String name = metaData.getColumnName(i);
                int type = metaData.getColumnType(i);
                columns.add(new Column(name, APPROXIMATE_TYPES.contains(type)));
            }
        } catch (UncheckedTimeoutException e) {
            throw new SQLException("SQL statement execution timed out", e);
        } finally {
            executor.shutdownNow();
        }
    }
    return columns.build();
}
Also used : SimpleTimeLimiter(com.google.common.util.concurrent.SimpleTimeLimiter) TimeLimiter(com.google.common.util.concurrent.TimeLimiter) SQLException(java.sql.SQLException) ImmutableList(com.google.common.collect.ImmutableList) UncheckedTimeoutException(com.google.common.util.concurrent.UncheckedTimeoutException) ResultSetMetaData(java.sql.ResultSetMetaData) QuerySpecification(io.prestosql.sql.tree.QuerySpecification) SingleColumn(io.prestosql.sql.tree.SingleColumn) ExecutorService(java.util.concurrent.ExecutorService) ResultSet(java.sql.ResultSet) Limit(io.prestosql.sql.tree.Limit) QueryBody(io.prestosql.sql.tree.QueryBody)

Example 4 with QueryBody

use of io.prestosql.sql.tree.QueryBody in project hetu-core by openlookeng.

the class HiveAstBuilder method visitSetOperation.

@Override
public Node visitSetOperation(HiveSqlParser.SetOperationContext context) {
    QueryBody left = (QueryBody) visit(context.left);
    QueryBody right = (QueryBody) visit(context.right);
    boolean distinct = context.setQuantifier() == null || context.setQuantifier().DISTINCT() != null;
    switch(context.operator.getType()) {
        case HiveSqlLexer.UNION:
            return new Union(getLocation(context.UNION()), ImmutableList.of(left, right), distinct);
        case HiveSqlLexer.INTERSECT:
            return new Intersect(getLocation(context.INTERSECT()), ImmutableList.of(left, right), distinct);
        case HiveSqlLexer.EXCEPT:
            return new Except(getLocation(context.EXCEPT()), left, right, distinct);
    }
    throw new IllegalArgumentException("Unsupported set operation: " + context.operator.getText());
}
Also used : Intersect(io.prestosql.sql.tree.Intersect) QueryBody(io.prestosql.sql.tree.QueryBody) Union(io.prestosql.sql.tree.Union) Except(io.prestosql.sql.tree.Except)

Example 5 with QueryBody

use of io.prestosql.sql.tree.QueryBody in project hetu-core by openlookeng.

the class ImpalaAstBuilder method visitSetOperation.

@Override
public Node visitSetOperation(ImpalaSqlParser.SetOperationContext context) {
    QueryBody left = (QueryBody) visit(context.left);
    QueryBody right = (QueryBody) visit(context.right);
    boolean distinct = context.setQuantifier() == null || context.setQuantifier().DISTINCT() != null;
    switch(context.operator.getType()) {
        case ImpalaSqlLexer.UNION:
            return new Union(getLocation(context.UNION()), ImmutableList.of(left, right), distinct);
        case ImpalaSqlLexer.INTERSECT:
            return new Intersect(getLocation(context.INTERSECT()), ImmutableList.of(left, right), distinct);
        case ImpalaSqlLexer.EXCEPT:
            return new Except(getLocation(context.EXCEPT()), left, right, distinct);
    }
    throw new IllegalArgumentException("Unsupported set operation: " + context.operator.getText());
}
Also used : Intersect(io.prestosql.sql.tree.Intersect) QueryBody(io.prestosql.sql.tree.QueryBody) Union(io.prestosql.sql.tree.Union) Except(io.prestosql.sql.tree.Except)

Aggregations

QueryBody (io.prestosql.sql.tree.QueryBody)7 Limit (io.prestosql.sql.tree.Limit)4 QuerySpecification (io.prestosql.sql.tree.QuerySpecification)4 Except (io.prestosql.sql.tree.Except)3 Intersect (io.prestosql.sql.tree.Intersect)3 Node (io.prestosql.sql.tree.Node)3 Offset (io.prestosql.sql.tree.Offset)3 OrderBy (io.prestosql.sql.tree.OrderBy)3 Query (io.prestosql.sql.tree.Query)3 SortItem (io.prestosql.sql.tree.SortItem)3 Union (io.prestosql.sql.tree.Union)3 WithQuery (io.prestosql.sql.tree.WithQuery)3 TerminalNode (org.antlr.v4.runtime.tree.TerminalNode)3 ImmutableList (com.google.common.collect.ImmutableList)1 SimpleTimeLimiter (com.google.common.util.concurrent.SimpleTimeLimiter)1 TimeLimiter (com.google.common.util.concurrent.TimeLimiter)1 UncheckedTimeoutException (com.google.common.util.concurrent.UncheckedTimeoutException)1 FetchFirst (io.prestosql.sql.tree.FetchFirst)1 SingleColumn (io.prestosql.sql.tree.SingleColumn)1 ResultSet (java.sql.ResultSet)1