org.apache.derby.impl.sql.compile
Class ColumnReference

java.lang.Object
  extended byorg.apache.derby.impl.sql.compile.QueryTreeNode
      extended byorg.apache.derby.impl.sql.compile.ValueNode
          extended byorg.apache.derby.impl.sql.compile.ColumnReference
All Implemented Interfaces:
Visitable

public class ColumnReference
extends ValueNode

A ColumnReference represents a column in the query tree. The parser generates a ColumnReference for each column reference. A column refercence could be a column in a base table, a column in a view (which could expand into a complex expression), or a column in a subquery in the FROM clause.

Author:
Jerry Brenner

Field Summary
 java.lang.String columnName
           
 int columnNumber
           
private  int nestingLevel
           
(package private)  int origColumnNumber
           
 java.lang.String origName
           
(package private)  ResultColumn origSource
           
(package private)  int origTableNumber
           
private  boolean replacesAggregate
           
 ResultColumn source
           
private  int sourceLevel
           
 TableName tableName
           
 int tableNumber
           
private  int tokBeginOffset
           
private  int tokEndOffset
           
 
Fields inherited from class org.apache.derby.impl.sql.compile.ValueNode
clause, dataTypeServices, IN_HAVING_CLAUSE, IN_SELECT_LIST, IN_UNKNOWN_CLAUSE, IN_WHERE_CLAUSE, transformed
 
Fields inherited from class org.apache.derby.impl.sql.compile.QueryTreeNode
AUTOINCREMENT_INC_INDEX, AUTOINCREMENT_IS_AUTOINCREMENT_INDEX, AUTOINCREMENT_START_INDEX, beginOffset, endOffset
 
Constructor Summary
ColumnReference()
           
 
Method Summary
 ValueNode bindExpression(FromList fromList, SubqueryList subqueryList, java.util.Vector aggregateVector)
          Bind this expression.
 boolean categorize(JBitSet referencedTabs, boolean simplePredsOnly)
          Categorize this predicate.
 boolean constantExpression(PredicateList whereClause)
          Return whether or not this expression tree represents a constant value.
 void copyFields(ColumnReference oldCR)
          Copy all of the "appropriate fields" for a shallow copy.
 void generateExpression(ExpressionClassBuilder acb, MethodBuilder mb)
          ColumnReference's are to the current row in the system.
 ValueNode getClone()
          Return a clone of this node.
 java.lang.String getColumnName()
          Get the name of this column
 int getColumnNumber()
          Get the column number for this ColumnReference.
(package private)  boolean getCorrelated()
          Return whether or not this CR is correlated.
 java.lang.String getFullColumnName()
          Get the full column name of this column for purposes of error messages or debugging.
 boolean getGeneratedToReplaceAggregate()
          Determine whether or not this node was generated to replace an aggregate in the user's SELECT.
(package private)  int getNestingLevel()
          Get the nesting level for this CR.
protected  int getOrderableVariantType()
          Return the variant type for the underlying expression.
 java.lang.String getSchemaName()
          Get the user-supplied schema name of this column.
 ResultColumn getSource()
          Get the source this columnReference
(package private)  int getSourceLevel()
          Get the source level for this CR.
 ResultColumn getSourceResultColumn()
          Get the source for this ValueNode.
 java.lang.String getSourceTableName()
          Get the name of the table this column comes from.
 java.lang.String getTableName()
          Get the user-supplied table name of this column.
 TableName getTableNameNode()
          Return the table name as the node it is.
 int getTableNumber()
          Get the table number for this ColumnReference.
(package private)  void getTablesReferenced(JBitSet refs)
          Update the table map to reflect the source of this CR.
 int getTokenBeginOffset()
          Get the begin offset of the parser token for the column name Will only be set when the CR was generated by the parser.
 int getTokenEndOffset()
          Get the end offset of the parser token for the column name.
 DataTypeDescriptor getTypeServices()
          Get the DataTypeServices from this Node.
 void init(java.lang.Object columnName, java.lang.Object tableName)
          Initializer.
 void init(java.lang.Object columnName, java.lang.Object tableName, java.lang.Object tokBeginOffset, java.lang.Object tokEndOffset)
          Initializer.
 boolean isCloneable()
          Return whether or not this expression tree is cloneable.
 void markGeneratedToReplaceAggregate()
          Mark this node as being generated to replace an aggregate.
