Search in sources :

Example 1 with SqlSampleSpec

use of org.apache.calcite.sql.SqlSampleSpec in project flink by apache.

the class SqlValidatorImpl method validateQuery.

public void validateQuery(SqlNode node, SqlValidatorScope scope, RelDataType targetRowType) {
    final SqlValidatorNamespace ns = getNamespace(node, scope);
    if (node.getKind() == SqlKind.TABLESAMPLE) {
        List<SqlNode> operands = ((SqlCall) node).getOperandList();
        SqlSampleSpec sampleSpec = SqlLiteral.sampleValue(operands.get(1));
        if (sampleSpec instanceof SqlSampleSpec.SqlTableSampleSpec) {
            validateFeature(RESOURCE.sQLFeature_T613(), node.getParserPosition());
        } else if (sampleSpec instanceof SqlSampleSpec.SqlSubstitutionSampleSpec) {
            validateFeature(RESOURCE.sQLFeatureExt_T613_Substitution(), node.getParserPosition());
        }
    }
    validateNamespace(ns, targetRowType);
    switch(node.getKind()) {
        case EXTEND:
            // Until we have a dedicated namespace for EXTEND
            deriveType(scope, node);
    }
    if (node == top) {
        validateModality(node);
    }
    validateAccess(node, ns.getTable(), SqlAccessEnum.SELECT);
    validateSnapshot(node, scope, ns);
}
Also used : SqlCall(org.apache.calcite.sql.SqlCall) SqlSampleSpec(org.apache.calcite.sql.SqlSampleSpec) SqlNode(org.apache.calcite.sql.SqlNode)

Example 2 with SqlSampleSpec

use of org.apache.calcite.sql.SqlSampleSpec in project calcite by apache.

the class SqlToRelConverter method convertFrom.

/**
 * Converts a FROM clause into a relational expression.
 *
 * @param bb   Scope within which to resolve identifiers
 * @param from FROM clause of a query. Examples include:
 *
 *             <ul>
 *             <li>a single table ("SALES.EMP"),
 *             <li>an aliased table ("EMP AS E"),
 *             <li>a list of tables ("EMP, DEPT"),
 *             <li>an ANSI Join expression ("EMP JOIN DEPT ON EMP.DEPTNO =
 *             DEPT.DEPTNO"),
 *             <li>a VALUES clause ("VALUES ('Fred', 20)"),
 *             <li>a query ("(SELECT * FROM EMP WHERE GENDER = 'F')"),
 *             <li>or any combination of the above.
 *             </ul>
 */
