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

java.lang.Object
  extended by org.apache.derby.impl.sql.compile.QueryTreeNode
      extended by org.apache.derby.impl.sql.compile.ResultSetNode
          extended by org.apache.derby.impl.sql.compile.FromTable
              extended by org.apache.derby.impl.sql.compile.FromVTI
All Implemented Interfaces:
Optimizable, Visitable, VTIEnvironment

public class FromVTI
extends FromTable
implements VTIEnvironment

A FromVTI represents a VTI in the FROM list of a DML statement.


Field Summary
private  FormatableHashtable compileTimeConstants
           
private  boolean controlsDeferral
           
(package private)  JBitSet correlationMap
           
(package private)  JBitSet dependencyMap
           
private  boolean emptyForUpdate
          Was the FOR UPDATE clause empty (no columns specified).
(package private)  double estimatedCost
           
(package private)  double estimatedRowCount
           
(package private)  TableName exposedName
           
private  boolean forUpdatePresent
          Was a FOR UPDATE clause specified in a SELECT statement.
private  boolean implementsPushable
           
(package private)  boolean implementsVTICosting
           
(package private)  boolean isDerbyStyleTableFunction
           
private  boolean isInsensitive
           
(package private)  boolean isRestrictedTableFunction
           
(package private)  boolean isTarget
           
(package private)  boolean materializable
           
(package private)  MethodCallNode methodCall
           
private  JavaValueNode[] methodParms
           
protected  int numVTICols
           
(package private)  boolean optimized
           
private  java.lang.String[] projectedColumnNames
           
private  java.sql.PreparedStatement ps
           
private  PredicateList restrictionList
           
private  int resultSetType
           
(package private)  java.sql.ResultSet rs
           
(package private)  SubqueryList subqueryList
           
(package private)  boolean supportsMultipleInstantiations
           
protected  boolean version2
           
(package private)  boolean vtiCosted
           
private  Restriction vtiRestriction
           
 
Fields inherited from class org.apache.derby.impl.sql.compile.FromTable
ADD_PLAN, bestAccessPath, bestCostEstimate, bestSortAvoidancePath, correlationName, corrTableName, currentAccessPath, hashKeyColumns, initialCapacity, level, LOAD_PLAN, loadFactor, maxCapacity, origTableName, REMOVE_PLAN, tableNumber, tableProperties, trulyTheBestAccessPath, userSpecifiedJoinStrategy
 
Fields inherited from class org.apache.derby.impl.sql.compile.ResultSetNode
costEstimate, cursorTargetTable, finalCostEstimate, insertSource, optimizer, referencedTableMap, resultColumns, resultSetNumber, scratchCostEstimate, statementResultSet
 
Fields inherited from class org.apache.derby.impl.sql.compile.QueryTreeNode
AUTOINCREMENT_CREATE_MODIFY, AUTOINCREMENT_INC_INDEX, AUTOINCREMENT_IS_AUTOINCREMENT_INDEX, AUTOINCREMENT_START_INDEX, isPrivilegeCollectionRequired
 
Constructor Summary
FromVTI()
           
 
Method Summary
(package private)  void acceptChildren(Visitor v)
          Accept the visitor for all visitable children of this node.
 void adjustForSortElimination()
          Notify the underlying result set tree that the optimizer has chosen to "eliminate" a sort.
 void bindExpressions(FromList fromListParam)
          Bind the expressions in this VTI.
 ResultSetNode bindNonVTITables(DataDictionary dataDictionary, FromList fromListParam)
          Bind the non VTI tables in this ResultSetNode.
 ResultSetNode bindVTITables(FromList fromListParam)
          Bind this VTI that appears in the FROM list.
private  boolean canBePushedDown(Predicate predicate)
          Return true if the predicate can be pushed into a RestrictedVTI
private  java.util.HashMap computeProjection()
          Fills in the array of projected column names suitable for handing to RestrictedVTI.initScan().
(package private)  void computeProjectionAndRestriction(PredicateList parentPredicates)
          Compute the projection and restriction to be pushed to the external table function if it is a RestrictedVTI.
private  void computeRestriction(PredicateList parentPredicates, java.util.HashMap columnNameMap)
          Fills in the restriction to be handed to a RestrictedVTI at run-time.
private  void createResultColumnsForTableFunction(TypeDescriptor td)
          Add result columns for a Derby-style Table Function
 CostEstimate estimateCost(OptimizablePredicateList predList, ConglomerateDescriptor cd, CostEstimate outerCost, Optimizer optimizer, RowOrdering rowOrdering)
          Estimate the cost of scanning this Optimizable using the given predicate list with the given conglomerate.
