|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object org.eigenbase.sql.SqlOperator
public abstract class SqlOperator
A SqlOperator
is a type of node in a SQL parse tree (it is NOT a
node in a SQL parse tree). It includes functions, operators such as '=', and
syntactic constructs such as 'case' statements. Operators may represent
query-level expressions (e.g. SqlSelectOperator
or row-level
expressions (e.g. SqlBetweenOperator
.
Operators have formal operands, meaning ordered (and optionally
named) placeholders for the values they operate on. For example, the division
operator takes two operands; the first is the numerator and the second is the
denominator. In the context of subclass SqlFunction
, formal operands
are referred to as parameters.
When an operator is instantiated via a SqlCall
, it is supplied
with actual operands. For example, in the expression 3 /
5
, the literal expression 3
is the actual operand
corresponding to the numerator, and 5
is the actual operand
corresponding to the denominator. In the context of SqlFunction, actual
operands are referred to as arguments
In many cases, the formal/actual distinction is clear from context, in which case we drop these qualifiers.
Field Summary | |
---|---|
private SqlKind |
kind
See SqlKind . |
private int |
leftPrec
The precedence with which this operator binds to the expression to the left. |
protected static int |
MaxPrec
Maximum precedence. |
private String |
name
The name of the operator/function. |
static String |
NL
|
private SqlOperandTypeChecker |
operandTypeChecker
used to validate operand types |
private SqlOperandTypeInference |
operandTypeInference
used to infer types of unknown operands |
private SqlReturnTypeInference |
returnTypeInference
used to infer the return type of a call to this operator |
private int |
rightPrec
The precedence with which this operator binds to the expression to the right. |
Constructor Summary | |
---|---|
protected |
SqlOperator(String name,
SqlKind kind,
int prec,
boolean leftAssoc,
SqlReturnTypeInference returnTypeInference,
SqlOperandTypeInference operandTypeInference,
SqlOperandTypeChecker operandTypeChecker)
Creates an operator specifying left/right associativity. |
protected |
SqlOperator(String name,
SqlKind kind,
int leftPrecedence,
int rightPrecedence,
SqlReturnTypeInference returnTypeInference,
SqlOperandTypeInference operandTypeInference,
SqlOperandTypeChecker operandTypeChecker)
Creates an operator. |
Method Summary | ||
---|---|---|
|
acceptCall(SqlVisitor<R> visitor,
SqlCall call)
Accepts a SqlVisitor , visiting each operand of a call. |
|
|
acceptCall(SqlVisitor<R> visitor,
SqlCall call,
boolean onlyExpressions,
SqlBasicVisitor.ArgHandler<R> argHandler)
Accepts a SqlVisitor , directing an SqlBasicVisitor.ArgHandler to visit operand of a
call. |
|
protected RelDataType |
adjustType(SqlValidator validator,
SqlCall call,
RelDataType type)
Validates and determines coercibility and resulting collation name of binary operator if needed. |
|
boolean |
argumentMustBeScalar(int ordinal)
Returns whether the ordinal th argument to this operator must
be scalar (as opposed to a query). |
|
protected void |
checkOperandCount(SqlValidator validator,
SqlOperandTypeChecker argType,
SqlCall call)
|
|
boolean |
checkOperandTypes(SqlCallBinding callBinding,
boolean throwOnFailure)
Checks that the operand values in a SqlCall to this operator are
valid. |
|
SqlCall |
createCall(SqlLiteral functionQualifier,
SqlParserPos pos,
SqlNode... operands)
Creates a call to this operand with an array of operands. |
|
SqlCall |
createCall(SqlNodeList nodeList)
Creates a call to this operand with a list of operands contained in a SqlNodeList . |
|
SqlCall |
createCall(SqlParserPos pos,
List<? extends SqlNode> operandList)
Creates a call to this operand with a list of operands. |
|
SqlCall |
createCall(SqlParserPos pos,
SqlNode... operands)
Creates a call to this operand with an array of operands. |
|
RelDataType |
deriveType(SqlValidator validator,
SqlValidatorScope scope,
SqlCall call)
Derives the type of a call to this operator. |
|
boolean |
equals(Object obj)
|
|
String |
getAllowedSignatures()
Returns a string describing the expected operand types of a call, e.g. |
|
String |
getAllowedSignatures(String opNameToUse)
Returns a string describing the expected operand types of a call, e.g. |
|
SqlKind |
getKind()
|
|
int |
getLeftPrec()
|
|
SqlMonotonicity |
getMonotonicity(SqlCall call,
SqlValidatorScope scope)
Returns whether this operator is monotonic. |
|
String |
getName()
|
|
SqlOperandCountRange |
getOperandCountRange()
Returns a constraint on the number of operands expected by this operator. |
|
SqlOperandTypeChecker |
getOperandTypeChecker()
|
|
SqlOperandTypeInference |
getOperandTypeInference()
|
|
SqlReturnTypeInference |
getReturnTypeInference()
|
|
int |
getRightPrec()
|
|
String |
getSignatureTemplate(int operandsCount)
Returns a template describing how the operator signature is to be built. |
|
abstract SqlSyntax |
getSyntax()
Returns the syntactic type of this operator. |
|
int |
hashCode()
|
|
RelDataType |
inferReturnType(RelDataTypeFactory typeFactory,
RelDataType[] operandTypes)
Infers the type of a call to this operator with a given set of operand types. |
|
RelDataType |
inferReturnType(SqlOperatorBinding opBinding)
Infers the return type of an invocation of this operator; only called after the number and types of operands have already been validated. |
|
boolean |
isAggregator()
Returns whether this operator is an aggregate function. |
|
boolean |
isDeterministic()
|
|
boolean |
isDynamicFunction()
|
|
boolean |
isName(String testName)
|
|
protected static int |
leftPrec(int prec,
boolean leftAssoc)
|
|
protected void |
preValidateCall(SqlValidator validator,
SqlValidatorScope scope,
SqlCall call)
Receives notification that validation of a call to this operator is beginning. |
|
boolean |
requiresDecimalExpansion()
Method to check if call requires expansion when it has decimal operands. |
|
SqlNode |
rewriteCall(SqlValidator validator,
SqlCall call)
Rewrites a call to this operator. |
|
protected static int |
rightPrec(int prec,
boolean leftAssoc)
|
|
String |
toString()
|
|
void |
unparse(SqlWriter writer,
SqlNode[] operands,
int leftPrec,
int rightPrec)
Writes a SQL representation of a call to this operator to a writer, including parentheses if the operators on either side are of greater precedence. |
|
protected void |
unparseListClause(SqlWriter writer,
SqlNode clause)
|
|
protected void |
unparseListClause(SqlWriter writer,
SqlNode clause,
SqlKind sepKind)
|
|
void |
validateCall(SqlCall call,
SqlValidator validator,
SqlValidatorScope scope,
SqlValidatorScope operandScope)
Validates a call to this operator. |
|
RelDataType |
validateOperands(SqlValidator validator,
SqlValidatorScope scope,
SqlCall call)
Validates the operands of a call, inferring the return type in the process. |
Methods inherited from class java.lang.Object |
---|
clone, finalize, getClass, notify, notifyAll, wait, wait, wait |
Field Detail |
---|
public static final String NL
protected static final int MaxPrec
private final String name
private final SqlKind kind
SqlKind
. It's possible to have a name that doesn't match the
kind
private final int leftPrec
private final int rightPrec
private final SqlReturnTypeInference returnTypeInference
private final SqlOperandTypeInference operandTypeInference
private final SqlOperandTypeChecker operandTypeChecker
Constructor Detail |
---|
protected SqlOperator(String name, SqlKind kind, int leftPrecedence, int rightPrecedence, SqlReturnTypeInference returnTypeInference, SqlOperandTypeInference operandTypeInference, SqlOperandTypeChecker operandTypeChecker)
protected SqlOperator(String name, SqlKind kind, int prec, boolean leftAssoc, SqlReturnTypeInference returnTypeInference, SqlOperandTypeInference operandTypeInference, SqlOperandTypeChecker operandTypeChecker)
Method Detail |
---|
protected static int leftPrec(int prec, boolean leftAssoc)
protected static int rightPrec(int prec, boolean leftAssoc)
public SqlOperandTypeChecker getOperandTypeChecker()
public SqlOperandCountRange getOperandCountRange()
SqlOperandTypeChecker
associated with this
operator.
public String getName()
public SqlKind getKind()
public String toString()
toString
in class Object
public int getLeftPrec()
public int getRightPrec()
public abstract SqlSyntax getSyntax()
public SqlCall createCall(SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands)
The position of the resulting call is the union of the
pos
and the positions of all of the operands.
functionQualifier
- function qualifier (e.g. "DISTINCT"), may bepos
- parser position of the identifier of the calloperands
- array of operandspublic final SqlCall createCall(SqlParserPos pos, SqlNode... operands)
The position of the resulting call is the union of the
pos
and the positions of all of the operands.
pos
- Parser positionoperands
- List of arguments
public final SqlCall createCall(SqlNodeList nodeList)
SqlNodeList
.
The position of the resulting call inferred from the SqlNodeList.
nodeList
- List of arguments
public final SqlCall createCall(SqlParserPos pos, List<? extends SqlNode> operandList)
The position of the resulting call is the union of the
pos
and the positions of all of the operands.
public SqlNode rewriteCall(SqlValidator validator, SqlCall call)
validator
- call
- to be rewritten
public void unparse(SqlWriter writer, SqlNode[] operands, int leftPrec, int rightPrec)
The default implementation of this method delegates to SqlSyntax.unparse(org.eigenbase.sql.SqlWriter, org.eigenbase.sql.SqlOperator, org.eigenbase.sql.SqlNode[], int, int)
.
protected void unparseListClause(SqlWriter writer, SqlNode clause)
protected void unparseListClause(SqlWriter writer, SqlNode clause, SqlKind sepKind)
public boolean equals(Object obj)
equals
in class Object
public boolean isName(String testName)
public int hashCode()
hashCode
in class Object
public void validateCall(SqlCall call, SqlValidator validator, SqlValidatorScope scope, SqlValidatorScope operandScope)
This method should not perform type-derivation or perform validation
related related to types. That is done later, by deriveType(SqlValidator, SqlValidatorScope, SqlCall)
. This method
should focus on structural validation.
A typical implementation of this method first validates the operands, then performs some operator-specific logic. The default implementation just validates the operands.
This method is the default implementation of SqlCall.validate(org.eigenbase.sql.validate.SqlValidator, org.eigenbase.sql.validate.SqlValidatorScope)
;
but note that some sub-classes of SqlCall
never call this method.
call
- the call to this operatorvalidator
- the active validatorscope
- validator scopeoperandScope
- validator scope in which to validate operands to this
call; usually equal to scope, but not always because some operators
introduce new scopesSqlNode.validateExpr(SqlValidator, SqlValidatorScope)
,
deriveType(SqlValidator, SqlValidatorScope, SqlCall)
public final RelDataType validateOperands(SqlValidator validator, SqlValidatorScope scope, SqlCall call)
validator
- active validatorscope
- validation scopecall
- call to be validated
protected void preValidateCall(SqlValidator validator, SqlValidatorScope scope, SqlCall call)
validator
- invoking validatorscope
- validation scopecall
- the call being validatedpublic RelDataType inferReturnType(SqlOperatorBinding opBinding)
SqlReturnTypeInference
to the constructor.
opBinding
- description of invocation (not necessarily a SqlCall
)
public RelDataType deriveType(SqlValidator validator, SqlValidatorScope scope, SqlCall call)
This method is an intrinsic part of the validation process so, unlike
inferReturnType(org.eigenbase.sql.SqlOperatorBinding)
, specific operators would not typically override
this method.
validator
- Validatorscope
- Scope of validationcall
- Call to this operator
protected RelDataType adjustType(SqlValidator validator, SqlCall call, RelDataType type)
public final RelDataType inferReturnType(RelDataTypeFactory typeFactory, RelDataType[] operandTypes)
inferReturnType(SqlOperatorBinding)
.
public boolean checkOperandTypes(SqlCallBinding callBinding, boolean throwOnFailure)
SqlCall
to this operator are
valid. Subclasses must either override this method or supply an instance
of SqlOperandTypeChecker
to the constructor.
callBinding
- description of callthrowOnFailure
- whether to throw an exception if check fails
(otherwise returns false in that case)
protected void checkOperandCount(SqlValidator validator, SqlOperandTypeChecker argType, SqlCall call)
public String getSignatureTemplate(int operandsCount)
operandsCount
- is used with functions that can take a variable
number of operands
public String getAllowedSignatures()
public String getAllowedSignatures(String opNameToUse)
public SqlOperandTypeInference getOperandTypeInference()
public boolean isAggregator()
public <R> R acceptCall(SqlVisitor<R> visitor, SqlCall call)
SqlVisitor
, visiting each operand of a call. Returns
null.
visitor
- Visitorcall
- Call to visitpublic <R> void acceptCall(SqlVisitor<R> visitor, SqlCall call, boolean onlyExpressions, SqlBasicVisitor.ArgHandler<R> argHandler)
SqlVisitor
, directing an SqlBasicVisitor.ArgHandler
to visit operand of a
call. The argument handler allows fine control about how the operands are
visited, and how the results are combined.
visitor
- Visitorcall
- Call to visitonlyExpressions
- If true, ignores operands which are not
expressions. For example, in the call to the AS
operatorargHandler
- Called for each operandpublic SqlReturnTypeInference getReturnTypeInference()
public SqlMonotonicity getMonotonicity(SqlCall call, SqlValidatorScope scope)
Default implementation returns SqlMonotonicity.NotMonotonic
.
call
- Call to this operatorscope
- Scope in which the call occurspublic boolean isDeterministic()
public boolean isDynamicFunction()
public boolean requiresDecimalExpansion()
public boolean argumentMustBeScalar(int ordinal)
ordinal
th argument to this operator must
be scalar (as opposed to a query).
If true (the default), the validator will attempt to convert the argument into a scalar subquery, which must have one column and return at most one row.
Operators such as SELECT
and EXISTS
override
this method.
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |