Top Description Inners Fields Constructors Methods
org.apache.derby.impl.sql.compile

pack-priv Class ConditionalNode

extends ValueNode
Class Inheritance
Imports
java.util.List, org.apache.derby.shared.common.error.StandardException, org.apache.derby.shared.common.reference.ClassName, .SQLState, org.apache.derby.iapi.services.classfile.VMOpcode, org.apache.derby.iapi.services.compiler.MethodBuilder, org.apache.derby.iapi.services.context.ContextManager, org.apache.derby.iapi.services.loader.ClassInspector, org.apache.derby.shared.common.sanity.SanityManager, org.apache.derby.iapi.sql.compile.CompilerContext, .Visitable, .Visitor, org.apache.derby.iapi.types.DataTypeDescriptor, .TypeId, org.apache.derby.iapi.util.JBitSet

A ConditionalNode represents an if/then/else operator with a single boolean expression on the "left" of the operator and a list of expressions on the "right". This is used to represent the java conditional (aka immediate if).

Nested and Inner Type Summary

Modifier and TypeClass and Description
private class
ConditionalNode.ReplaceCaseOperandVisitor

A visitor that replaces all occurrences of the caseOperand node in a tree with dummy parameter nodes.

Field Summary

Modifier and TypeField and Description
private CachedValueNode
caseOperand

The case operand if this is a simple case expression.

private ValueNodeList
testConditions

The list of test conditions in the WHEN clauses.

private ValueNodeList
thenElseList

The list of corresponding THEN expressions to the test conditions in testConditions.

Inherited from org.apache.derby.impl.sql.compile.ValueNode:
transformed

Constructor Summary

AccessConstructor and Description
pack-priv
ConditionalNode(CachedValueNode
The case operand if this is a simple case expression, or null otherwise
caseOperand
,
ValueNodeList
The boolean test conditions
testConditions
,
ValueNodeList
ValueNodeList with then and else expressions
thenElseList
,
ContextManager
The context manager
cm
)

Constructor for a ConditionalNode

Method Summary

Modifier and TypeMethod and Description
pack-priv void
acceptChildren(Visitor
the visitor
v
)

Overrides org.apache.derby.impl.sql.compile.QueryTreeNode.acceptChildren.

Accept the visitor for all visitable children of this node.

private ValueNodeList

Returns:

a list of dummy parameter nodes that have been inserted into the tree instead of the case operand, if such a replacement has happened; otherwise, null is returned
bindCaseOperand
(CompilerContext cc, FromList fromList, SubqueryList subqueryList, List<AggregateNode> aggregates)

Bind the case operand, if there is one, and check that it doesn't contain anything that's illegal in a case operand (such as calls to routines that are non-deterministic or modify SQL).

pack-priv ValueNode

Returns:

The new top of the expression tree.
bindExpression
(FromList
The FROM list for the query this expression is in, for binding columns.
fromList
,
SubqueryList
The subquery list being built as we find SubqueryNodes
subqueryList
,
List<AggregateNode>
The aggregate list being built as we find AggregateNodes
aggregates
)

Overrides org.apache.derby.impl.sql.compile.ValueNode.bindExpression.

Bind this expression.

pack-priv boolean

Returns:

boolean Whether or not source.expression is a ColumnReference or a VirtualColumnNode.
categorize
(JBitSet
JBitSet with bit map of referenced FromTables
referencedTabs
,
boolean
Whether or not to consider method calls, field references and conditional nodes when building bit map
simplePredsOnly
)

Overrides org.apache.derby.impl.sql.compile.ValueNode.categorize.

Categorize this predicate.

pack-priv boolean
constantExpression(PredicateList whereClause)

Overrides org.apache.derby.impl.sql.compile.ValueNode.constantExpression.

Return whether or not this expression tree represents a constant value.

pack-priv ValueNode

Returns:

The modified expression
eliminateNots
(boolean
Whether or not we are under a NotNode.
underNotNode
)

Overrides org.apache.derby.impl.sql.compile.ValueNode.eliminateNots.

Eliminate NotNodes in the current query block.

pack-priv void
generateExpression(ExpressionClassBuilder
The ExpressionClassBuilder for the class we're generating
acb
,
MethodBuilder
The method the expression will go into
mb
)

Overrides org.apache.derby.impl.sql.compile.ValueNode.generateExpression.

Do code generation for this conditional expression.