private  int flipOperator(int rawOperator)
          Flip the sense of a comparison
 void generate(ActivationClassBuilder acb, MethodBuilder mb)
          Generation on a FromVTI creates a wrapper around the user's java.sql.ResultSet
private  void generateConstructor(ActivationClassBuilder acb, MethodBuilder mb, boolean reuseablePs)
           
protected  ResultSetNode genProjectRestrict(int numTables)
          Put a ProjectRestrictNode on top of each FromTable in the FromList.
private  ResultColumnList genResultColList(TableDescriptor td)
           
 ResultColumnList getAllResultColumns(TableName allTableName)
          Expand a "*" into a ResultColumnList with all of the result columns from the subquery.
 DeferModification getDeferralControl()
          Get the DeferModification interface associated with this VTI
 java.lang.String getExposedName()
          Get the exposed name for this table, which is the name that can be used to refer to it in the rest of the query.
 TableName getExposedTableName()
           
private  int[] getForUpdateColumnList()
           
 ResultColumn getMatchingColumn(ColumnReference columnReference)
          Try to find a ResultColumn in the table represented by this FromBaseTable that matches the name in the given ColumnReference.
 MethodCallNode getMethodCall()
          Return the constructor or static method invoked from this node
private  java.lang.Object getNewInstance()
           
(package private)  java.util.Vector getNodesFromParameters(java.lang.Class nodeClass)
          Get all of the nodes of the specified class from the parameters to this VTI.
 java.lang.String getOriginalSQL()
          Return the SQL text of the original SQL statement.
 java.sql.ResultSetMetaData getResultSetMetaData()
          Get the ResultSetMetaData for the class/object.
 int getResultSetType()
           
private  int getScanArguments(ActivationClassBuilder acb, MethodBuilder mb)
           
 java.lang.Object getSharedState(java.lang.String key)
          Get an object associated with a key from set of objects maintained with the statement plan.
private  UUID getSpecialTriggerVTITableName(LanguageConnectionContext lcc, java.lang.String className)
          Check and see if we have a special trigger VTI.
 int getStatementIsolationLevel()
          Get the specific JDBC isolation of the statement.
private  VTICosting getVTICosting()
          Get the VTICosting implementation for this optimizable VTI.
(package private)  java.lang.String getVTIName()
           
private  Restriction iAmConfused(ValueNode clause)
          This is a handy place to put instrumentation for tracing trees which we don't understand
private  boolean implementsDerbyStyleVTICosting(java.lang.String className)
          Return true if this Derby Style Table Function implements the VTICosting interface.
 void init(java.lang.Object invocation, java.lang.Object correlationName, java.lang.Object derivedRCL, java.lang.Object tableProperties)
          Initialize a query tree node.
 void init(java.lang.Object invocation, java.lang.Object correlationName, java.lang.Object derivedRCL, java.lang.Object tableProperties, java.lang.Object exposedTableName)
          Initialize a query tree node.
 boolean isCompileTime()
          Return true if this instance of the Table Function has been created for compilation, false if it is for runtime execution.
 boolean isConstructor()
          Return true if this VTI is a constructor.
 boolean isMaterializable()
          Tell whether this Optimizable is materializable
(package private)  boolean isUpdatableCursor()
           
 boolean legalJoinOrder(JBitSet assignedTableMap)
          Can this Optimizable appear at the current location in the join order.
private  java.lang.Class lookupClass(java.lang.String className)
          Lookup the class that holds the VTI.
private  Restriction makeIsNullRestriction(IsNullNode clause, java.util.HashMap columnNameMap)
          Makes an IS NULL comparison of a column in the VTI.
private  Restriction makeLeafRestriction(BinaryRelationalOperatorNode clause, java.util.HashMap columnNameMap)
          Makes a Restriction out of a comparison between a constant and a column in the VTI.
private  Restriction makeRestriction(ValueNode clause, java.util.HashMap columnNameMap)
          Turn a compile-time WHERE clause fragment into a run-time Restriction.
private  int mapOperator(int rawOperator)
          Map internal operator constants to user-visible ones
protected  void markUpdatableByCursor(java.util.Vector updateColumns)
          Mark as updatable all the columns in the result column list of this FromBaseTable that match the columns in the given update column list.
 Optimizable modifyAccessPath(JBitSet outerTables)
          Modify the access path for this Optimizable, as necessary.
 boolean needsSpecialRCLBinding()
           
 boolean performMaterialization(JBitSet outerTables)
          Return whether or not to materialize this ResultSet tree.
 ResultSetNode preprocess(int numTables, GroupByList gbl, FromList fromList)
          Preprocess a ResultSetNode - this currently means: o Generating a referenced table map for each ResultSetNode.
 void printSubNodes(int depth)
          Prints the sub-nodes of this object.
 boolean pushOptPredicate(OptimizablePredicate optimizablePredicate)
          Push an OptimizablePredicate down, if this node accepts it.
 boolean referencesTarget(java.lang.String name, boolean baseTable)
          Search to see if a query references the specifed table name.
 void setSharedState(java.lang.String key, java.io.Serializable value)
          Saves an object associated with a key that will be maintained for the lifetime of the statement plan.
