@Value.Enclosing
public interface SqlValidator
To create an instance of the default validator implementation, call
SqlValidatorUtil.newValidator(org.apache.calcite.sql.SqlOperatorTable, org.apache.calcite.sql.validate.SqlValidatorCatalogReader, org.apache.calcite.rel.type.RelDataTypeFactory, org.apache.calcite.sql.validate.SqlValidator.Config).
The validator interface is an instance of the
visitor pattern.
Implementations
of the SqlNode.validate(org.apache.calcite.sql.validate.SqlValidator, org.apache.calcite.sql.validate.SqlValidatorScope) method call the validateXxx
method appropriate to the kind of node:
SqlLiteral.validate(SqlValidator, SqlValidatorScope)
calls
validateLiteral(org.apache.calcite.sql.SqlLiteral);
SqlCall.validate(SqlValidator, SqlValidatorScope)
calls
validateCall(SqlCall, SqlValidatorScope);
The SqlNode.validateExpr(SqlValidator, SqlValidatorScope) method
is as SqlNode.validate(SqlValidator, SqlValidatorScope) but is called
when the node is known to be a scalar expression.
In order to resolve names to objects, the validator builds a map of the
structure of the query. This map consists of two types of objects. A
SqlValidatorScope describes the tables and columns accessible at a
particular point in the query; and a SqlValidatorNamespace is a
description of a data source used in a query.
There are different kinds of namespace for different parts of the query.
for example IdentifierNamespace for table names,
SelectNamespace for SELECT queries,
SetopNamespace for UNION, EXCEPT
and INTERSECT. A validator is allowed to wrap namespaces in other objects
which implement SqlValidatorNamespace, so don't try to cast your
namespace or use instanceof; use
SqlValidatorNamespace.unwrap(Class) and
SqlValidatorNamespace.isWrapperFor(Class) instead.
The validator builds the map by making a quick scan over the query when
the root SqlNode is first provided. Thereafter, it supplies the
correct scope or namespace object when it calls validation methods.
The methods getSelectScope(org.apache.calcite.sql.SqlSelect), getFromScope(org.apache.calcite.sql.SqlSelect),
getWhereScope(org.apache.calcite.sql.SqlSelect), getGroupScope(org.apache.calcite.sql.SqlSelect), getHavingScope(org.apache.calcite.sql.SqlSelect),
getOrderScope(org.apache.calcite.sql.SqlSelect) and getJoinScope(org.apache.calcite.sql.SqlNode) get the correct scope
to resolve
names in a particular clause of a SQL statement.
| Modifier and Type | Interface and Description |
|---|---|
static interface |
SqlValidator.Config
Interface to define the configuration for a SqlValidator.
|
| Modifier and Type | Method and Description |
|---|---|
SqlValidator.Config |
config()
Returns the config of the validator.
|
void |
declareCursor(SqlSelect select,
SqlValidatorScope scope)
Declares a SELECT expression as a cursor.
|
@Nullable String |
deriveAlias(SqlNode node,
int ordinal)
Derives an alias for an expression.
|
RelDataType |
deriveConstructorType(SqlValidatorScope scope,
SqlCall call,
SqlFunction unresolvedConstructor,
@Nullable SqlFunction resolvedConstructor,
List<RelDataType> argTypes)
Derives the type of a constructor.
|
RelDataType |
deriveType(SqlValidatorScope scope,
SqlNode operand)
Derives the type of a node in a given scope.
|
SqlNode |
expand(SqlNode expr,
SqlValidatorScope scope)
Expands an expression.
|
SqlNode |
expandOrderExpr(SqlSelect select,
SqlNode orderExpr)
Expands an expression in the ORDER BY clause into an expression with the
same semantics as expressions in the SELECT clause.
|
SqlNodeList |
expandStar(SqlNodeList selectList,
SqlSelect query,
boolean includeSystemVars)
Returns a list of expressions, with every occurrence of "*" or
"TABLE.*" expanded.
|
SqlValidatorCatalogReader |
getCatalogReader()
Returns the catalog reader used by this validator.
|
List<List<String>> |
getFieldOrigins(SqlNode sqlQuery)
Returns a description of how each field in the row type maps to a
catalog, schema, table and column in the schema.
|
@Nullable SqlValidatorScope |
getFromScope(SqlSelect select)
Returns a scope containing the objects visible from the FROM clause of a
query.
|
SqlValidatorScope |
getGroupScope(SqlSelect select)
Returns a scope containing the objects visible from the GROUP BY clause
of a query.
|
SqlValidatorScope |
getHavingScope(SqlSelect select)
Returns a scope containing the objects visible from the HAVING clause of
a query.
|
@Nullable SqlValidatorScope |
getJoinScope(SqlNode node)
Returns a scope containing the objects visible from the ON and USING
sections of a JOIN clause.
|
SqlValidatorScope |
getMatchRecognizeScope(SqlMatchRecognize node)
Returns a scope match recognize clause.
|
@Nullable SqlValidatorNamespace |
getNamespace(SqlNode node)
Finds the namespace corresponding to a given node.
|
SqlOperatorTable |
getOperatorTable()
Returns the operator table used by this validator.
|
SqlValidatorScope |
getOrderScope(SqlSelect select)
Returns the scope that expressions in the SELECT and HAVING clause of
this query should use.
|
SqlValidatorScope |
getOverScope(SqlNode node)
Returns the scope of an OVER or VALUES node.
|
RelDataType |
getParameterRowType(SqlNode sqlQuery)
Returns a record type that contains the name and type of each parameter.
|
@Nullable String |
getParentCursor(String columnListParamName)
Retrieves the name of the parent cursor referenced by a column list
parameter.
|
@Nullable SelectScope |
getRawSelectScope(SqlSelect select)
Returns the scope for resolving the SELECT, GROUP BY and HAVING clauses.
|
SqlValidatorScope |
getSelectScope(SqlSelect select)
Returns the appropriate scope for validating a particular clause of a
SELECT statement.
|
TypeCoercion |
getTypeCoercion()
Get the type coercion instance.
|
RelDataTypeFactory |
getTypeFactory()
Returns the type factory used by this validator.
|
RelDataType |
getUnknownType()
Returns an object representing the "unknown" type.
|
RelDataType |
getValidatedNodeType(SqlNode node)
Returns the type assigned to a node by validation.
|
@Nullable RelDataType |
getValidatedNodeTypeIfKnown(SqlNode node)
Returns the type assigned to a node by validation, or null if unknown.
|
@Nullable List<RelDataType> |
getValidatedOperandTypes(SqlCall call)
Returns the types of a call's operands.
|
SqlValidatorScope |
getWhereScope(SqlSelect select)
Returns the scope that expressions in the WHERE and GROUP BY clause of
this query should use.
|
@Nullable SqlValidatorScope |
getWithScope(SqlNode withItem) |
CalciteException |
handleUnresolvedFunction(SqlCall call,
SqlOperator unresolvedFunction,
List<RelDataType> argTypes,
@Nullable List<String> argNames)
Handles a call to a function which cannot be resolved.
|
boolean |
isAggregate(SqlNode selectNode)
Deprecated.
|
boolean |
isAggregate(SqlSelect select)
Returns whether a SELECT statement is an aggregation.
|
boolean |
isSystemField(RelDataTypeField field)
Returns whether a field is a system field.
|
@Nullable SqlCall |
makeNullaryCall(SqlIdentifier id)
If an identifier is a legitimate call to a function that has no
arguments and requires no parentheses (for example "CURRENT_USER"),
returns a call to that function, otherwise returns null.
|
CalciteContextException |
newValidationError(SqlNode node,
org.apache.calcite.runtime.Resources.ExInst<SqlValidatorException> e)
Adds "line x, column y" context to a validator exception.
|
void |
popFunctionCall()
Removes the topmost entry from the function call stack.
|
void |
pushFunctionCall()
Pushes a new instance of a function call on to a function call stack.
|
void |
removeValidatedNodeType(SqlNode node)
Removes a node from the set of validated nodes.
|
SqlWindow |
resolveWindow(SqlNode windowOrRef,
SqlValidatorScope scope)
Converts a window specification or window name into a fully-resolved
window specification.
|
default SqlWindow |
resolveWindow(SqlNode windowOrRef,
SqlValidatorScope scope,
boolean populateBounds)
Deprecated.
Use
resolveWindow(SqlNode, SqlValidatorScope), which
does not have the deprecated populateBounds parameter. |
void |
setValidatedNodeType(SqlNode node,
RelDataType type)
Saves the type of a
SqlNode, now that it has been validated. |
SqlValidator |
transform(UnaryOperator<SqlValidator.Config> transform)
Returns this SqlValidator, with the same state, applying
a transform to the config.
|
SqlNode |
validate(SqlNode topNode)
Validates an expression tree.
|
void |
validateAggregateParams(SqlCall aggCall,
@Nullable SqlNode filter,
@Nullable SqlNodeList distinctList,
@Nullable SqlNodeList orderList,
SqlValidatorScope scope)
Validates parameters for aggregate function.
|
void |
validateCall(SqlCall call,
SqlValidatorScope scope)
Validates a call to an operator.
|
void |
validateColumnListParams(SqlFunction function,
List<RelDataType> argTypes,
List<SqlNode> operands)
Validates a COLUMN_LIST parameter.
|
void |
validateDataType(SqlDataTypeSpec dataType)
Validates a data type expression.
|
void |
validateDelete(SqlDelete delete)
Validates a DELETE statement.
|
void |
validateDynamicParam(SqlDynamicParam dynamicParam)
Validates a dynamic parameter.
|
void |
validateIdentifier(SqlIdentifier id,
SqlValidatorScope scope)
Resolves an identifier to a fully-qualified name.
|
void |
validateInsert(SqlInsert insert)
Validates an INSERT statement.
|
void |
validateIntervalQualifier(SqlIntervalQualifier qualifier)
Validates a
SqlIntervalQualifier. |
void |
validateLiteral(SqlLiteral literal)
Validates a literal.
|
void |
validateMatchRecognize(SqlCall pattern)
Validates a MATCH_RECOGNIZE clause.
|
void |
validateMerge(SqlMerge merge)
Validates a MERGE statement.
|
boolean |
validateModality(SqlSelect select,
SqlModality modality,
boolean fail)
Validates that a query is capable of producing a return of given modality
(relational or streaming).
|
SqlNode |
validateParameterizedExpression(SqlNode topNode,
Map<String,RelDataType> nameToTypeMap)
Validates an expression tree.
|
void |
validateQuery(SqlNode node,
@Nullable SqlValidatorScope scope,
RelDataType targetRowType)
Checks that a query is valid.
|
void |
validateSequenceValue(SqlValidatorScope scope,
SqlIdentifier id) |
void |
validateUpdate(SqlUpdate update)
Validates an UPDATE statement.
|
void |
validateWindow(SqlNode windowOrId,
SqlValidatorScope scope,
@Nullable SqlCall call)
Validates the right-hand side of an OVER expression.
|
void |
validateWith(SqlWith with,
SqlValidatorScope scope) |
void |
validateWithItem(SqlWithItem withItem) |
@Pure SqlValidatorCatalogReader getCatalogReader()
@Pure SqlOperatorTable getOperatorTable()
SqlNode validate(SqlNode topNode)
topNode - top of expression tree to be validatedSqlNode validateParameterizedExpression(SqlNode topNode, Map<String,RelDataType> nameToTypeMap)
topNode - top of expression tree to be validatednameToTypeMap - map of simple name to RelDataType; used to
resolve SqlIdentifier referencesvoid validateQuery(SqlNode node, @Nullable SqlValidatorScope scope, RelDataType targetRowType)
Valid queries include:
SELECT statement,
UNION, INTERSECT,
EXCEPT)
AS operator
node - Query nodescope - Scope in which the query occurstargetRowType - Desired row type, must not be null, may be the data
type 'unknown'.RuntimeException - if the query is not validRelDataType getValidatedNodeType(SqlNode node)
node - the node of interest@Nullable RelDataType getValidatedNodeTypeIfKnown(SqlNode node)
getValidatedNodeType(org.apache.calcite.sql.SqlNode) instead.node - the node of interest@Nullable List<RelDataType> getValidatedOperandTypes(SqlCall call)
Returns null if the call has not been validated, or if the operands' types do not differ from their types as expressions.
This method is most useful when some of the operands are of type ANY, or if they need to be coerced to be consistent with other operands, or with the needs of the function.
call - Callvoid validateIdentifier(SqlIdentifier id, SqlValidatorScope scope)
id - Identifierscope - Naming scopevoid validateLiteral(SqlLiteral literal)
literal - Literalvoid validateIntervalQualifier(SqlIntervalQualifier qualifier)
SqlIntervalQualifier.qualifier - Interval qualifiervoid validateInsert(SqlInsert insert)
insert - INSERT statementvoid validateUpdate(SqlUpdate update)
update - UPDATE statementvoid validateDelete(SqlDelete delete)
delete - DELETE statementvoid validateMerge(SqlMerge merge)
merge - MERGE statementvoid validateDataType(SqlDataTypeSpec dataType)
dataType - Data typevoid validateDynamicParam(SqlDynamicParam dynamicParam)
dynamicParam - Dynamic parametervoid validateWindow(SqlNode windowOrId, SqlValidatorScope scope, @Nullable SqlCall call)
identifier referencing a window, or an
inline window specification.windowOrId - SqlNode that can be either SqlWindow with all the
components of a window spec or a SqlIdentifier with the
name of a window spec.scope - Naming scopecall - the SqlNode if a function call if the window is attached
to one.void validateMatchRecognize(SqlCall pattern)
pattern - MATCH_RECOGNIZE clausevoid validateCall(SqlCall call, SqlValidatorScope scope)
call - Operator callscope - Naming scopevoid validateAggregateParams(SqlCall aggCall, @Nullable SqlNode filter, @Nullable SqlNodeList distinctList, @Nullable SqlNodeList orderList, SqlValidatorScope scope)
aggCall - Call to aggregate functionfilter - Filter (FILTER (WHERE) clause), or nulldistinctList - Distinct specification (WITHIN DISTINCT
clause), or nullorderList - Ordering specification (WITHIN GROUP clause),
or nullscope - Syntactic scopevoid validateColumnListParams(SqlFunction function, List<RelDataType> argTypes, List<SqlNode> operands)
function - function containing COLUMN_LIST parameterargTypes - function argumentsoperands - operands passed into the function call@Nullable SqlCall makeNullaryCall(SqlIdentifier id)
RelDataType deriveType(SqlValidatorScope scope, SqlNode operand)
scope - Syntactic scopeoperand - Parse tree nodeNULLCalciteContextException newValidationError(SqlNode node, org.apache.calcite.runtime.Resources.ExInst<SqlValidatorException> e)
Note that the input exception is checked (it derives from
Exception) and the output exception is unchecked (it derives from
RuntimeException). This is intentional -- it should remind code
authors to provide context for their validation errors.
node - The place where the exception occurred, not nulle - The validation errorboolean isAggregate(SqlSelect select)
SUM(x) OVER w, don't count.)select - SELECT statement@Deprecated boolean isAggregate(SqlNode selectNode)
selectNode - Expression in SELECT clauseSqlWindow resolveWindow(SqlNode windowOrRef, SqlValidatorScope scope)
SELECT sum(x) OVER (PARTITION
BY x ORDER BY y), sum(y) OVER w1, sum(z) OVER (w ORDER BY y) FROM t
WINDOW w AS (PARTITION BY x) all aggregations have the same
resolved window specification (PARTITION BY x ORDER BY y).windowOrRef - Either the name of a window (a SqlIdentifier)
or a window specification (a SqlWindow).scope - Scope in which to resolve window namesRuntimeException - Validation exception if window does not exist@Deprecated default SqlWindow resolveWindow(SqlNode windowOrRef, SqlValidatorScope scope, boolean populateBounds)
resolveWindow(SqlNode, SqlValidatorScope), which
does not have the deprecated populateBounds parameter.populateBounds - Whether to populate bounds. Doing so may alter the
definition of the window. It is recommended that
populate bounds when translating to physical algebra,
but not when validating.@Nullable SqlValidatorNamespace getNamespace(SqlNode node)
For example, in the query SELECT * FROM (SELECT * FROM t), t1 AS
alias, the both items in the FROM clause have a corresponding
namespace.
node - Parse tree node@Nullable String deriveAlias(SqlNode node, int ordinal)
ordinal is less than zero, otherwise generates an
alias EXPR$ordinal.node - Expressionordinal - Ordinal of expressionSqlNodeList expandStar(SqlNodeList selectList, SqlSelect query, boolean includeSystemVars)
selectList - Select clause to be expandedquery - QueryincludeSystemVars - Whether to include system variablesSqlValidatorScope getWhereScope(SqlSelect select)
select - Query@Pure RelDataTypeFactory getTypeFactory()
@API(status=INTERNAL,
since="1.24")
void setValidatedNodeType(SqlNode node,
RelDataType type)
SqlNode, now that it has been validated.
This method is only for internal use. The validator should drive the type-derivation process, and store nodes' types when they have been derived.
node - A SQL parse tree node, never nulltype - Its type; must not be nullvoid removeValidatedNodeType(SqlNode node)
node - node to be removedRelDataType getUnknownType()
SqlValidatorScope getSelectScope(SqlSelect select)
Consider
SELECT * FROM foo WHERE EXISTS ( SELECT deptno AS x FROM emp JOIN dept ON emp.deptno = dept.deptno WHERE emp.deptno = 5 GROUP BY deptno ORDER BY x)
What objects can be seen in each part of the sub-query?
getFromScope(org.apache.calcite.sql.SqlSelect) , you can only see 'foo'.
getWhereScope(org.apache.calcite.sql.SqlSelect)), GROUP BY (getGroupScope(org.apache.calcite.sql.SqlSelect)),
SELECT (getSelectScope), and the ON clause of the JOIN
(getJoinScope(org.apache.calcite.sql.SqlNode)) you can see 'emp', 'dept', and 'foo'.
getOrderScope(org.apache.calcite.sql.SqlSelect)), you can see the column alias 'x';
and tables 'emp', 'dept', and 'foo'.
select - SELECT statement@Nullable SelectScope getRawSelectScope(SqlSelect select)
SelectScope; if this is an aggregation query, the
AggregatingScope is stripped away.select - SELECT statement@Nullable SqlValidatorScope getFromScope(SqlSelect select)
select - SELECT statement@Nullable SqlValidatorScope getJoinScope(SqlNode node)
node - The item in the FROM clause which contains the ON or USING
expressiongetFromScope(org.apache.calcite.sql.SqlSelect)SqlValidatorScope getGroupScope(SqlSelect select)
select - SELECT statementSqlValidatorScope getHavingScope(SqlSelect select)
select - SELECT statementSqlValidatorScope getOrderScope(SqlSelect select)
select - SELECT statementSqlValidatorScope getMatchRecognizeScope(SqlMatchRecognize node)
node - Match recognizevoid declareCursor(SqlSelect select, SqlValidatorScope scope)
select - select expression associated with the cursorscope - scope of the parent query associated with the cursorvoid pushFunctionCall()
void popFunctionCall()
@Nullable String getParentCursor(String columnListParamName)
columnListParamName - name of the column list parameterRelDataType deriveConstructorType(SqlValidatorScope scope, SqlCall call, SqlFunction unresolvedConstructor, @Nullable SqlFunction resolvedConstructor, List<RelDataType> argTypes)
scope - Scopecall - CallunresolvedConstructor - TODOresolvedConstructor - TODOargTypes - Types of argumentsCalciteException handleUnresolvedFunction(SqlCall call, SqlOperator unresolvedFunction, List<RelDataType> argTypes, @Nullable List<String> argNames)
call - CallunresolvedFunction - Overloaded function which is the target of the
callargTypes - Types of argumentsargNames - Names of arguments, or null if call by positionSqlNode expandOrderExpr(SqlSelect select, SqlNode orderExpr)
This is made necessary by a couple of dialect 'features':
select - Select statement which contains ORDER BYorderExpr - Expression in the ORDER BY clause.SqlNode expand(SqlNode expr, SqlValidatorScope scope)
expr - Expressionscope - Scopeboolean isSystemField(RelDataTypeField field)
In the default implementation, always returns false.
field - FieldList<List<String>> getFieldOrigins(SqlNode sqlQuery)
The returned list is never null, and has one element for each field in the row type. Each element is a list of four elements (catalog, schema, table, column), or may be null if the column is an expression.
sqlQuery - QueryRelDataType getParameterRowType(SqlNode sqlQuery)
sqlQuery - QuerySqlValidatorScope getOverScope(SqlNode node)
node - Nodeboolean validateModality(SqlSelect select, SqlModality modality, boolean fail)
select - Querymodality - Modality (streaming or relational)fail - Whether to throw a user error if does not support required
modalityvoid validateWith(SqlWith with, SqlValidatorScope scope)
void validateWithItem(SqlWithItem withItem)
void validateSequenceValue(SqlValidatorScope scope, SqlIdentifier id)
@Nullable SqlValidatorScope getWithScope(SqlNode withItem)
TypeCoercion getTypeCoercion()
SqlValidator.Config config()
@API(status=INTERNAL,
since="1.23")
SqlValidator transform(UnaryOperator<SqlValidator.Config> transform)
This is mainly used for tests, otherwise constructs a SqlValidator.Config directly
through the constructor.
Copyright © 2012-2022 Apache Software Foundation. All Rights Reserved.