pack-priv boolean

Returns:

Whether or not this expression tree represents a constant expression.
isConstantExpression
()

Overrides org.apache.derby.impl.sql.compile.ValueNode.isConstantExpression.

Return whether or not this expression tree represents a constant expression.

pack-priv boolean
isEquivalent(ValueNode
the node to compare this ValueNode against.
o
)

Implements abstract org.apache.derby.impl.sql.compile.ValueNode.isEquivalent.

Tests if this node is equivalent to the specified ValueNode.

pack-priv ValueNode

Returns:

The modified expression
preprocess
(int
Number of tables in the DML Statement
numTables
,
FromList
FromList from outer query block
outerFromList
,
SubqueryList
SubqueryList from outer query block
outerSubqueryList
,
PredicateList
PredicateList from outer query block
outerPredicateList
)

Overrides org.apache.derby.impl.sql.compile.ValueNode.preprocess.

Preprocess an expression tree.

pack-priv void
printSubNodes(int
The depth of this node in the tree
depth
)

Overrides org.apache.derby.impl.sql.compile.QueryTreeNode.printSubNodes.

Prints the sub-nodes of this object.

private void
recastNullNodes(DataTypeDescriptor
The type to cast SQL parsed NULL's too.
castType
,
FromList
FromList to pass on to bindExpression if recast is performed
fromList
,
SubqueryList
SubqueryList to pass on to bindExpression if recast is performed
subqueryList
,
List<AggregateNode>
List of aggregates to pass on to bindExpression if recast is performed
aggregates
)

This method makes sure any SQL NULLs will be cast to the correct type.

pack-priv ValueNode

Returns:

ValueNode The remapped expression tree.
remapColumnReferencesToExpressions
()

Overrides org.apache.derby.impl.sql.compile.ValueNode.remapColumnReferencesToExpressions.

Remap all ColumnReferences in this tree to be clones of the underlying expression.

Inherited from org.apache.derby.impl.sql.compile.ValueNode:
bindExpressionchangeToCNFcheckIsBooleancheckTopPredicatesForEqualsConditionscopyFieldsevaluateConstantExpressionsgenEqualsFalseTreegenerategenIsNullTreegenSQLJavaSQLTreegetClonegetColumnNamegetConstantValueAsObjectgetDataValueFactorygetOrderableVariantTypegetSchemaNamegetSourceResultColumngetTableNamegetTablesReferencedgetTransformedgetTypeCompilergetTypeIdgetTypeServicesisBinaryEqualsOperatorNodeisBooleanFalseisBooleanTrueisCloneableisInListProbeNodeisParameterNodeisRelationalOperatorisSameNodeKindoptimizableEqualityNodeputAndsOnToprequiresTypeFromContextselectivitysetCollationInfosetCollationInfosetCollationUsingCompilationSchemasetCollationUsingCompilationSchemasetNullabilitysetTransformedsetTypesetTypesetTypetoStringupdatableByCursorverifyChangeToCNFverifyEliminateNotsverifyPutAndsOnTop

Field Detail

caseOperandback to summary
private CachedValueNode caseOperand

The case operand if this is a simple case expression. Otherwise, it is null.

testConditionsback to summary
private ValueNodeList testConditions

The list of test conditions in the WHEN clauses.

thenElseListback to summary
private ValueNodeList thenElseList

The list of corresponding THEN expressions to the test conditions in testConditions. The last element represents the ELSE clause.

Constructor Detail

ConditionalNodeback to summary
pack-priv ConditionalNode(CachedValueNode caseOperand, ValueNodeList testConditions, ValueNodeList thenElseList, ContextManager cm)

Constructor for a ConditionalNode

Parameters
caseOperand:CachedValueNode

The case operand if this is a simple case expression, or null otherwise

testConditions:ValueNodeList

The boolean test conditions

thenElseList:ValueNodeList

ValueNodeList with then and else expressions

cm:ContextManager

The context manager

Method Detail

acceptChildrenback to summary
pack-priv void acceptChildren(Visitor v) throws StandardException

Overrides org.apache.derby.impl.sql.compile.QueryTreeNode.acceptChildren.

Accept the visitor for all visitable children of this node.

Parameters
v:Visitor

the visitor

Annotations
@Override
Exceptions
StandardException:
on error
bindCaseOperandback to summary
private ValueNodeList bindCaseOperand(CompilerContext cc, FromList fromList, SubqueryList subqueryList, List<AggregateNode> aggregates) throws StandardException

