|
|||||||||
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 parametervoid 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 scopevoid validateAggregateParams(SqlCall aggFunction, SqlValidatorScope scope)
aggFunction
- function containing COLUMN_LIST parameterscope
- Syntactic scopevoid validateColumnListParams(SqlFunction function, RelDataType[] argTypes, SqlNode[] operands)
function
- function containing COLUMN_LIST parameterargTypes
- function argumentsoperands
- operands passed into the function callRelDataType 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 settingRelDataType 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 argumentsSqlNode 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 |