(package private)  void setTarget()
          Mark this VTI as the target of a delete or update.
private  java.lang.Object squeezeConstantValue(ValueNode valueNode)
          Get the constant or parameter reference out of a comparand.
private  int storeObjectInPS(ActivationClassBuilder acb, java.lang.Object obj)
          Store an object in the prepared statement.
 boolean supportsMultipleInstantiations()
          Tell whether this Optimizable can be instantiated multiple times
 java.lang.String toString()
          Convert this object to a String.
 
Methods inherited from class org.apache.derby.impl.sql.compile.FromTable
assignCostEstimate, canBeOrdered, considerSortAvoidancePath, convertAbsoluteToRelativeColumnPosition, cursorTargetTable, decrementLevel, feasibleJoinStrategy, fillInReferencedTableMap, flatten, forUpdate, getBaseTableName, getBestAccessPath, getBestSortAvoidancePath, getCorrelationName, getCostEstimate, getCurrentAccessPath, getFinalCostEstimate, getFromTableByName, getLevel, getName, getNumColumnsReturned, getOrigTableName, getProperties, getResultColumnsForList, getSchemaDescriptor, getSchemaDescriptor, getScratchCostEstimate, getTableDescriptor, getTableName, getTableNumber, getTrulyTheBestAccessPath, getUserSpecifiedJoinStrategy, hashKeyColumns, hasTableNumber, init, initAccessPaths, initialCapacity, isBaseTable, isCoveringIndex, isFlattenableJoinNode, isOneRowScan, isTargetTable, loadFactor, LOJ_reorderable, maxCapacity, memoryUsageOK, nextAccessPath, optimizeIt, optimizeSubqueries, pullOptPredicates, pushExpressions, rememberAsBest, rememberJoinStrategyAsBest, rememberSortAvoidancePath, resetJoinStrategies, setCostEstimate, setHashKeyColumns, setLevel, setOrigTableName, setProperties, setTableNumber, startOptimizing, tellRowOrderingAboutConstantColumns, transformOuterJoins, uniqueJoin, updateBestPlanMap, verifyProperties
 
Methods inherited from class org.apache.derby.impl.sql.compile.ResultSetNode
addNewPredicate, adjustForSortElimination, assignResultSetNumber, bindExpressionsWithTables, bindResultColumns, bindResultColumns, bindTargetExpressions, bindUntypedNullsToResultColumns, changeAccessPath, columnTypesAndLengthsMatch, considerMaterialization, disablePrivilegeCollection, enhanceRCLForInsert, ensurePredicateList, flattenableInFromSubquery, generateNormalizationResultSet, generateResultSet, genProjectRestrict, genProjectRestrictForReordering, getCostEstimate, getCursorTargetTable, getFromList, getNewCostEstimate, getOptimizer, getOptimizerImpl, getRCLForInsert, getReferencedTableMap, getResultColumns, getResultSetNumber, isNotExists, isOneRowResultSet, isOrderedOn, isPossibleDistinctScan, isUpdatableCursor, LOJgetReferencedTables, makeResultDescription, makeResultDescriptors, markAsCursorTargetTable, markForDistinctScan, markStatementResultSet, modifyAccessPaths, modifyAccessPaths, notCursorTargetTable, notFlattenableJoin, numDistinctAggregates, optimize, parseDefault, projectResultColumns, pushOffsetFetchFirst, pushOrderByList, rejectParameters, rejectXMLValues, renameGeneratedResultNames, replaceOrForbidDefaults, returnsAtMostOneRow, setInsertSource, setReferencedTableMap, setResultColumns, setResultToBooleanTrueNode, setTableConstructorTypes, subqueryReferencesTarget, updateTargetLockMode, verifySelectStarSubquery
 
Methods inherited from class org.apache.derby.impl.sql.compile.QueryTreeNode
accept, bindOffsetFetch, bindRowMultiSet, bindUserType, checkReliability, checkReliability, convertDefaultNode, createTypeDependency, debugFlush, debugPrint, formatNodeString, foundString, generateAuthorizeCheck, getBeginOffset, getClassFactory, getCompilerContext, getContextManager, getCursorInfo, getDataDictionary, getDependencyManager, getEndOffset, getExecutionFactory, getGenericConstantActionFactory, getIntProperty, getLanguageConnectionContext, getNodeFactory, getNodeType, getNullNode, getParameterTypes, getRowEstimate, getSchemaDescriptor, getSchemaDescriptor, getStatementType, getTableDescriptor, getTypeCompiler, init, init, init, init, init, init, init, init, init, init, init, isAtomic, isInstanceOf, isPrivilegeCollectionRequired, isSessionSchema, isSessionSchema, makeConstantAction, makeTableName, makeTableName, nodeHeader, orReliability, parseStatement, printLabel, referencesSessionSchema, resolveTableToSynonym, setBeginOffset, setContextManager, setEndOffset, setNodeType, setRefActionInfo, stackPrint, treePrint, treePrint, verifyClassExist
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface org.apache.derby.iapi.sql.compile.Optimizable
getDataDictionary, getReferencedTableMap, getResultSetNumber
 