Bind the case operand, if there is one, and check that it doesn't contain anything that's illegal in a case operand (such as calls to routines that are non-deterministic or modify SQL).

Also, if the type of the case operand needs to be inferred, insert dummy parameter nodes into testConditions instead of the case operand, so that the type can be inferred individually for each test condition. Later, bindExpression will find a common type for all of them, use that type for the case operand, and reinsert the case operand into the test conditions.

Returns:ValueNodeList

a list of dummy parameter nodes that have been inserted into the tree instead of the case operand, if such a replacement has happened; otherwise, null is returned

bindExpressionback to summary
pack-priv ValueNode bindExpression(FromList fromList, SubqueryList subqueryList, List<AggregateNode> aggregates) throws StandardException

Overrides org.apache.derby.impl.sql.compile.ValueNode.bindExpression.

Bind this expression. This means binding the sub-expressions, as well as figuring out what the return type is for this expression.

Parameters
fromList:FromList

The FROM list for the query this expression is in, for binding columns.

subqueryList:SubqueryList

The subquery list being built as we find SubqueryNodes

aggregates:List<AggregateNode>

The aggregate list being built as we find AggregateNodes

Returns:ValueNode

The new top of the expression tree.

Annotations
@Override
Exceptions
StandardException:
Thrown on error
categorizeback to summary
pack-priv boolean categorize(JBitSet referencedTabs, boolean simplePredsOnly) throws StandardException

Overrides org.apache.derby.impl.sql.compile.ValueNode.categorize.

Categorize this predicate. Initially, this means building a bit map of the referenced tables for each predicate. If the source of this ColumnReference (at the next underlying level) is not a ColumnReference or a VirtualColumnNode then this predicate will not be pushed down. For example, in: select * from (select 1 from s) a (x) where x = 1 we will not push down x = 1.

Note

It would be easy to handle the case of a constant, but if the inner SELECT returns an arbitrary expression, then we would have to copy that tree into the pushed predicate, and that tree could contain subqueries and method calls. RESOLVE - revisit this issue once we have views.

Parameters
referencedTabs:JBitSet

JBitSet with bit map of referenced FromTables

simplePredsOnly:boolean

Whether or not to consider method calls, field references and conditional nodes when building bit map

Returns:boolean

boolean Whether or not source.expression is a ColumnReference or a VirtualColumnNode.

Annotations
@Override
Exceptions
StandardException:
Thrown on error
constantExpressionback to summary
pack-priv boolean constantExpression(PredicateList whereClause)

Overrides org.apache.derby.impl.sql.compile.ValueNode.constantExpression.

Doc from org.apache.derby.impl.sql.compile.ValueNode.constantExpression.

Return whether or not this expression tree represents a constant value. In this case, "constant" means that it will always evaluate to the same thing, even if it includes columns. A column is constant if it is compared to a constant expression.

Returns:boolean

True means this expression tree represents a constant value.

Annotations
@Override
See Also
ValueNode#constantExpression
eliminateNotsback to summary
pack-priv ValueNode eliminateNots(boolean underNotNode) throws StandardException

Overrides org.apache.derby.impl.sql.compile.ValueNode.eliminateNots.

Eliminate NotNodes in the current query block. We traverse the tree, inverting ANDs and ORs and eliminating NOTs as we go. We stop at ComparisonOperators and boolean expressions. We invert ComparisonOperators and replace boolean expressions with boolean expression = false.

Note

Since we do not recurse under ComparisonOperators, there still could be NotNodes left in the tree.

Parameters
underNotNode:boolean

Whether or not we are under a NotNode.

Returns:ValueNode

The modified expression

Annotations
@Override
Exceptions
StandardException:
Thrown on error
generateExpressionback to summary
pack-priv void generateExpression(ExpressionClassBuilder acb, MethodBuilder mb) throws StandardException

Overrides org.apache.derby.impl.sql.compile.ValueNode.generateExpression.

Do code generation for this conditional expression.

Parameters
acb:ExpressionClassBuilder

The ExpressionClassBuilder for the class we're generating

mb:MethodBuilder

The method the expression will go into

Annotations
@Override
Exceptions
StandardException:
Thrown on error
isConstantExpressionback to summary
pack-priv boolean isConstantExpression()