(package private)  boolean pointsToColumnReference()
          Return whether or not the source of this ColumnReference is itself a ColumnReference.
 void printSubNodes(int depth)
          Prints the sub-nodes of this object.
 ValueNode putAndsOnTop()
          Do the 1st step in putting an expression into conjunctive normal form.
 void remapColumnReferences()
          Remap all of the ColumnReferences in this expression tree to point to the ResultColumn that is 1 level under their current source ResultColumn.
 ValueNode remapColumnReferencesToExpressions()
          Remap all ColumnReferences in this tree to be clones of the underlying expression.
 void setColumnName(java.lang.String columnName)
          Set the name of this column
(package private)  void setNestingLevel(int nestingLevel)
          Set the nesting level for this CR.
 void setSource(ResultColumn source)
          Set the source this columnReference
(package private)  void setSourceLevel(int sourceLevel)
          Set the source level for this CR.
 void setTableNameNode(TableName tableName)
           
 void setTableNumber(int tableNumber)
          Set this ColumnReference to refer to the given table number.
 java.lang.String toString()
          Convert this object to a String.
 void unRemapColumnReferences()
           
 
Methods inherited from class org.apache.derby.impl.sql.compile.ValueNode
bindExpression, changeToCNF, checkIsBoolean, checkReliability, checkReliability, checkTopPredicatesForEqualsConditions, copyFields, eliminateNots, genEqualsFalseTree, generate, generateFilter, genIsNullTree, genSQLJavaSQLTree, getClause, getConstantValueAsObject, getDataValueFactory, getTablesReferenced, getTransformed, getTypeCompiler, getTypeId, init, isBinaryEqualsOperatorNode, isBooleanFalse, isBooleanTrue, isConstantExpression, isParameterNode, isRelationalOperator, optimizableEqualityNode, preprocess, selectivity, setClause, setDescriptor, setTransformed, setType, verifyChangeToCNF, verifyEliminateNots, verifyPutAndsOnTop
 
Methods inherited from class org.apache.derby.impl.sql.compile.QueryTreeNode
accept, bind, convertDefaultNode, debugFlush, debugPrint, executeSchemaName, executeStatementName, formatNodeString, foundString, generate, generateAuthorizeCheck, getBeginOffset, getClassFactory, getCompilerContext, getContextManager, getCursorInfo, getDataDictionary, getDependencyManager, getEndOffset, getExecutionFactory, getGenericConstantActionFactory, getIntProperty, getLanguageConnectionContext, getNodeFactory, getNodeType, getNullNode, getParameterTypes, getRowEstimate, getSchemaDescriptor, getSchemaDescriptor, getSPSName, getStatementType, getTableDescriptor, getTypeCompiler, init, init, init, init, init, init, init, init, init, init, init, isAtomic, isInstanceOf, isSessionSchema, isSessionSchema, makeConstantAction, makeResultDescription, makeTableName, needsSavepoint, nodeHeader, optimize, parseQueryText, printLabel, referencesSessionSchema, setBeginOffset, setContextManager, setEndOffset, setNodeType, setRefActionInfo, treePrint, treePrint, verifyClassExist
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

columnName

public java.lang.String columnName

tableName

public TableName tableName

tableNumber

public int tableNumber

columnNumber

public int columnNumber

source

public ResultColumn source

origSource

ResultColumn origSource

origName

public java.lang.String origName

origTableNumber

int origTableNumber

origColumnNumber

int origColumnNumber

replacesAggregate

private boolean replacesAggregate

nestingLevel

private int nestingLevel

sourceLevel

private int sourceLevel

tokBeginOffset

private int tokBeginOffset

tokEndOffset

private int tokEndOffset
Constructor Detail

ColumnReference

public ColumnReference()
Method Detail

init

public void init(java.lang.Object columnName,
                 java.lang.Object tableName,
                 java.lang.Object tokBeginOffset,
                 java.lang.Object tokEndOffset)
Initializer. This one is called by the parser where we could be dealing with delimited identifiers.

Overrides:
init in class QueryTreeNode
Parameters:
columnName - The name of the column being referenced
tableName - The qualification for the column
tokBeginOffset - begin position of token for the column name identifier from parser.
tokEndOffset - end position of token for the column name identifier from parser.

init

public void init(java.lang.Object columnName,
                 java.lang.Object tableName)
Initializer.

Overrides:
init in class QueryTreeNode
Parameters:
columnName - The name of the column being referenced
tableName - The qualification for the column

toString

public java.lang.String toString()
Convert this object to a String. See comments in QueryTreeNode.java for how this should be done for tree printing.

Overrides:
toString in class ValueNode
Returns:
This object as a String

printSubNodes

public void printSubNodes(int depth)
Prints the sub-nodes of this object. See QueryTreeNode.java for how tree printing is supposed to work.

Overrides:
printSubNodes in class QueryTreeNode
Parameters:
depth - The depth of this node in the tree
Returns:
Nothing