Field Detail

correlationMap

JBitSet correlationMap

dependencyMap

JBitSet dependencyMap

methodCall

MethodCallNode methodCall

exposedName

TableName exposedName

subqueryList

SubqueryList subqueryList

implementsVTICosting

boolean implementsVTICosting

optimized

boolean optimized

materializable

boolean materializable

isTarget

boolean isTarget

isDerbyStyleTableFunction

boolean isDerbyStyleTableFunction

isRestrictedTableFunction

boolean isRestrictedTableFunction

rs

java.sql.ResultSet rs

compileTimeConstants

private FormatableHashtable compileTimeConstants

numVTICols

protected int numVTICols

restrictionList

private PredicateList restrictionList

forUpdatePresent

private boolean forUpdatePresent
Was a FOR UPDATE clause specified in a SELECT statement.


emptyForUpdate

private boolean emptyForUpdate
Was the FOR UPDATE clause empty (no columns specified).


estimatedCost

double estimatedCost

estimatedRowCount

double estimatedRowCount

supportsMultipleInstantiations

boolean supportsMultipleInstantiations

vtiCosted

boolean vtiCosted

version2

protected boolean version2

implementsPushable

private boolean implementsPushable

ps

private java.sql.PreparedStatement ps

methodParms

private JavaValueNode[] methodParms

controlsDeferral

private boolean controlsDeferral

isInsensitive

private boolean isInsensitive

resultSetType

private int resultSetType

projectedColumnNames

private java.lang.String[] projectedColumnNames

vtiRestriction

private Restriction vtiRestriction
Constructor Detail

FromVTI

public FromVTI()
Method Detail

init

public void init(java.lang.Object invocation,
                 java.lang.Object correlationName,
                 java.lang.Object derivedRCL,
                 java.lang.Object tableProperties)
          throws StandardException
Description copied from class: QueryTreeNode
Initialize a query tree node.

Overrides:
init in class QueryTreeNode
Parameters:
invocation - The constructor or static method for the VTI
correlationName - The correlation name
derivedRCL - The derived column list
tableProperties - Properties list associated with the table
Throws:
StandardException - Thrown on error

init

public void init(java.lang.Object invocation,
                 java.lang.Object correlationName,
                 java.lang.Object derivedRCL,
                 java.lang.Object tableProperties,
                 java.lang.Object exposedTableName)
          throws StandardException
Description copied from class: QueryTreeNode
Initialize a query tree node.

Overrides:
init in class QueryTreeNode
Parameters:
invocation - The constructor or static method for the VTI
correlationName - The correlation name
derivedRCL - The derived column list
tableProperties - Properties list associated with the table
exposedTableName - The table name (TableName class)
Throws:
StandardException - Thrown on error

estimateCost

public CostEstimate estimateCost(OptimizablePredicateList predList,
                                 ConglomerateDescriptor cd,
                                 CostEstimate outerCost,
                                 Optimizer optimizer,
                                 RowOrdering rowOrdering)
                          throws StandardException
Description copied from interface: Optimizable
Estimate the cost of scanning this Optimizable using the given predicate list with the given conglomerate. It is assumed that the predicate list has already been classified. This cost estimate is just for one scan, not for the life of the query.

Specified by:
estimateCost in interface Optimizable
Overrides:
estimateCost in class FromTable
Parameters:
predList - The predicate list to optimize against
cd - The conglomerate descriptor to get the cost of
outerCost - The estimated cost of the part of the plan outer to this optimizable.
optimizer - The optimizer to use to help estimate the cost
rowOrdering - The row ordering for all the tables in the join order, including this one.
Returns:
The estimated cost of doing the scan
Throws:
StandardException - Thrown on error
See Also:
Optimizable.estimateCost(org.apache.derby.iapi.sql.compile.OptimizablePredicateList, org.apache.derby.iapi.sql.dictionary.ConglomerateDescriptor, org.apache.derby.iapi.sql.compile.CostEstimate, org.apache.derby.iapi.sql.compile.Optimizer, org.apache.derby.iapi.sql.compile.RowOrdering)