Overrides org.apache.derby.impl.sql.compile.ValueNode.isConstantExpression.

Return whether or not this expression tree represents a constant expression.

Returns:boolean

Whether or not this expression tree represents a constant expression.

Annotations
@Override
isEquivalentback to summary
pack-priv boolean isEquivalent(ValueNode o) throws StandardException

Implements abstract org.apache.derby.impl.sql.compile.ValueNode.isEquivalent.

Doc from org.apache.derby.impl.sql.compile.ValueNode.isEquivalent.

Tests if this node is equivalent to the specified ValueNode. Two ValueNodes are considered equivalent if they will evaluate to the same value during query execution.

This method provides basic expression matching facility for the derived class of ValueNode and it is used by the language layer to compare the node structural form of the two expressions for equivalence at bind phase.

Note that it is not comparing the actual row values at runtime to produce a result; hence, when comparing SQL NULLs, they are considered to be equivalent and not unknown.

One usage case of this method in this context is to compare the select column expression against the group by expression to check if they are equivalent. e.g.:

SELECT c1+c2 FROM t1 GROUP BY c1+c2

In general, node equivalence is determined by the derived class of ValueNode. But they generally abide to the rules below:

  • The two ValueNodes must be of the same node type to be considered equivalent. e.g.: CastNode vs. CastNode - equivalent (if their args also match), ColumnReference vs CastNode - not equivalent.
  • If node P contains other ValueNode(s) and so on, those node(s) must also be of the same node type to be considered equivalent.
  • If node P takes a parameter list, then the number of arguments and its arguments for the two nodes must also match to be considered equivalent. e.g.: CAST(c1 as INTEGER) vs CAST(c1 as SMALLINT), they are not equivalent.
  • When comparing SQL NULLs in this context, they are considered to be equivalent.
  • If this does not apply or it is determined that the two nodes are not equivalent then the derived class of this method should return false; otherwise, return true.
Parameters
o:ValueNode

the node to compare this ValueNode against.

Returns:boolean

true if the two nodes are equivalent, false otherwise.

preprocessback to summary
pack-priv ValueNode preprocess(int numTables, FromList outerFromList, SubqueryList outerSubqueryList, PredicateList outerPredicateList) throws StandardException

Overrides org.apache.derby.impl.sql.compile.ValueNode.preprocess.

Preprocess an expression tree. We do a number of transformations here (including subqueries, IN lists, LIKE and BETWEEN) plus subquery flattening.

Note

This is done before the outer ResultSetNode is preprocessed.

Parameters
numTables:int

Number of tables in the DML Statement

outerFromList:FromList

FromList from outer query block

outerSubqueryList:SubqueryList

SubqueryList from outer query block

outerPredicateList:PredicateList

PredicateList from outer query block

Returns:ValueNode

The modified expression

Annotations
@Override
Exceptions
StandardException:
Thrown on error
printSubNodesback to summary
pack-priv void printSubNodes(int depth)

Overrides org.apache.derby.impl.sql.compile.QueryTreeNode.printSubNodes.

Prints the sub-nodes of this object. See QueryTreeNode.java for how tree printing is supposed to work.

Parameters
depth:int

The depth of this node in the tree

Annotations
@Override
recastNullNodesback to summary
private void recastNullNodes(DataTypeDescriptor castType, FromList fromList, SubqueryList subqueryList, List<AggregateNode> aggregates) throws StandardException

This method makes sure any SQL NULLs will be cast to the correct type.

Parameters
castType:DataTypeDescriptor

The type to cast SQL parsed NULL's too.

fromList:FromList

FromList to pass on to bindExpression if recast is performed

subqueryList:SubqueryList

SubqueryList to pass on to bindExpression if recast is performed

aggregates:List<AggregateNode>

List of aggregates to pass on to bindExpression if recast is performed

Exceptions
StandardException:
Thrown on error.
remapColumnReferencesToExpressionsback to summary
pack-priv ValueNode remapColumnReferencesToExpressions() throws StandardException

Overrides org.apache.derby.impl.sql.compile.ValueNode.remapColumnReferencesToExpressions.

Remap all ColumnReferences in this tree to be clones of the underlying expression.

Returns:ValueNode

ValueNode The remapped expression tree.

Annotations
@Override
Exceptions
StandardException:
Thrown on error
org.apache.derby.impl.sql.compile back to summary

private Class ConditionalNode.ReplaceCaseOperandVisitor

