|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||
public interface SqlValidator
Validates the parse tree of a SQL statement, and provides semantic information about the parse tree.
To create an instance of the default validator implementation, call SqlValidatorUtil.newValidator(org.eigenbase.sql.SqlOperatorTable, org.eigenbase.sql.validate.SqlValidatorCatalogReader, org.eigenbase.reltype.RelDataTypeFactory).
The validator interface is an instance of the visitor pattern. Implementations
of the SqlNode.validate(org.eigenbase.sql.validate.SqlValidator, org.eigenbase.sql.validate.SqlValidatorScope) method call the validateXxx
method appropriate to the kind of node: SqlLiteral.validate(SqlValidator, SqlValidatorScope) calls validateLiteral(org.eigenbase.sql.SqlLiteral); SqlCall.validate(SqlValidator, SqlValidatorScope) calls validateCall(SqlCall,SqlValidatorScope); and so forth.
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.eigenbase.sql.SqlSelect), getFromScope(org.eigenbase.sql.SqlSelect), getWhereScope(org.eigenbase.sql.SqlSelect), getGroupScope(org.eigenbase.sql.SqlSelect), getHavingScope(org.eigenbase.sql.SqlSelect), getOrderScope(org.eigenbase.sql.SqlSelect) and getJoinScope(org.eigenbase.sql.SqlNode) get the correct scope to resolve
names in a particular clause of a SQL statement.
| Nested Class Summary | |
|---|---|
static class |
SqlValidator.Compatible
Deprecated. This class is for backwards-compatibility with the previous incarnation of SqlConformance. |
| Method Summary | |
|---|---|
void |
declareCursor(SqlSelect select,
SqlValidatorScope scope)
Declares a SELECT expression as a cursor. |
String |
deriveAlias(SqlNode node,
int ordinal)
Derives an alias for an expression. |
RelDataType |
deriveConstructorType(SqlValidatorScope scope,
SqlCall call,
SqlFunction unresolvedConstructor,
SqlFunction resolvedConstructor,
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. |
SqlConformance |
getConformance()
Returns the dialect of SQL (SQL:2003, etc.) this validator recognizes. |
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. |
SqlValidatorScope |
getJoinScope(SqlNode node)
Returns a scope containing the objects visible from the ON and USING sections of a JOIN clause. |
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. |
String |
getParentCursor(String columnListParamName)
Retrieves the name of the parent cursor referenced by a column list parameter. |
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. |
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. |
RelDataType |
getValidatedNodeTypeIfKnown(SqlNode node)
Returns the type assigned to a node by validation, or null if unknown. |
SqlValidatorScope |
getWhereScope(SqlSelect select)
Returns the scope that expressions in the WHERE and GROUP BY clause of this query should use. |
void |
handleUnresolvedFunction(SqlCall call,
SqlFunction unresolvedFunction,
RelDataType[] argTypes)
Handles a call to a function which cannot be resolved, throwing an appropriately descriptive error. |
boolean |
isAggregate(SqlNode selectNode)
Returns whether a select list expression is an aggregate function. |
boolean |
isAggregate(SqlSelect select)
Returns whether a SELECT statement is an aggregation. |
boolean |
isSystemField(RelDataTypeField field)
Returns whether a field is a system field. |
EigenbaseException |
newValidationError(SqlNode node,
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,
boolean populateBounds)
Converts a window specification or window name into a fully-resolved window specification. |
void |
setCallRewrite(boolean rewriteCalls)
Enables or disables rewrite of "macro-like" calls such as COALESCE. |
void |
setColumnReferenceExpansion(boolean expandColumnReferences)
Enables or disables expansion of column references. |
void |
setIdentifierExpansion(boolean expandIdentifiers)
Enables or disables expansion of identifiers other than column references. |
void |
setValidatedNodeType(SqlNode node,
RelDataType type)
Deprecated. This method should not be in the SqlValidator
interface. The validator should drive the type-derivation process, and
store nodes' types when they have been derived. |
boolean |
shouldExpandIdentifiers()
Returns expansion of identifiers. |
SqlNode |
validate(SqlNode topNode)
Validates an expression tree. |
void |
validateAggregateParams(SqlCall aggFunction,
SqlValidatorScope scope)
Validates parameters for aggregate function. |
void |
validateCall(SqlCall call,
SqlValidatorScope scope)
Validates a call to an operator. |
void |
validateColumnListParams(SqlFunction function,
RelDataType[] argTypes,
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 |
validateMerge(SqlMerge merge)
Validates a MERGE statement. |
SqlNode |
validateParameterizedExpression(SqlNode topNode,
Map<String,RelDataType> nameToTypeMap)
Validates an expression tree. |
void |
validateQuery(SqlNode node,
SqlValidatorScope scope)
Checks that a query is valid. |
void |
validateUpdate(SqlUpdate update)
Validates an UPDATE statement. |
void |
validateWindow(SqlNode windowOrId,
SqlValidatorScope scope,
SqlCall call)
Validates the right-hand side of an OVER expression. |
| Method Detail |
|---|
SqlConformance getConformance()
SqlConformance.Default.
SqlValidatorCatalogReader getCatalogReader()
SqlOperatorTable getOperatorTable()
SqlNode validate(SqlNode topNode)
topNode - top of expression tree to be validated
SqlNode 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 references
void validateQuery(SqlNode node,
SqlValidatorScope scope)
Valid queries include:
SELECT statement,
UNION, INTERSECT,
EXCEPT)
AS operator
node - Query nodescope - Scope in which the query occurs
RuntimeException - if the query is not validRelDataType getValidatedNodeType(SqlNode node)
node - the node of interest
RelDataType getValidatedNodeTypeIfKnown(SqlNode node)
getValidatedNodeType(org.eigenbase.sql.SqlNode) instead.
node - the node of interest
void 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 parameter
void validateWindow(SqlNode windowOrId,
SqlValidatorScope scope,
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 - is the SqlNode if a function call if the window is attached
to one.
void validateCall(SqlCall call,
SqlValidatorScope scope)
call - Operator callscope - Naming scope
void validateAggregateParams(SqlCall aggFunction,
SqlValidatorScope scope)
aggFunction - function containing COLUMN_LIST parameterscope - Syntactic scope
void validateColumnListParams(SqlFunction function,
RelDataType[] argTypes,
SqlNode[] operands)
function - function containing COLUMN_LIST parameterargTypes - function argumentsoperands - operands passed into the function call
RelDataType deriveType(SqlValidatorScope scope,
SqlNode operand)
scope - Syntactic scopeoperand - Parse tree node
NULL
EigenbaseException newValidationError(SqlNode node,
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.
e - The validation errornode - The place where the exception occurred
boolean isAggregate(SqlSelect select)
SUM(x) OVER w, don't count.)
select - SELECT statement
boolean isAggregate(SqlNode selectNode)
selectNode - Expression in SELECT clause
SqlWindow resolveWindow(SqlNode windowOrRef,
SqlValidatorScope scope,
boolean populateBounds)
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 namespopulateBounds - 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.
RuntimeException - Validation exception if window does not existSqlValidatorNamespace 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
String deriveAlias(SqlNode node,
int ordinal)
ordinal is less than zero, otherwise generates an
alias EXPR$ordinal.
node - Expressionordinal - Ordinal of expression
SqlNodeList expandStar(SqlNodeList selectList,
SqlSelect query,
boolean includeSystemVars)
selectList - Select clause to be expandedquery - QueryincludeSystemVars - Whether to include system variables
SqlValidatorScope getWhereScope(SqlSelect select)
select - Query
RelDataTypeFactory getTypeFactory()
void setValidatedNodeType(SqlNode node,
RelDataType type)
SqlValidator
interface. The validator should drive the type-derivation process, and
store nodes' types when they have been derived.
SqlNode, now that it has been validated.
node - A SQL parse tree nodetype - 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.eigenbase.sql.SqlSelect) , you can only see 'foo'.
getWhereScope(org.eigenbase.sql.SqlSelect)), GROUP BY (getGroupScope(org.eigenbase.sql.SqlSelect)),
SELECT (getSelectScope(org.eigenbase.sql.SqlSelect)), and the ON clause of the JOIN (getJoinScope(org.eigenbase.sql.SqlNode)) you can see 'emp', 'dept', and 'foo'.
getOrderScope(org.eigenbase.sql.SqlSelect)), you can see the column alias
'x'; and tables 'emp', 'dept', and 'foo'.
select - SELECT statement
SelectScope getRawSelectScope(SqlSelect select)
SelectScope; if this is an aggregation query, the AggregatingScope is stripped away.
select - SELECT statement
SqlValidatorScope getFromScope(SqlSelect select)
select - SELECT statement
SqlValidatorScope getJoinScope(SqlNode node)
node - The item in the FROM clause which contains the ON or USING
expression
getFromScope(org.eigenbase.sql.SqlSelect)SqlValidatorScope getGroupScope(SqlSelect select)
select - SELECT statement
SqlValidatorScope getHavingScope(SqlSelect select)
select - SELECT statement
SqlValidatorScope getOrderScope(SqlSelect select)
select - SELECT statement
void declareCursor(SqlSelect select,
SqlValidatorScope scope)
select - select expression associated with the cursorscope - scope of the parent query associated with the cursorvoid pushFunctionCall()
void popFunctionCall()
String getParentCursor(String columnListParamName)
columnListParamName - name of the column list parameter
void setIdentifierExpansion(boolean expandIdentifiers)
expandIdentifiers - new settingvoid setColumnReferenceExpansion(boolean expandColumnReferences)
expandColumnReferences - new settingboolean shouldExpandIdentifiers()
void setCallRewrite(boolean rewriteCalls)
rewriteCalls - new setting
RelDataType deriveConstructorType(SqlValidatorScope scope,
SqlCall call,
SqlFunction unresolvedConstructor,
SqlFunction resolvedConstructor,
RelDataType[] argTypes)
scope - Scopecall - CallunresolvedConstructor - TODOresolvedConstructor - TODOargTypes - Types of arguments
void handleUnresolvedFunction(SqlCall call,
SqlFunction unresolvedFunction,
RelDataType[] argTypes)
call - CallunresolvedFunction - Overloaded function which is the target of the
callargTypes - Types of arguments
SqlNode 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 - Scope
boolean isSystemField(RelDataTypeField field)
In the default implementation, always returns false.
field - Field
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||