legalJoinOrder

public boolean legalJoinOrder(JBitSet assignedTableMap)
Description copied from interface: Optimizable
Can this Optimizable appear at the current location in the join order. In other words, have the Optimizable's dependencies been satisfied?

Specified by:
legalJoinOrder in interface Optimizable
Overrides:
legalJoinOrder in class FromTable
Parameters:
assignedTableMap - The tables that have been placed so far in the join order.
Returns:
Where or not this Optimizable can appear at the current location in the join order.
See Also:
Optimizable.legalJoinOrder(org.apache.derby.iapi.util.JBitSet)

isMaterializable

public boolean isMaterializable()
Description copied from interface: Optimizable
Tell whether this Optimizable is materializable

Specified by:
isMaterializable in interface Optimizable
Overrides:
isMaterializable in class FromTable
See Also:
Optimizable.isMaterializable()

supportsMultipleInstantiations

public boolean supportsMultipleInstantiations()
Description copied from interface: Optimizable
Tell whether this Optimizable can be instantiated multiple times

Specified by:
supportsMultipleInstantiations in interface Optimizable
Overrides:
supportsMultipleInstantiations in class FromTable
See Also:
Optimizable.supportsMultipleInstantiations()

adjustForSortElimination

public void adjustForSortElimination()
Description copied from class: ResultSetNode
Notify the underlying result set tree that the optimizer has chosen to "eliminate" a sort. Sort elimination can happen as part of preprocessing (see esp. SelectNode.preprocess(...)) or it can happen if the optimizer chooses an access path that inherently returns the rows in the correct order (also known as a "sort avoidance" plan). In either case we drop the sort and rely on the underlying result set tree to return its rows in the correct order. For most types of ResultSetNodes we automatically get the rows in the correct order if the sort was eliminated. One exception to this rule, though, is the case of an IndexRowToBaseRowNode, for which we have to disable bulk fetching on the underlying base table. Otherwise the index scan could return rows out of order if the base table is updated while the scan is "in progress" (i.e. while the result set is open). In order to account for this (and potentially other, similar issues in the future) this method exists to notify the result set node that it is expected to return rows in the correct order. The result set can then take necessary action to satsify this requirement--such as disabling bulk fetch in the case of IndexRowToBaseRowNode. All of that said, any ResultSetNodes for which we could potentially eliminate sorts should override this method accordingly. So we don't ever expect to get here.

Overrides:
adjustForSortElimination in class ResultSetNode
See Also:
ResultSetNode.adjustForSortElimination()

modifyAccessPath

public Optimizable modifyAccessPath(JBitSet outerTables)
                             throws StandardException
Description copied from interface: Optimizable
Modify the access path for this Optimizable, as necessary. This includes things like adding a result set to translate from index rows to base rows

Specified by:
modifyAccessPath in interface Optimizable
Overrides:
modifyAccessPath in class FromTable
Parameters:
outerTables - Bit map of the tables that are outer to this one in the join order.
Returns:
The (potentially new) Optimizable at the top of the tree.
Throws:
StandardException - Thrown on error
See Also:
Optimizable.modifyAccessPath(org.apache.derby.iapi.util.JBitSet)

pushOptPredicate

public boolean pushOptPredicate(OptimizablePredicate optimizablePredicate)
                         throws StandardException
Description copied from interface: Optimizable
Push an OptimizablePredicate down, if this node accepts it.

Specified by:
pushOptPredicate in interface Optimizable
Overrides:
pushOptPredicate in class FromTable
Parameters:
optimizablePredicate - OptimizablePredicate to push down.
Returns:
Whether or not the predicate was pushed down.
Throws:
StandardException - Thrown on error
See Also:
Optimizable.pushOptPredicate(org.apache.derby.iapi.sql.compile.OptimizablePredicate)

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 FromTable
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 ResultSetNode
Parameters:
depth - The depth of this node in the tree

isConstructor

public boolean isConstructor()
Return true if this VTI is a constructor. Otherwise, it is a static method.


getMethodCall

public MethodCallNode getMethodCall()
Return the constructor or static method invoked from this node


getExposedName

public java.lang.String getExposedName()
Get the exposed name for this table, which is the name that can be used to refer to it in the rest of the query.

Overrides:
getExposedName in class FromTable
Returns:
The exposed name for this table.

getExposedTableName

public TableName getExposedTableName()
Returns:
the table name used for matching with column references.

setTarget

void setTarget()
Mark this VTI as the target of a delete or update.


bindNonVTITables

public ResultSetNode bindNonVTITables(DataDictionary dataDictionary,
                                      FromList fromListParam)
                               throws StandardException
Bind the non VTI tables in this ResultSetNode. This includes getting their descriptors from the data dictionary and numbering them.