protected void convertFrom(Blackboard bb, SqlNode from) {
    if (from == null) {
        bb.setRoot(LogicalValues.createOneRow(cluster), false);
        return;
    }
    final SqlCall call;
    final SqlNode[] operands;
    switch(from.getKind()) {
        case MATCH_RECOGNIZE:
            convertMatchRecognize(bb, (SqlCall) from);
            return;
        case AS:
            call = (SqlCall) from;
            convertFrom(bb, call.operand(0));
            if (call.operandCount() > 2 && bb.root instanceof Values) {
                final List<String> fieldNames = new ArrayList<>();
                for (SqlNode node : Util.skip(call.getOperandList(), 2)) {
                    fieldNames.add(((SqlIdentifier) node).getSimple());
                }
                bb.setRoot(relBuilder.push(bb.root).rename(fieldNames).build(), true);
            }
            return;
        case WITH_ITEM:
            convertFrom(bb, ((SqlWithItem) from).query);
            return;
        case WITH:
            convertFrom(bb, ((SqlWith) from).body);
            return;
        case TABLESAMPLE:
            operands = ((SqlBasicCall) from).getOperands();
            SqlSampleSpec sampleSpec = SqlLiteral.sampleValue(operands[1]);
            if (sampleSpec instanceof SqlSampleSpec.SqlSubstitutionSampleSpec) {
                String sampleName = ((SqlSampleSpec.SqlSubstitutionSampleSpec) sampleSpec).getName();
                datasetStack.push(sampleName);
                convertFrom(bb, operands[0]);
                datasetStack.pop();
            } else if (sampleSpec instanceof SqlSampleSpec.SqlTableSampleSpec) {
                SqlSampleSpec.SqlTableSampleSpec tableSampleSpec = (SqlSampleSpec.SqlTableSampleSpec) sampleSpec;
                convertFrom(bb, operands[0]);
                RelOptSamplingParameters params = new RelOptSamplingParameters(tableSampleSpec.isBernoulli(), tableSampleSpec.getSamplePercentage(), tableSampleSpec.isRepeatable(), tableSampleSpec.getRepeatableSeed());
                bb.setRoot(new Sample(cluster, bb.root, params), false);
            } else {
                throw new AssertionError("unknown TABLESAMPLE type: " + sampleSpec);
            }
            return;
        case IDENTIFIER:
            convertIdentifier(bb, (SqlIdentifier) from, null);
            return;
        case EXTEND:
            call = (SqlCall) from;
            SqlIdentifier id = (SqlIdentifier) call.getOperandList().get(0);
            SqlNodeList extendedColumns = (SqlNodeList) call.getOperandList().get(1);
            convertIdentifier(bb, id, extendedColumns);
            return;
        case JOIN:
            final SqlJoin join = (SqlJoin) from;
            final SqlValidatorScope scope = validator.getJoinScope(from);
            final Blackboard fromBlackboard = createBlackboard(scope, null, false);
            SqlNode left = join.getLeft();
            SqlNode right = join.getRight();
            final boolean isNatural = join.isNatural();
            final JoinType joinType = join.getJoinType();
            final SqlValidatorScope leftScope = Util.first(validator.getJoinScope(left), ((DelegatingScope) bb.scope).getParent());
            final Blackboard leftBlackboard = createBlackboard(leftScope, null, false);
            final SqlValidatorScope rightScope = Util.first(validator.getJoinScope(right), ((DelegatingScope) bb.scope).getParent());
            final Blackboard rightBlackboard = createBlackboard(rightScope, null, false);
            convertFrom(leftBlackboard, left);
            RelNode leftRel = leftBlackboard.root;
            convertFrom(rightBlackboard, right);
            RelNode rightRel = rightBlackboard.root;
            JoinRelType convertedJoinType = convertJoinType(joinType);
            RexNode conditionExp;
            final SqlValidatorNamespace leftNamespace = validator.getNamespace(left);
            final SqlValidatorNamespace rightNamespace = validator.getNamespace(right);
            if (isNatural) {
                final RelDataType leftRowType = leftNamespace.getRowType();
                final RelDataType rightRowType = rightNamespace.getRowType();
                final List<String> columnList = SqlValidatorUtil.deriveNaturalJoinColumnList(leftRowType, rightRowType);
                conditionExp = convertUsing(leftNamespace, rightNamespace, columnList);
            } else {
                conditionExp = convertJoinCondition(fromBlackboard, leftNamespace, rightNamespace, join.getCondition(), join.getConditionType(), leftRel, rightRel);
            }
            final RelNode joinRel = createJoin(fromBlackboard, leftRel, rightRel, conditionExp, convertedJoinType);
            bb.setRoot(joinRel, false);
            return;
        case SELECT:
        case INTERSECT:
        case EXCEPT:
        case UNION:
            final RelNode rel = convertQueryRecursive(from, false, null).project();
            bb.setRoot(rel, true);
            return;
        case VALUES:
            convertValuesImpl(bb, (SqlCall) from, null);
            return;
        case UNNEST:
            call = (SqlCall) from;
            final List<SqlNode> nodes = call.getOperandList();
            final SqlUnnestOperator operator = (SqlUnnestOperator) call.getOperator();
            for (SqlNode node : nodes) {
                replaceSubQueries(bb, node, RelOptUtil.Logic.TRUE_FALSE_UNKNOWN);
            }
            final List<RexNode> exprs = new ArrayList<>();
            final List<String> fieldNames = new ArrayList<>();
            for (Ord<SqlNode> node : Ord.zip(nodes)) {
                exprs.add(bb.convertExpression(node.e));
                fieldNames.add(validator.deriveAlias(node.e, node.i));
            }
            RelNode child = (null != bb.root) ? bb.root : LogicalValues.createOneRow(cluster);
            relBuilder.push(child).projectNamed(exprs, fieldNames, false);
            Uncollect uncollect = new Uncollect(cluster, cluster.traitSetOf(Convention.NONE), relBuilder.build(), operator.withOrdinality);
            bb.setRoot(uncollect, true);
            return;
        case COLLECTION_TABLE:
            call = (SqlCall) from;
            // Dig out real call; TABLE() wrapper is just syntactic.
            assert call.getOperandList().size() == 1;
            final SqlCall call2 = call.operand(0);
            convertCollectionTable(bb, call2);
            return;
        default:
            throw new AssertionError("not a join operator " + from);
    }
}
Also used : SqlValidatorScope(org.apache.calcite.sql.validate.SqlValidatorScope) Uncollect(org.apache.calcite.rel.core.Uncollect) Values(org.apache.calcite.rel.core.Values) LogicalValues(org.apache.calcite.rel.logical.LogicalValues) ArrayList(java.util.ArrayList) SqlUnnestOperator(org.apache.calcite.sql.SqlUnnestOperator) RelDataType(org.apache.calcite.rel.type.RelDataType) NlsString(org.apache.calcite.util.NlsString) SqlIdentifier(org.apache.calcite.sql.SqlIdentifier) RelOptSamplingParameters(org.apache.calcite.plan.RelOptSamplingParameters) SqlNode(org.apache.calcite.sql.SqlNode) SqlCall(org.apache.calcite.sql.SqlCall) Sample(org.apache.calcite.rel.core.Sample) SqlSampleSpec(org.apache.calcite.sql.SqlSampleSpec) JoinType(org.apache.calcite.sql.JoinType) SemiJoinType(org.apache.calcite.sql.SemiJoinType) JoinRelType(org.apache.calcite.rel.core.JoinRelType) RelNode(org.apache.calcite.rel.RelNode) SqlJoin(org.apache.calcite.sql.SqlJoin) SqlNodeList(org.apache.calcite.sql.SqlNodeList) SqlValidatorNamespace(org.apache.calcite.sql.validate.SqlValidatorNamespace) RexNode(org.apache.calcite.rex.RexNode)