extends Object
implements Visitor
Class Inheritance
  • java.lang.Object
  • org.apache.derby.impl.sql.compile.ConditionalNode.ReplaceCaseOperandVisitor
All Implemented Interfaces
org.apache.derby.iapi.sql.compile.Visitor

A visitor that replaces all occurrences of the caseOperand node in a tree with dummy parameter nodes. It also fills a supplied list with the parameter nodes that have been inserted into the tree.

Field Summary

Modifier and TypeField and Description
private final ValueNodeList

Constructor Summary

AccessConstructor and Description
private

Method Summary

Modifier and TypeMethod and Description
public boolean
skipChildren(Visitable
the node to process
node
)

Implements org.apache.derby.iapi.sql.compile.Visitor.skipChildren.

Method that is called to indicate whether we should skip all nodes below this node for traversal.

public boolean
stopTraversal()

Implements org.apache.derby.iapi.sql.compile.Visitor.stopTraversal.

Method that is called to see if query tree traversal should be stopped before visiting all nodes.

public Visitable
visit(Visitable
the node to process
node
)

Implements org.apache.derby.iapi.sql.compile.Visitor.visit.

This is the default visit operation on a QueryTreeNode.

public boolean
visitChildrenFirst(Visitable
the top node of a sub-tree about to be visited
node
)

Implements org.apache.derby.iapi.sql.compile.Visitor.visitChildrenFirst.

Method that is called to see if visit() should be called on the children of node before it is called on node itself.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

replacementsback to summary
private final ValueNodeList replacements

Constructor Detail

ReplaceCaseOperandVisitorback to summary
private ReplaceCaseOperandVisitor(ValueNodeList replacements)

Method Detail

skipChildrenback to summary
public boolean skipChildren(Visitable node) throws StandardException

Implements org.apache.derby.iapi.sql.compile.Visitor.skipChildren.

Doc from org.apache.derby.iapi.sql.compile.Visitor.skipChildren.

Method that is called to indicate whether we should skip all nodes below this node for traversal. Useful if we want to effectively ignore/prune all branches under a particular node.

Differs from stopTraversal() in that it only affects subtrees, rather than the entire traversal.

Parameters
node:Visitable

the node to process

Returns:boolean

true/false

Annotations
@Override
stopTraversalback to summary
public boolean stopTraversal()

Implements org.apache.derby.iapi.sql.compile.Visitor.stopTraversal.

Doc from org.apache.derby.iapi.sql.compile.Visitor.stopTraversal.

Method that is called to see if query tree traversal should be stopped before visiting all nodes. Useful for short circuiting traversal if we already know we are done.

Returns:boolean

true/false

Annotations
@Override
visitback to summary
public Visitable visit(Visitable node) throws StandardException

Implements org.apache.derby.iapi.sql.compile.Visitor.visit.

Doc from org.apache.derby.iapi.sql.compile.Visitor.visit.

This is the default visit operation on a QueryTreeNode. It just returns the node. This will typically suffice as the default visit operation for most visitors unless the visitor needs to count the number of nodes visited or something like that.

Visitors will overload this method by implementing a version with a signature that matches a specific type of node. For example, if I want to do something special with aggregate nodes, then that Visitor will implement a visit(AggregateNode node) method which does the aggregate specific processing.

Parameters
node:Visitable

the node to process

Returns:Visitable

a query tree node. Often times this is the same node that was passed in, but Visitors that replace nodes with other nodes will use this to return the new replacement node.

Annotations
@Override
Exceptions
StandardException:
may be throw an error as needed by the visitor (i.e. may be a normal error if a particular node is found, e.g. if checking a group by, we don't expect to find any ColumnReferences that aren't under an AggregateNode -- the easiest thing to do is just throw an error when we find the questionable node).
visitChildrenFirstback to summary
public boolean visitChildrenFirst(Visitable node)

Implements org.apache.derby.iapi.sql.compile.Visitor.visitChildrenFirst.

Doc from org.apache.derby.iapi.sql.compile.Visitor.visitChildrenFirst.

Method that is called to see if visit() should be called on the children of node before it is called on node itself. If this method always returns true, the visitor will walk the tree bottom-up. If it always returns false, the tree is visited top-down.

Parameters
node:Visitable

the top node of a sub-tree about to be visited

Returns:boolean

true if node's children should be visited before node, false otherwise

Annotations
@Override