Overrides:
bindNonVTITables in class ResultSetNode
Parameters:
dataDictionary - The DataDictionary to use for binding
fromListParam - FromList to use/append to.
Returns:
ResultSetNode
Throws:
StandardException - Thrown on error

getVTIName

java.lang.String getVTIName()
Returns:
The name of the VTI, mainly for debugging and error messages.

bindVTITables

public ResultSetNode bindVTITables(FromList fromListParam)
                            throws StandardException
Bind this VTI that appears in the FROM list.

Overrides:
bindVTITables in class ResultSetNode
Parameters:
fromListParam - FromList to use/append to.
Returns:
ResultSetNode The bound FromVTI.
Throws:
StandardException - Thrown on error

getResultSetMetaData

public java.sql.ResultSetMetaData getResultSetMetaData()
                                                throws StandardException
Get the ResultSetMetaData for the class/object. We first look for the optional static method which has the same signature as the constructor. If it doesn't exist, then we instantiate an object and get the ResultSetMetaData from that object.

Returns:
The ResultSetMetaData from the class/object.
Throws:
StandardException - Thrown on error

getNewInstance

private java.lang.Object getNewInstance()
                                 throws StandardException
Throws:
StandardException

getDeferralControl

public DeferModification getDeferralControl()
                                     throws StandardException
Get the DeferModification interface associated with this VTI

Returns:
null if the VTI uses the default modification deferral
Throws:
StandardException

getResultSetType

public int getResultSetType()
Returns:
the ResultSet type of the VTI, TYPE_FORWARD_ONLY if the getResultSetType() method of the VTI class throws an exception.

bindExpressions

public void bindExpressions(FromList fromListParam)
                     throws StandardException
Bind the expressions in this VTI. This means binding the sub-expressions, as well as figuring out what the return type is for each expression.

Overrides:
bindExpressions in class ResultSetNode
Parameters:
fromListParam - FromList to use/append to.
Throws:
StandardException - Thrown on error

getNodesFromParameters

java.util.Vector getNodesFromParameters(java.lang.Class nodeClass)
                                  throws StandardException
Get all of the nodes of the specified class from the parameters to this VTI.

Parameters:
nodeClass - The Class of interest.
Returns:
A vector containing all of the nodes of interest.
Throws:
StandardException - Thrown on error

getAllResultColumns

public ResultColumnList getAllResultColumns(TableName allTableName)
                                     throws StandardException
Expand a "*" into a ResultColumnList with all of the result columns from the subquery.

Overrides:
getAllResultColumns in class ResultSetNode
Parameters:
allTableName - The qualifier on the "*"
Returns:
ResultColumnList The expanded list, or null if allTableName is non-null and doesn't match a table name in this result set
Throws:
StandardException - Thrown on error

getMatchingColumn

public ResultColumn getMatchingColumn(ColumnReference columnReference)
                               throws StandardException
Try to find a ResultColumn in the table represented by this FromBaseTable that matches the name in the given ColumnReference.

Overrides:
getMatchingColumn in class ResultSetNode
Parameters:
columnReference - The columnReference whose name we're looking for in the given table.
Returns:
A ResultColumn whose expression is the ColumnNode that matches the ColumnReference. Returns null if there is no match.
Throws:
StandardException - Thrown on error

preprocess

public ResultSetNode preprocess(int numTables,
                                GroupByList gbl,
                                FromList fromList)
                         throws StandardException
Preprocess a ResultSetNode - this currently means: o Generating a referenced table map for each ResultSetNode. o Putting the WHERE and HAVING clauses in conjunctive normal form (CNF). o Converting the WHERE and HAVING clauses into PredicateLists and classifying them. o Ensuring that a ProjectRestrictNode is generated on top of every FromBaseTable and generated in place of every FromSubquery. o Pushing single table predicates down to the new ProjectRestrictNodes.

Overrides:
preprocess in class ResultSetNode
Parameters:
numTables - The number of tables in the DML Statement
gbl - The group by list, if any
fromList - The from list, if any
Returns:
ResultSetNode at top of preprocessed tree.
Throws:
StandardException - Thrown on error

genProjectRestrict

protected ResultSetNode genProjectRestrict(int numTables)
                                    throws StandardException
Put a ProjectRestrictNode on top of each FromTable in the FromList. ColumnReferences must continue to point to the same ResultColumn, so that ResultColumn must percolate up to the new PRN. However, that ResultColumn will point to a new expression, a VirtualColumnNode, which points to the FromTable and the ResultColumn that is the source for the ColumnReference. (The new PRN will have the original of the ResultColumnList and the ResultColumns from that list. The FromTable will get shallow copies of the ResultColumnList and its ResultColumns. ResultColumn.expression will remain at the FromTable, with the PRN getting a new VirtualColumnNode for each ResultColumn.expression.) We then project out the non-referenced columns. If there are no referenced columns, then the PRN's ResultColumnList will consist of a single ResultColumn whose expression is 1.

