Class FromVTI
- java.lang.Object
-
- org.apache.derby.impl.sql.compile.QueryTreeNode
-
- org.apache.derby.impl.sql.compile.ResultSetNode
-
- org.apache.derby.impl.sql.compile.FromTable
-
- org.apache.derby.impl.sql.compile.FromVTI
-
- All Implemented Interfaces:
Optimizable
,Visitable
,VTIEnvironment
class FromVTI extends FromTable implements VTIEnvironment
A FromVTI represents a VTI in the FROM list of a DML statement.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class org.apache.derby.impl.sql.compile.ResultSetNode
ResultSetNode.QueryExpressionClauses
-
-
Field Summary
Fields Modifier and Type Field Description private java.util.HashMap<java.lang.Integer,FromTable>
argSources
private FormatableHashtable
compileTimeConstants
private boolean
controlsDeferral
(package private) JBitSet
correlationMap
(package private) JBitSet
dependencyMap
(package private) double
estimatedCost
(package private) double
estimatedRowCount
(package private) TableName
exposedName
private boolean
implementsPushable
(package private) boolean
implementsVTICosting
(package private) boolean
isDerbyStyleTableFunction
(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.util.ArrayList<FromList>
outerFromLists
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.QueryTreeNode
AUTOINCREMENT_CREATE_MODIFY, AUTOINCREMENT_CYCLE, AUTOINCREMENT_INC_INDEX, AUTOINCREMENT_IS_AUTOINCREMENT_INDEX, AUTOINCREMENT_START_INDEX
-
-
Constructor Summary
Constructors Constructor Description FromVTI(MethodCallNode invocation, java.lang.String correlationName, ResultColumnList derivedRCL, java.util.Properties tableProperties, ContextManager cm)
Constructor.FromVTI(MethodCallNode invocation, java.lang.String correlationName, ResultColumnList derivedRCL, java.util.Properties tableProperties, TableName exposedTableName, ContextManager cm)
Constructor.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description (package private) void
acceptChildren(Visitor v)
Accept the visitor for all visitable children of this node.void
addOuterFromList(FromList fromList)
Add a FromList to the collection of FromLists which bindExpressions() checks when vetting VTI arguments which reference columns in other tables.(package private) void
adjustForSortElimination()
Notify the underlying result set tree that the optimizer has chosen to "eliminate" a sort.(package private) void
bindExpressions(FromList fromListParam)
Bind the expressions in this VTI.(package private) ResultSetNode
bindNonVTITables(DataDictionary dataDictionary, FromList fromListParam)
Bind the non VTI tables in this ResultSetNode.(package private) 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 RestrictedVTIprivate FromTable
columnInFromList(FromList fromList, ColumnReference ref)
If the referenced column appears in the indicated FROM list, then return the table it appears in.private java.util.HashMap<java.lang.String,java.lang.String>
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<java.lang.String,java.lang.String> columnNameMap)
Fills in the restriction to be handed to a RestrictedVTI at run-time.private void
constructorMinion(MethodCallNode invocation, ResultColumnList derivedRCL, TableName exposedTableName)
private void
createResultColumnsForTableFunction(TypeDescriptor td)
Add result columns for a Derby-style Table FunctionCostEstimate
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(package private) void
generate(ActivationClassBuilder acb, MethodBuilder mb)
Generation on a FromVTI creates a wrapper around the user's java.sql.ResultSetprivate 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)
(package private) 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(package private) 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()
(package private) ResultColumn
getMatchingColumn(ColumnReference columnReference)
Try to find a ResultColumn in the table represented by this FromBaseTable that matches the name in the given ColumnReference.(package private) MethodCallNode
getMethodCall()
Return the constructor or static method invoked from this nodeprivate java.lang.Object
getNewInstance()
(package private) <T extends Visitable>
java.util.List<T>getNodesFromParameters(java.lang.Class<T> 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.(package private) 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 understandprivate boolean
implementsDerbyStyleVTICosting(java.lang.String className)
Return true if this Derby Style Table Function implements the VTICosting interface.boolean
isCompileTime()
Return true if this instance of the Table Function has been created for compilation, false if it is for runtime execution.(package private) boolean
isConstructor()
Return true if this VTI is a constructor.boolean
isDerbyStyleTableFunction()
Return true if this is a user-defined table functionboolean
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<java.lang.String,java.lang.String> columnNameMap)
Makes an IS NULL comparison of a column in the VTI.private Restriction
makeLeafRestriction(BinaryRelationalOperatorNode clause, java.util.HashMap<java.lang.String,java.lang.String> 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<java.lang.String,java.lang.String> 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 onesOptimizable
modifyAccessPath(JBitSet outerTables)
Modify the access path for this Optimizable, as necessary.(package private) boolean
needsSpecialRCLBinding()
(package private) boolean
performMaterialization(JBitSet outerTables)
Return whether or not to materialize this ResultSet tree.(package private) ResultSetNode
preprocess(int numTables, GroupByList gbl, FromList fromList)
Preprocess a ResultSetNode - this currently means: o Generating a referenced table map for each ResultSetNode.(package private) void
printSubNodes(int depth)
Prints the sub-nodes of this object.boolean
pushOptPredicate(OptimizablePredicate optimizablePredicate)
Push an OptimizablePredicate down, if this node accepts it.(package private) boolean
referencesTarget(java.lang.String name, boolean baseTable)
Search to see if a query references the specifed table name.private void
remapBaseTableColumns()
Remap the column references in vti arguments.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 timesjava.lang.String
toString()
Convert this object to a String.-
Methods inherited from class org.apache.derby.impl.sql.compile.FromTable
assignCostEstimate, canBeOrdered, columnsAreUpdatable, considerSortAvoidancePath, convertAbsoluteToRelativeColumnPosition, cursorTargetTable, decrementLevel, feasibleJoinStrategy, fillInReferencedTableMap, flatten, forUpdate, getBaseTableName, getBestAccessPath, getBestSortAvoidancePath, getCorrelationName, getCostEstimate, getCurrentAccessPath, getFinalCostEstimate, getFromTableByName, getLevel, getMergeTableID, getName, getNumColumnsReturned, getOrigTableName, getProperties, getResultColumnsForList, getSchemaDescriptor, getSchemaDescriptor, getScratchCostEstimate, getTableDescriptor, getTableName, getTableNumber, getTrulyTheBestAccessPath, getUserSpecifiedJoinStrategy, hashKeyColumns, hasLargeObjectColumns, hasTableNumber, initAccessPaths, initialCapacity, isBaseTable, isCoveringIndex, isFlattenableJoinNode, isJoinColumnForRightOuterJoin, isOneRowScan, isTargetTable, loadFactor, LOJ_reorderable, markUpdatableByCursor, maxCapacity, memoryUsageOK, nextAccessPath, optimizeIt, optimizeSubqueries, pullOptPredicates, pushExpressions, rememberAsBest, rememberJoinStrategyAsBest, rememberSortAvoidancePath, resetJoinStrategies, setCostEstimateCost, setHashKeyColumns, setLevel, setMergeTableID, 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, enhanceRCLForInsert, ensurePredicateList, flattenableInFromSubquery, generateNormalizationResultSet, generateResultSet, genProjectRestrict, genProjectRestrictForReordering, getCandidateFinalCostEstimate, getCostEstimate, getCursorTargetTable, getFromList, getNewCostEstimate, getOptimizer, getOptimizerImpl, getRCLForInsert, getReferencedTableMap, getResultColumns, getResultSetNumber, getScratchCostEstimate, isCursorTargetTable, isInsertSource, isNotExists, isOneRowResultSet, isOrderedOn, isPossibleDistinctScan, isStatementResultSet, isUpdatableCursor, LOJgetReferencedTables, makeResultDescription, makeResultDescriptors, markAsCursorTargetTable, markForDistinctScan, markStatementResultSet, modifyAccessPaths, modifyAccessPaths, notCursorTargetTable, notFlattenableJoin, numDistinctAggregates, optimize, parseDefault, printQueryExpressionSuffixClauses, projectResultColumns, pushOffsetFetchFirst, pushOrderByList, pushQueryExpressionSuffix, rejectParameters, rejectXMLValues, renameGeneratedResultNames, replaceOrForbidDefaults, returnsAtMostOneRow, setCandidateFinalCostEstimate, setCostEstimate, setCursorTargetTable, setInsertSource, setOptimizer, setReferencedTableMap, setResultColumns, setResultSetNumber, setResultToBooleanTrueNode, setScratchCostEstimate, setTableConstructorTypes, subqueryReferencesTarget, updateTargetLockMode, verifySelectStarSubquery
-
Methods inherited from class org.apache.derby.impl.sql.compile.QueryTreeNode
accept, addTag, addUDTUsagePriv, addUDTUsagePriv, bindOffsetFetch, bindRowMultiSet, bindUserCatalogType, bindUserType, checkReliability, checkReliability, convertDefaultNode, copyTagsFrom, createTypeDependency, debugFlush, debugPrint, disablePrivilegeCollection, formatNodeString, generateAuthorizeCheck, getBeginOffset, getClassFactory, getCompilerContext, getContext, getContextManager, getDataDictionary, getDependencyManager, getEndOffset, getExecutionFactory, getGenericConstantActionFactory, getIntProperty, getLanguageConnectionContext, getLongProperty, getNullNode, getOffsetOrderedNodes, getOptimizerFactory, getOptimizerTracer, getParameterTypes, getSchemaDescriptor, getSchemaDescriptor, getStatementType, getTableDescriptor, getTypeCompiler, getUDTDesc, isAtomic, isPrivilegeCollectionRequired, isSessionSchema, isSessionSchema, makeConstantAction, makeTableName, makeTableName, nodeHeader, optimizerTracingIsOn, orReliability, parseSearchCondition, parseStatement, printLabel, referencesSessionSchema, resolveTableToSynonym, setBeginOffset, setEndOffset, setRefActionInfo, stackPrint, taggedWith, 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, getOptimizerTracer, getReferencedTableMap, getResultSetNumber, optimizerTracingIsOn
-
Methods inherited from interface org.apache.derby.iapi.sql.compile.Visitable
accept, addTag, taggedWith
-
-
-
-
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 final FormatableHashtable compileTimeConstants
-
numVTICols
protected int numVTICols
-
restrictionList
private PredicateList restrictionList
-
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
-
resultSetType
private int resultSetType
-
projectedColumnNames
private java.lang.String[] projectedColumnNames
-
vtiRestriction
private Restriction vtiRestriction
-
outerFromLists
private java.util.ArrayList<FromList> outerFromLists
-
argSources
private java.util.HashMap<java.lang.Integer,FromTable> argSources
-
-
Constructor Detail
-
FromVTI
FromVTI(MethodCallNode invocation, java.lang.String correlationName, ResultColumnList derivedRCL, java.util.Properties tableProperties, ContextManager cm) throws StandardException
Constructor.- Parameters:
invocation
- The constructor or static method for the VTIcorrelationName
- The correlation namederivedRCL
- The derived column listtableProperties
- Properties list associated with the table- Throws:
StandardException
- Thrown on error
-
FromVTI
FromVTI(MethodCallNode invocation, java.lang.String correlationName, ResultColumnList derivedRCL, java.util.Properties tableProperties, TableName exposedTableName, ContextManager cm)
Constructor.- Parameters:
invocation
- The constructor or static method for the VTIcorrelationName
- The correlation namederivedRCL
- The derived column listtableProperties
- Properties list associated with the tableexposedTableName
- The table name (TableName class)cm
- The context manager
-
-
Method Detail
-
constructorMinion
private void constructorMinion(MethodCallNode invocation, ResultColumnList derivedRCL, TableName exposedTableName)
-
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 interfaceOptimizable
- Overrides:
estimateCost
in classFromTable
- Parameters:
predList
- The predicate list to optimize againstcd
- The conglomerate descriptor to get the cost ofouterCost
- The estimated cost of the part of the plan outer to this optimizable.optimizer
- The optimizer to use to help estimate the costrowOrdering
- 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 interfaceOptimizable
- Overrides:
legalJoinOrder
in classFromTable
- 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 interfaceOptimizable
- Overrides:
isMaterializable
in classFromTable
- 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 interfaceOptimizable
- Overrides:
supportsMultipleInstantiations
in classFromTable
- See Also:
Optimizable.supportsMultipleInstantiations()
-
isDerbyStyleTableFunction
public boolean isDerbyStyleTableFunction()
Return true if this is a user-defined table function
-
adjustForSortElimination
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 classResultSetNode
- 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 interfaceOptimizable
- Overrides:
modifyAccessPath
in classFromTable
- 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)
-
addOuterFromList
public void addOuterFromList(FromList fromList)
Add a FromList to the collection of FromLists which bindExpressions() checks when vetting VTI arguments which reference columns in other tables. See DERBY-5554 and DERBY-5779.
-
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 interfaceOptimizable
- Overrides:
pushOptPredicate
in classFromTable
- 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.
-
printSubNodes
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 classResultSetNode
- Parameters:
depth
- The depth of this node in the tree
-
isConstructor
boolean isConstructor()
Return true if this VTI is a constructor. Otherwise, it is a static method.
-
getMethodCall
final MethodCallNode getMethodCall()
Return the constructor or static method invoked from this node
-
getExposedName
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 classFromTable
- 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
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 classResultSetNode
- Parameters:
dataDictionary
- The DataDictionary to use for bindingfromListParam
- 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
ResultSetNode bindVTITables(FromList fromListParam) throws StandardException
Bind this VTI that appears in the FROM list.- Overrides:
bindVTITables
in classResultSetNode
- Parameters:
fromListParam
- FromList to use/append to.- Returns:
- ResultSetNode The bound FromVTI.
- Throws:
StandardException
- Thrown on error
-
getResultSetMetaData
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
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 classResultSetNode
- Parameters:
fromListParam
- FromList to use/append to.- Throws:
StandardException
- Thrown on error
-
columnInFromList
private FromTable columnInFromList(FromList fromList, ColumnReference ref) throws StandardException
If the referenced column appears in the indicated FROM list, then return the table it appears in.- Throws:
StandardException
-
getNodesFromParameters
<T extends Visitable> java.util.List<T> getNodesFromParameters(java.lang.Class<T> 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 list containing all of the nodes of interest.
- Throws:
StandardException
- Thrown on error
-
getAllResultColumns
ResultColumnList getAllResultColumns(TableName allTableName) throws StandardException
Expand a "*" into a ResultColumnList with all of the result columns from the subquery.- Overrides:
getAllResultColumns
in classResultSetNode
- Parameters:
allTableName
- The qualifier on the "*"- Returns:
- ResultColumnList The expanded list, or
null
ifallTableName
is non-null and doesn't match a table name in this result set - Throws:
StandardException
- Thrown on error
-
getMatchingColumn
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 classResultSetNode
- 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
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 classResultSetNode
- Parameters:
numTables
- The number of tables in the DML Statementgbl
- The group by list, if anyfromList
- 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 classResultSetNode
- Parameters:
numTables
- Number of tables in the DML Statement- Returns:
- The generated ProjectRestrictNode atop the original FromTable.
- Throws:
StandardException
- Thrown on error
-
performMaterialization
boolean performMaterialization(JBitSet outerTables) throws StandardException
Return whether or not to materialize this ResultSet tree.- Overrides:
performMaterialization
in classResultSetNode
- 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<java.lang.String,java.lang.String> 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<java.lang.String,java.lang.String> 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 ProjectRestrictNodecolumnNameMap
- 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<java.lang.String,java.lang.String> 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<java.lang.String,java.lang.String> 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<java.lang.String,java.lang.String> columnNameMap) throws StandardException
Makes an IS NULL comparison of a column in the VTI.- Parameters:
clause
- The IS NULL (or IS NOT NULL) nodecolumnNameMap
- 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
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 classQueryTreeNode
- Parameters:
acb
- The ActivationClassBuilder for the class being builtmb
- The MethodBuilder for the execute() method to be built- Throws:
StandardException
- Thrown on error
-
remapBaseTableColumns
private void remapBaseTableColumns() throws StandardException
Remap the column references in vti arguments. Point those column references at the result columns for the base table. This prevents us from code-generating the args from references to unfilled columns in higher join nodes. See DERBY-5554.
- Throws:
StandardException
-
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
boolean referencesTarget(java.lang.String name, boolean baseTable) throws StandardException
Search to see if a query references the specifed table name.- Overrides:
referencesTarget
in classResultSetNode
- 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 classFromTable
- 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
boolean needsSpecialRCLBinding()
- Overrides:
needsSpecialRCLBinding
in classFromTable
-
isUpdatableCursor
boolean isUpdatableCursor() throws StandardException
- Throws:
StandardException
-
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 interfaceVTIEnvironment
-
getOriginalSQL
public java.lang.String getOriginalSQL()
Description copied from interface:VTIEnvironment
Return the SQL text of the original SQL statement.- Specified by:
getOriginalSQL
in interfaceVTIEnvironment
-
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 interfaceVTIEnvironment
-
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 interfaceVTIEnvironment
-
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 interfaceVTIEnvironment
-
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:- Implements VTICosting
- Has a public, no-arg constructor
- 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
-
-