Search in sources :

Example 16 with SqlValidator

use of org.apache.calcite.sql.validate.SqlValidator in project druid by druid-io.

the class DruidPlanner method validate.

/**
 * Validates a SQL query and populates {@link PlannerContext#getResourceActions()}.
 *
 * @return set of {@link Resource} corresponding to any Druid datasources or views which are taking part in the query.
 */
public ValidationResult validate() throws SqlParseException, ValidationException {
    resetPlanner();
    final ParsedNodes parsed = ParsedNodes.create(planner.parse(plannerContext.getSql()));
    final SqlValidator validator = getValidator();
    final SqlNode validatedQueryNode;
    try {
        validatedQueryNode = validator.validate(rewriteDynamicParameters(parsed.getQueryNode()));
    } catch (RuntimeException e) {
        throw new ValidationException(e);
    }
    SqlResourceCollectorShuttle resourceCollectorShuttle = new SqlResourceCollectorShuttle(validator, plannerContext);
    validatedQueryNode.accept(resourceCollectorShuttle);
    final Set<ResourceAction> resourceActions = new HashSet<>(resourceCollectorShuttle.getResourceActions());
    if (parsed.getInsertNode() != null) {
        final String targetDataSource = validateAndGetDataSourceForInsert(parsed.getInsertNode());
        resourceActions.add(new ResourceAction(new Resource(targetDataSource, ResourceType.DATASOURCE), Action.WRITE));
    }
    plannerContext.setResourceActions(resourceActions);
    return new ValidationResult(resourceActions);
}
Also used : ValidationException(org.apache.calcite.tools.ValidationException) SqlValidator(org.apache.calcite.sql.validate.SqlValidator) Resource(org.apache.druid.server.security.Resource) SqlNode(org.apache.calcite.sql.SqlNode) ResourceAction(org.apache.druid.server.security.ResourceAction) HashSet(java.util.HashSet)

Example 17 with SqlValidator

use of org.apache.calcite.sql.validate.SqlValidator in project druid by druid-io.

the class DruidPlanner method prepare.

/**
 * Prepare an SQL query for execution, including some initial parsing and validation and any dynamic parameter type
 * resolution, to support prepared statements via JDBC.
 *
 * In some future this could perhaps re-use some of the work done by {@link #validate()}
 * instead of repeating it, but that day is not today.
 */
public PrepareResult prepare() throws SqlParseException, ValidationException, RelConversionException {
    resetPlanner();
    final ParsedNodes parsed = ParsedNodes.create(planner.parse(plannerContext.getSql()));
    final SqlNode validatedQueryNode = planner.validate(parsed.getQueryNode());
    final RelRoot rootQueryRel = planner.rel(validatedQueryNode);
    final SqlValidator validator = getValidator();
    final RelDataTypeFactory typeFactory = rootQueryRel.rel.getCluster().getTypeFactory();
    final RelDataType parameterTypes = validator.getParameterRowType(validator.validate(validatedQueryNode));
    final RelDataType returnedRowType;
    if (parsed.getExplainNode() != null) {
        returnedRowType = getExplainStructType(typeFactory);
    } else {
        returnedRowType = buildQueryMaker(rootQueryRel, parsed.getInsertNode()).getResultType();
    }
    return new PrepareResult(returnedRowType, parameterTypes);
}
Also used : SqlValidator(org.apache.calcite.sql.validate.SqlValidator) RelDataTypeFactory(org.apache.calcite.rel.type.RelDataTypeFactory) RelRoot(org.apache.calcite.rel.RelRoot) RelDataType(org.apache.calcite.rel.type.RelDataType) SqlNode(org.apache.calcite.sql.SqlNode)

Example 18 with SqlValidator

use of org.apache.calcite.sql.validate.SqlValidator in project hazelcast by hazelcast.

the class HazelcastCallBinding method newValidationSignatureError.