Overrides:
genProjectRestrict in class ResultSetNode
Parameters:
numTables - Number of tables in the DML Statement
Returns:
The generated ProjectRestrictNode atop the original FromTable.
Throws:
StandardException - Thrown on error

performMaterialization

public boolean performMaterialization(JBitSet outerTables)
                               throws StandardException
Return whether or not to materialize this ResultSet tree.

Overrides:
performMaterialization in class ResultSetNode
Returns:
Whether or not to materialize this ResultSet tree. would return valid results.
Throws:
StandardException - Thrown on error

computeProjectionAndRestriction

void computeProjectionAndRestriction(PredicateList parentPredicates)
                               throws StandardException
Compute the projection and restriction to be pushed to the external table function if it is a RestrictedVTI. This method is called by the parent ProjectRestrictNode at code generation time. See DERBY-4357.

Parameters:
parentPredicates - The full list of predicates to be applied by the parent ProjectRestrictNode
Throws:
StandardException

computeProjection

private java.util.HashMap computeProjection()
                                     throws StandardException
Fills in the array of projected column names suitable for handing to RestrictedVTI.initScan(). Returns a map of the exposed column names to the actual names of columns in the table function. This is useful because the predicate refers to the exposed column names.

Throws:
StandardException

computeRestriction

private void computeRestriction(PredicateList parentPredicates,
                                java.util.HashMap columnNameMap)
                         throws StandardException
Fills in the restriction to be handed to a RestrictedVTI at run-time.

Parameters:
parentPredicates - The full list of predicates to be applied by the parent ProjectRestrictNode
columnNameMap - Mapping between the exposed column names used in the predicates and the actual column names declared for the table function at CREATE FUNCTION time.
Throws:
StandardException

canBePushedDown

private boolean canBePushedDown(Predicate predicate)
                         throws StandardException
Return true if the predicate can be pushed into a RestrictedVTI

Throws:
StandardException

makeRestriction

private Restriction makeRestriction(ValueNode clause,
                                    java.util.HashMap columnNameMap)
                             throws StandardException
Turn a compile-time WHERE clause fragment into a run-time Restriction. Returns null if the clause could not be understood.

Parameters:
clause - The clause which should be turned into a Restriction.
columnNameMap - Mapping between the exposed column names used in the predicates and the actual column names declared for the table function at CREATE FUNCTION time.
Throws:
StandardException

makeLeafRestriction

private Restriction makeLeafRestriction(BinaryRelationalOperatorNode clause,
                                        java.util.HashMap columnNameMap)
                                 throws StandardException
Makes a Restriction out of a comparison between a constant and a column in the VTI.

Parameters:
clause - The clause which should be turned into a Restriction.
columnNameMap - Mapping between the exposed column names used in the predicates and the actual column names declared for the table function at CREATE FUNCTION time.
Throws:
StandardException

makeIsNullRestriction

private Restriction makeIsNullRestriction(IsNullNode clause,
                                          java.util.HashMap columnNameMap)
                                   throws StandardException
Makes an IS NULL comparison of a column in the VTI.

Parameters:
clause - The IS NULL (or IS NOT NULL) node
columnNameMap - Mapping between the exposed column names used in the predicates and the actual column names declared for the table function at CREATE FUNCTION time.
Throws:
StandardException

iAmConfused

private Restriction iAmConfused(ValueNode clause)
                         throws StandardException
This is a handy place to put instrumentation for tracing trees which we don't understand

Throws:
StandardException

flipOperator

private int flipOperator(int rawOperator)
                  throws StandardException
Flip the sense of a comparison

Throws:
StandardException

mapOperator

private int mapOperator(int rawOperator)
                 throws StandardException
Map internal operator constants to user-visible ones

Throws:
StandardException

squeezeConstantValue

private java.lang.Object squeezeConstantValue(ValueNode valueNode)
                                       throws StandardException
Get the constant or parameter reference out of a comparand. Return null if we are confused. A parameter reference is wrapped in an integer array to distinguish it from a constant integer.

Throws:
StandardException

generate

public void generate(ActivationClassBuilder acb,
                     MethodBuilder mb)
              throws StandardException
Generation on a FromVTI creates a wrapper around the user's java.sql.ResultSet

Overrides:
generate in class QueryTreeNode
Parameters:
acb - The ActivationClassBuilder for the class being built
mb - The MethodBuilder for the execute() method to be built
Throws:
StandardException - Thrown on error

getScanArguments

private int getScanArguments(ActivationClassBuilder acb,
                             MethodBuilder mb)
                      throws StandardException