Example 3 with SqlSampleSpec

use of org.apache.calcite.sql.SqlSampleSpec in project calcite by apache.

the class SqlValidatorImpl method validateQuery.

public void validateQuery(SqlNode node, SqlValidatorScope scope, RelDataType targetRowType) {
    final SqlValidatorNamespace ns = getNamespace(node, scope);
    if (node.getKind() == SqlKind.TABLESAMPLE) {
        List<SqlNode> operands = ((SqlCall) node).getOperandList();
        SqlSampleSpec sampleSpec = SqlLiteral.sampleValue(operands.get(1));
        if (sampleSpec instanceof SqlSampleSpec.SqlTableSampleSpec) {
            validateFeature(RESOURCE.sQLFeature_T613(), node.getParserPosition());
        } else if (sampleSpec instanceof SqlSampleSpec.SqlSubstitutionSampleSpec) {
            validateFeature(RESOURCE.sQLFeatureExt_T613_Substitution(), node.getParserPosition());
        }
    }
    validateNamespace(ns, targetRowType);
    if (node == top) {
        validateModality(node);
    }
    validateAccess(node, ns.getTable(), SqlAccessEnum.SELECT);
}
Also used : SqlCall(org.apache.calcite.sql.SqlCall) SqlSampleSpec(org.apache.calcite.sql.SqlSampleSpec) SqlNode(org.apache.calcite.sql.SqlNode)

Aggregations

SqlCall (org.apache.calcite.sql.SqlCall)3 SqlNode (org.apache.calcite.sql.SqlNode)3 SqlSampleSpec (org.apache.calcite.sql.SqlSampleSpec)3 ArrayList (java.util.ArrayList)1 RelOptSamplingParameters (org.apache.calcite.plan.RelOptSamplingParameters)1 RelNode (org.apache.calcite.rel.RelNode)1 JoinRelType (org.apache.calcite.rel.core.JoinRelType)1 Sample (org.apache.calcite.rel.core.Sample)1 Uncollect (org.apache.calcite.rel.core.Uncollect)1 Values (org.apache.calcite.rel.core.Values)1 LogicalValues (org.apache.calcite.rel.logical.LogicalValues)1 RelDataType (org.apache.calcite.rel.type.RelDataType)1 RexNode (org.apache.calcite.rex.RexNode)1 JoinType (org.apache.calcite.sql.JoinType)1 SemiJoinType (org.apache.calcite.sql.SemiJoinType)1 SqlIdentifier (org.apache.calcite.sql.SqlIdentifier)1 SqlJoin (org.apache.calcite.sql.SqlJoin)1 SqlNodeList (org.apache.calcite.sql.SqlNodeList)1 SqlUnnestOperator (org.apache.calcite.sql.SqlUnnestOperator)1 SqlValidatorNamespace (org.apache.calcite.sql.validate.SqlValidatorNamespace)1