getTokenBeginOffset

public int getTokenBeginOffset()
Get the begin offset of the parser token for the column name Will only be set when the CR was generated by the parser.

Returns:
the begin offset of the token. -1 means unknown

getTokenEndOffset

public int getTokenEndOffset()
Get the end offset of the parser token for the column name. Will only be set when the CR was generated by the parser.

Returns:
the end offset of the token. -1 means unknown

getCorrelated

boolean getCorrelated()
Return whether or not this CR is correlated.

Returns:
Whether or not this CR is correlated.

setNestingLevel

void setNestingLevel(int nestingLevel)
Set the nesting level for this CR. (The nesting level at which the CR appears.)

Parameters:
nestingLevel - The Nesting level at which the CR appears.
Returns:
Nothing.

getNestingLevel

int getNestingLevel()
Get the nesting level for this CR.

Returns:
The nesting level for this CR.

setSourceLevel

void setSourceLevel(int sourceLevel)
Set the source level for this CR. (The nesting level of the source of the CR.)

Parameters:
sourceLevel - The Nesting level of the source of the CR.
Returns:
Nothing.

getSourceLevel

int getSourceLevel()
Get the source level for this CR.

Returns:
The source level for this CR.

markGeneratedToReplaceAggregate

public void markGeneratedToReplaceAggregate()
Mark this node as being generated to replace an aggregate. (Useful for replacing aggregates in the HAVING clause with column references to the matching aggregate in the user's SELECT.

Returns:
Nothing.

getGeneratedToReplaceAggregate

public boolean getGeneratedToReplaceAggregate()
Determine whether or not this node was generated to replace an aggregate in the user's SELECT.

Returns:
boolean Whether or not this node was generated to replace an aggregate in the user's SELECT.

getClone

public ValueNode getClone()
                   throws StandardException
Return a clone of this node.

Overrides:
getClone in class ValueNode
Returns:
ValueNode A clone of this node.
Throws:
StandardException - Thrown on error

copyFields

public void copyFields(ColumnReference oldCR)
                throws StandardException
Copy all of the "appropriate fields" for a shallow copy.

Parameters:
oldCR - The ColumnReference to copy from.
Throws:
StandardException - Thrown on error

bindExpression

public ValueNode bindExpression(FromList fromList,
                                SubqueryList subqueryList,
                                java.util.Vector aggregateVector)
                         throws StandardException
Bind this expression. This means binding the sub-expressions, as well as figuring out what the return type is for this expression. NOTE: We must explicitly check for a null FromList here, column reference without a FROM list, as the grammar allows the following: insert into t1 values(c1)

Overrides:
bindExpression in class ValueNode
Parameters:
fromList - The FROM list for the query this expression is in, for binding columns.
subqueryList - The subquery list being built as we find SubqueryNodes
aggregateVector - The aggregate vector being built as we find AggregateNodes
Returns:
The new top of the expression tree.
Throws:
StandardException - Thrown on error

getFullColumnName

public java.lang.String getFullColumnName()
Get the full column name of this column for purposes of error messages or debugging. The full column name includes the table name and schema name, if any.

Returns:
The full column name in the form schema.table.column

getColumnName

public java.lang.String getColumnName()
Get the name of this column

Overrides:
getColumnName in class ValueNode
Returns:
The name of this column

setColumnName

public void setColumnName(java.lang.String columnName)
Set the name of this column

Returns:
None.

getTableNumber

public int getTableNumber()
Get the table number for this ColumnReference.

Returns:
int The table number for this ColumnReference

setTableNumber

public void setTableNumber(int tableNumber)
Set this ColumnReference to refer to the given table number.

Returns:
Nothing

getTableName

public java.lang.String getTableName()
Get the user-supplied table name of this column. This will be null if the user did not supply a name (for example, select a from t).

Overrides:
getTableName in class ValueNode
Returns:
The user-supplied name of this column. Null if no user- supplied name.

getSourceTableName

public java.lang.String getSourceTableName()
Get the name of the table this column comes from.

Returns:
The name of the table that this column comes from. Null if not a ColumnReference.

getTableNameNode

public TableName getTableNameNode()
Return the table name as the node it is.

Returns:
the column's table name.

setTableNameNode

public void setTableNameNode(TableName tableName)

getColumnNumber

public int getColumnNumber()
Get the column number for this ColumnReference.

Returns:
int The column number for this ColumnReference

getSource

public ResultColumn getSource()
Get the source this columnReference

Returns:
The source of this columnReference

setSource

public void setSource(ResultColumn source)
Set the source this columnReference

Parameters:
source - The source of this columnReference
Returns:
None.

putAndsOnTop

public ValueNode putAndsOnTop()
                       throws StandardException
Do the 1st step in putting an expression into conjunctive normal form. This step ensures that the top level of the expression is a chain of AndNodes.

Overrides:
putAndsOnTop in class ValueNode
Returns:
The modified expression
Throws:
StandardException - Thrown on error

categorize

public boolean categorize(JBitSet referencedTabs,
                          boolean simplePredsOnly)
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. Also, don't allow a predicate to be pushed down if it contains a ColumnReference that replaces an aggregate. This can happen if the aggregate is in the HAVING clause. In this case, we would be pushing the predicate into the SelectNode that evaluates the aggregate, which doesn't make sense, since the having clause is supposed to be applied to the result of the SelectNode. RESOLVE - revisit this issue once we have views.

Overrides:
categorize in class ValueNode
Parameters:
referencedTabs - JBitSet with bit map of referenced FromTables
simplePredsOnly - Whether or not to consider method calls, field references and conditional nodes when building bit map
Returns:
boolean Whether or not source.expression is a ColumnReference or a VirtualColumnNode or a ConstantNode.

remapColumnReferences

public void remapColumnReferences()
Remap all of the ColumnReferences in this expression tree to point to the ResultColumn that is 1 level under their current source ResultColumn. This is useful for pushing down single table predicates. RESOLVE: Once we start pushing join clauses, we will need to walk the ResultColumn/VirtualColumnNode chain for them to remap the references.

Returns:
None.

unRemapColumnReferences

public void unRemapColumnReferences()

getSourceResultColumn

public ResultColumn getSourceResultColumn()
Description copied from class: ValueNode
Get the source for this ValueNode.

Overrides:
getSourceResultColumn in class ValueNode
Returns:
The source of this ValueNode.

remapColumnReferencesToExpressions

public ValueNode remapColumnReferencesToExpressions()
                                             throws StandardException
Remap all ColumnReferences in this tree to be clones of the underlying expression.

Overrides:
remapColumnReferencesToExpressions in class ValueNode
Returns:
ValueNode The remapped expression tree.
Throws:
StandardException - Thrown on error

getTablesReferenced

void getTablesReferenced(JBitSet refs)
Update the table map to reflect the source of this CR.

Parameters:
refs - The table map.
Returns:
Nothing.

isCloneable

public boolean isCloneable()
Return whether or not this expression tree is cloneable.

Overrides:
isCloneable in class ValueNode
Returns:
boolean Whether or not this expression tree is cloneable.

constantExpression

public boolean constantExpression(PredicateList whereClause)
Description copied from class: ValueNode
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.

Overrides:
constantExpression in class ValueNode
Returns:
True means this expression tree represents a constant value.
See Also:
ValueNode.constantExpression(org.apache.derby.impl.sql.compile.PredicateList)

generateExpression

public void generateExpression(ExpressionClassBuilder acb,
                               MethodBuilder mb)
                        throws StandardException
ColumnReference's are to the current row in the system. This lets us generate a faster get that simply returns the column from the current row, rather than getting the value out and returning that, only to have the caller (in the situations needed) stuffing it back into a new column holder object. We will assume the general generate() path is for getting the value out, and use generateColumn() when we want to keep the column wrapped.

Overrides:
generateExpression in class ValueNode
Parameters:
mb - The method the expression will go into
Throws:
StandardException - Thrown on error

getSchemaName

public java.lang.String getSchemaName()
Get the user-supplied schema name of this column. This will be null if the user did not supply a name (for example, select t.a from t).

Overrides:
getSchemaName in class ValueNode
Returns:
The user-supplied schema name of this column. Null if no user- supplied name.

getOrderableVariantType

protected int getOrderableVariantType()
Return the variant type for the underlying expression. The variant type can be: VARIANT - variant within a scan (method calls and non-static field access) SCAN_INVARIANT - invariant within a scan (column references from outer tables) QUERY_INVARIANT - invariant within the life of a query (constant expressions)

Overrides:
getOrderableVariantType in class ValueNode
Returns:
The variant type for the underlying expression.

pointsToColumnReference

boolean pointsToColumnReference()
Return whether or not the source of this ColumnReference is itself a ColumnReference.

Returns:
Whether or not the source of this ColumnReference is itself a ColumnReference.

getTypeServices

public DataTypeDescriptor getTypeServices()
Get the DataTypeServices from this Node.

Overrides:
getTypeServices in class ValueNode
Returns:
The DataTypeServices from this Node. This may be null if the node isn't bound yet.


Apache Derby V10.0 Engine Documentation - Copyright © 1997,2004 The Apache Software Foundation or its licensors, as applicable.