Throws:
StandardException

storeObjectInPS

private int storeObjectInPS(ActivationClassBuilder acb,
                            java.lang.Object obj)
                     throws StandardException
Store an object in the prepared statement. Returns -1 if the object is null. Otherwise returns the object's retrieval handle.

Throws:
StandardException

generateConstructor

private void generateConstructor(ActivationClassBuilder acb,
                                 MethodBuilder mb,
                                 boolean reuseablePs)
                          throws StandardException
Throws:
StandardException

referencesTarget

public boolean referencesTarget(java.lang.String name,
                                boolean baseTable)
                         throws StandardException
Search to see if a query references the specifed table name.

Overrides:
referencesTarget in class ResultSetNode
Parameters:
name - Table name (String) to search for.
baseTable - Whether or not name is for a base table
Returns:
true if found, else false
Throws:
StandardException - Thrown on error

acceptChildren

void acceptChildren(Visitor v)
              throws StandardException
Accept the visitor for all visitable children of this node.

Overrides:
acceptChildren in class ResultSetNode
Parameters:
v - the visitor
Throws:
StandardException - on error

getSpecialTriggerVTITableName

private UUID getSpecialTriggerVTITableName(LanguageConnectionContext lcc,
                                           java.lang.String className)
                                    throws StandardException
Check and see if we have a special trigger VTI. If it cannot be bound (because we aren't actually compiling or executing a trigger), then throw an exception.

Returns:
null if not a special trigger vti, or the table id if it is
Throws:
StandardException

genResultColList

private ResultColumnList genResultColList(TableDescriptor td)
                                   throws StandardException
Throws:
StandardException

needsSpecialRCLBinding

public boolean needsSpecialRCLBinding()
Overrides:
needsSpecialRCLBinding in class FromTable

isUpdatableCursor

boolean isUpdatableCursor()
                    throws StandardException
Throws:
StandardException

markUpdatableByCursor

protected void markUpdatableByCursor(java.util.Vector updateColumns)
Description copied from class: FromTable
Mark as updatable all the columns in the result column list of this FromBaseTable that match the columns in the given update column list. If the list is null, it means all the columns are updatable.

Overrides:
markUpdatableByCursor in class FromTable
Parameters:
updateColumns - A Vector representing the columns that can be updated.

getForUpdateColumnList

private int[] getForUpdateColumnList()

isCompileTime

public final boolean isCompileTime()
Description copied from interface: VTIEnvironment
Return true if this instance of the Table Function has been created for compilation, false if it is for runtime execution.

Specified by:
isCompileTime in interface VTIEnvironment

getOriginalSQL

public java.lang.String getOriginalSQL()
Description copied from interface: VTIEnvironment
Return the SQL text of the original SQL statement.

Specified by:
getOriginalSQL in interface VTIEnvironment

getStatementIsolationLevel

public final int getStatementIsolationLevel()
Description copied from interface: VTIEnvironment
Get the specific JDBC isolation of the statement. If it returns Connection.TRANSACTION_NONE then no isolation was specified and the connection's isolation level is implied.

Specified by:
getStatementIsolationLevel in interface VTIEnvironment

setSharedState

public void setSharedState(java.lang.String key,
                           java.io.Serializable value)
Description copied from interface: VTIEnvironment
Saves an object associated with a key that will be maintained for the lifetime of the statement plan. Any previous value associated with the key is discarded. Any saved object can be seen by any JDBC Connection that has a Statement object that references the same statement plan.

Specified by:
setSharedState in interface VTIEnvironment

getSharedState

public java.lang.Object getSharedState(java.lang.String key)
Description copied from interface: VTIEnvironment
Get an object associated with a key from set of objects maintained with the statement plan.

Specified by:
getSharedState in interface VTIEnvironment

createResultColumnsForTableFunction

private void createResultColumnsForTableFunction(TypeDescriptor td)
                                          throws StandardException
Add result columns for a Derby-style Table Function

Throws:
StandardException

implementsDerbyStyleVTICosting

private boolean implementsDerbyStyleVTICosting(java.lang.String className)
                                        throws StandardException
Return true if this Derby Style Table Function implements the VTICosting interface. The class must satisfy the following conditions:

Throws:
StandardException

getVTICosting

private VTICosting getVTICosting()
                          throws StandardException
Get the VTICosting implementation for this optimizable VTI.

Throws:
StandardException

lookupClass

private java.lang.Class lookupClass(java.lang.String className)
                             throws StandardException
Lookup the class that holds the VTI.

Throws:
StandardException

Built on Thu 2012-03-29 21:53:33+0000, from revision ???

Apache Derby V10.6 Internals - Copyright © 2004,2007 The Apache Software Foundation. All Rights Reserved.