@Override
public CalciteException newValidationSignatureError() {
    SqlOperator operator = getOperator();
    SqlValidator validator = getValidator();
    SqlCall call = getCall();
    String operandTypes = getOperandTypes(validator, call, getScope());
    Resources.ExInst<SqlValidatorException> error;
    String operatorName = '\'' + operator.getName() + '\'';
    switch(operator.getSyntax()) {
        case FUNCTION:
        case FUNCTION_STAR:
        case FUNCTION_ID:
            error = RESOURCES.invalidFunctionOperands(operatorName, operandTypes);
            break;
        default:
            error = RESOURCES.invalidOperatorOperands(operatorName, operandTypes);
    }
    return validator.newValidationError(call, error);
}
Also used : SqlOperator(org.apache.calcite.sql.SqlOperator) SqlCall(org.apache.calcite.sql.SqlCall) SqlValidator(org.apache.calcite.sql.validate.SqlValidator) Resources(org.apache.calcite.runtime.Resources) SqlValidatorException(org.apache.calcite.sql.validate.SqlValidatorException)

Example 19 with SqlValidator

use of org.apache.calcite.sql.validate.SqlValidator in project calcite by apache.

the class SqlTesterImpl method checkFails.

public void checkFails(String expression, String expectedError, boolean runtime) {
    if (runtime) {
        // We need to test that the expression fails at runtime.
        // Ironically, that means that it must succeed at prepare time.
        SqlValidator validator = getValidator();
        final String sql = buildQuery(expression);
        SqlNode n = parseAndValidate(validator, sql);
        assertNotNull(n);
    } else {
        checkQueryFails(buildQuery(expression), expectedError);
    }
}
Also used : SqlValidator(org.apache.calcite.sql.validate.SqlValidator) SqlNode(org.apache.calcite.sql.SqlNode)

Example 20 with SqlValidator

use of org.apache.calcite.sql.validate.SqlValidator in project calcite by apache.

the class SqlTesterImpl method assertExceptionIsThrown.

public void assertExceptionIsThrown(String sql, String expectedMsgPattern) {
    SqlValidator validator;
    SqlNode sqlNode;
    SqlParserUtil.StringAndPos sap = SqlParserUtil.findPos(sql);
    try {
        sqlNode = parseQuery(sap.sql);
        validator = getValidator();
    } catch (SqlParseException e) {
        String errMessage = e.getMessage();
        if (expectedMsgPattern == null) {
            throw new RuntimeException("Error while parsing query:" + sap.sql, e);
        } else if (errMessage == null || !errMessage.matches(expectedMsgPattern)) {
            throw new RuntimeException("Error did not match expected [" + expectedMsgPattern + "] while parsing query [" + sap.sql + "]", e);
        }
        return;
    } catch (Throwable e) {
        throw new RuntimeException("Error while parsing query: " + sap.sql, e);
    }
    Throwable thrown = null;
    try {
        validator.validate(sqlNode);
    } catch (Throwable ex) {
        thrown = ex;
    }
    SqlValidatorTestCase.checkEx(thrown, expectedMsgPattern, sap);
}
Also used : SqlParserUtil(org.apache.calcite.sql.parser.SqlParserUtil) SqlParseException(org.apache.calcite.sql.parser.SqlParseException) SqlValidator(org.apache.calcite.sql.validate.SqlValidator) SqlNode(org.apache.calcite.sql.SqlNode)

Aggregations

SqlValidator (org.apache.calcite.sql.validate.SqlValidator)31 SqlNode (org.apache.calcite.sql.SqlNode)17 Test (org.junit.Test)11 RelDataType (org.apache.calcite.rel.type.RelDataType)8 RelDataTypeField (org.apache.calcite.rel.type.RelDataTypeField)4 SqlValidatorScope (org.apache.calcite.sql.validate.SqlValidatorScope)4 ImmutableList (com.google.common.collect.ImmutableList)3 ArrayList (java.util.ArrayList)3 List (java.util.List)3 RelDataTypeFactory (org.apache.calcite.rel.type.RelDataTypeFactory)3 SqlCall (org.apache.calcite.sql.SqlCall)3 SqlParseException (org.apache.calcite.sql.parser.SqlParseException)3 JavaTypeFactory (org.apache.calcite.adapter.java.JavaTypeFactory)2 RelRoot (org.apache.calcite.rel.RelRoot)2 SqlIdentifier (org.apache.calcite.sql.SqlIdentifier)2 SqlIntervalLiteral (org.apache.calcite.sql.SqlIntervalLiteral)2 SqlSelect (org.apache.calcite.sql.SqlSelect)2 SqlParser (org.apache.calcite.sql.parser.SqlParser)2 RESOURCE (com.hazelcast.jet.sql.impl.parse.ParserResource.RESOURCE)1 HazelcastTable (com.hazelcast.jet.sql.impl.schema.HazelcastTable)1