Class ResultSetNode
java.lang.Object
org.apache.derby.impl.sql.compile.QueryTreeNode
org.apache.derby.impl.sql.compile.ResultSetNode
- All Implemented Interfaces:
Visitable
- Direct Known Subclasses:
FromTable
,MaterializeSubqueryNode
,SelectNode
A ResultSetNode represents a result set, that is, a set of rows. It is
analogous to a ResultSet in the LanguageModuleExternalInterface. In fact,
code generation for a a ResultSetNode will create a "new" call to a
constructor for a ResultSet.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) static class
For ease of pushing order by, offset and fetch first/next clauses into nodes. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate CostEstimate
private CostEstimate
private boolean
private boolean
private Optimizer
private JBitSet
private ResultColumnList
private int
private CostEstimate
private boolean
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 -
Method Summary
Modifier and TypeMethodDescription(package private) void
Accept the visitor for all visitable children of this node.(package private) ResultSetNode
addNewPredicate
(Predicate predicate) Add a new predicate to the list.(package private) void
Notify the underlying result set tree that the optimizer has chosen to "eliminate" a sort.(package private) void
adjustForSortElimination
(RequiredRowOrdering rowOrdering) Same goal as adjustForSortElimination above, but this version takes a RequiredRowOrdering to allow nodes to adjust based on the ORDER BY clause, if needed.(package private) void
Assign the next resultSetNumber to the resultSetNumber in this ResultSetNode.(package private) void
bindExpressions
(FromList fromListParam) Bind the expressions in this ResultSetNode.(package private) void
bindExpressionsWithTables
(FromList fromListParam) Bind the expressions in this ResultSetNode if it has tables.(package private) ResultSetNode
bindNonVTITables
(DataDictionary dataDictionary, FromList fromListParam) Bind the non VTI tables in this ResultSetNode.(package private) void
bindResultColumns
(TableDescriptor targetTableDescriptor, FromVTI targetVTI, ResultColumnList targetColumnList, DMLStatementNode statement, FromList fromListParam) Bind the result columns for this ResultSetNode to a base table.(package private) void
bindResultColumns
(FromList fromListParam) Bind the result columns of this ResultSetNode when there is no base table to bind them to.(package private) void
bindTargetExpressions
(FromList fromListParam) Bind the expressions in the target list.(package private) void
Bind untyped nulls to the types in the given ResultColumnList.(package private) ResultSetNode
bindVTITables
(FromList fromListParam) Bind the VTI tables in this ResultSetNode.(package private) ResultSetNode
The optimizer's decision on the access path for a result set may require the generation of extra result sets.(package private) boolean
(package private) ResultSetNode
considerMaterialization
(JBitSet outerTables) Consider materialization for this ResultSet tree if it is valid and cost effective (It is not valid if incorrect results would be returned.)private ResultColumn
createGeneratedColumn
(TableDescriptor targetTD, ColumnDescriptor colDesc) Create a ResultColumn for a column with a generation clause.(package private) abstract void
decrementLevel
(int decrement) Decrement (query block) level (0-based) for all of the tables in this ResultSet tree.(package private) ResultSetNode
enhanceRCLForInsert
(InsertNode target, boolean inOrder, int[] colMap) This ResultSet is the source for an Insert.(package private) ResultSetNode
ensurePredicateList
(int numTables) Ensure that the top of the RSN tree has a PredicateList.(package private) void
fillInReferencedTableMap
(JBitSet passedMap) Fill the referencedTableMap with this ResultSetNode.(package private) boolean
flattenableInFromSubquery
(FromList fromList) Evaluate whether or not the subquery in a FromSubquery is flattenable.(package private) void
generateNormalizationResultSet
(ActivationClassBuilder acb, MethodBuilder mb, int resultSetNumber, ResultDescription resultDescription) Generate the code for a NormalizeResultSet.private ResultSetNode
generateProjectRestrictForInsert
(InsertNode target, int[] colMap) Generate a ProjectRestrictNode to put on top of this node if it's the source for an insert, and the RCL needs reordering and/or addition of columns in order to match the target RCL.(package private) void
General logic shared by Core compilation and by the Replication Filter compiler.private ResultColumn
genNewRCForInsert
(TableDescriptor targetTD, FromVTI targetVTI, int columnNumber, DataDictionary dataDictionary) Generate the RC/expression for an unspecified column in an insert.(package private) ResultSetNode
Put a ProjectRestrictNode on top of this ResultSetNode.(package private) ResultSetNode
genProjectRestrict
(int numTables) Put a ProjectRestrictNode on top of each FromTable in the FromList.(package private) ResultSetNode
Get a parent ProjectRestrictNode above us.(package private) ResultColumnList
getAllResultColumns
(TableName allTableName) Expand "*" into a ResultColumnList with all of the columns in the table's result list.(package private) CostEstimate
Get the final cost estimate which we've set so far(package private) CostEstimate
Get the CostEstimate for this ResultSetNode.(package private) FromTable
return the target table of an updatable cursor result set.(package private) CostEstimate
Get the final CostEstimate for this ResultSetNode.(package private) FromList
Get the FromList.(package private) FromTable
getFromTableByName
(String name, String schemaName, boolean exactMatch) Determine whether or not the specified name is an exposed name in the current query block.(package private) ResultColumn
getMatchingColumn
(ColumnReference columnReference) Try to find a ResultColumn in the table represented by this FromTable that matches the name in the given ColumnReference.protected CostEstimate
Get a cost estimate to use for this ResultSetNode.(package private) Optimizer
Get the optimizer being used on this result setprotected OptimizerImpl
Get the optimizer for this result set.(package private) ResultColumnList
getRCLForInsert
(InsertNode target, int[] colMap) Generate an RCL that can replace the original RCL of this node to match the RCL of the target for the insert.Get the referencedTableMap for this ResultSetNode.(package private) ResultColumnList
Get the resultColumns for this ResultSetNodeint
Get the resultSetNumber in this ResultSetNode.(package private) CostEstimate
Get the scratch estimate(package private) boolean
Return true if this is a cursor target table(package private) boolean
Return true if this is the source result set for an INSERT(package private) boolean
Return whether or not the underlying ResultSet tree is for a NOT EXISTS join.(package private) boolean
Return whether or not the underlying ResultSet tree will return a single row, at most.(package private) boolean
isOrderedOn
(ColumnReference[] crs, boolean permuteOrdering, List<FromBaseTable> fbtHolder) Return whether or not the underlying ResultSet tree is ordered on the specified columns.(package private) boolean
isPossibleDistinctScan
(Set<BaseColumnNode> distinctColumns) Is it possible to do a distinct scan on this ResultSet tree.(package private) boolean
Return true if this is a statement result set(package private) boolean
Determine if this result set is updatable or not, for a cursor (i.e., is it a cursor-updatable select).(package private) JBitSet
LOJgetReferencedTables
(int numTables) Make a ResultDescription for use in a ResultSet.(package private) ResultColumnDescriptor[]
(package private) boolean
Mark this ResultSetNode as the target table of an updatable cursor.(package private) void
Mark the underlying scan as a distinct scan.(package private) void
This method is overridden to allow a resultset node to know if it is the one controlling the statement -- i.e., it is the outermost result set node for the statement.(package private) ResultSetNode
Modify the access paths according to the decisions the optimizer made.(package private) ResultSetNode
modifyAccessPaths
(PredicateList predList) Modify the access paths according to the decisions the optimizer made.(package private) void
Mark this ResultSetNode as *not* the target table of an updatable cursor.(package private) void
Mark this node and its children as not being a flattenable join.(package private) static int
numDistinctAggregates
(List<AggregateNode> aggregates) Count the number of distinct aggregates in the list.(package private) ResultSetNode
optimize
(DataDictionary dataDictionary, PredicateList predicates, double outerRows) Optimize a ResultSetNode.parseDefault
(String defaultText) Parse a default and turn it into a query tree.(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
(package private) void
printSubNodes
(int depth) Prints the sub-nodes of this object.(package private) void
Find the unreferenced result columns and project them out.(package private) void
pushOffsetFetchFirst
(ValueNode offset, ValueNode fetchFirst, boolean hasJDBClimitClause) Push down the offset and fetch first parameters, if any.(package private) void
pushOrderByList
(OrderByList orderByList) Push the order by list down from the cursor node into its child result set so that the optimizer has all of the information that it needs to consider sort avoidance.(package private) void
Set up a new level for order by and fetch/offset clauses.(package private) boolean
referencesTarget
(String name, boolean baseTable) Search to see if a query references the specifed table name.(package private) void
Check for (and reject) ?(package private) void
Check for (and reject) XML values directly under the ResultColumns.(package private) void
Rename generated result column names as '1', '2' etc...(package private) void
replaceOrForbidDefaults
(TableDescriptor ttd, ResultColumnList tcl, boolean allowDefaults) Replace any DEFAULTs with the associated tree for the default if allowed, or flag (when inside top level set operator nodes).(package private) boolean
Return whether or not this ResultSet tree is guaranteed to return at most 1 row based on heuristics.(package private) void
Set the final cost estimate(package private) void
Set the CostEstimate for this ResultSetNode(package private) void
setCursorTargetTable
(boolean yesOrNo) Set whether this is a cursor target table(package private) void
Remember that this node is the source result set for an INSERT.(package private) void
setOptimizer
(Optimizer opt) Set the optimizer for use on this result set(package private) void
setReferencedTableMap
(JBitSet newRTM) Set the referencedTableMap in this ResultSetNode(package private) void
setResultColumns
(ResultColumnList newRCL) Set the resultColumns in this ResultSetNode(package private) void
setResultSetNumber
(int rsn) (package private) ResultSetNode
setResultToBooleanTrueNode
(boolean onlyConvertAlls) Set the result column for the subquery to a boolean true, Useful for transformations such as changing: where exists (select ... from ...)(package private) void
Set the scratch estimate(package private) void
setTableConstructorTypes
(ResultColumnList typeColumns) Set the type of each parameter in the result column list for this table constructor.(package private) boolean
subqueryReferencesTarget
(String name, boolean baseTable) Return whether or not this ResultSetNode contains a subquery with a reference to the specified target.toString()
Convert this object to a String.(package private) int
Get the lock mode for the target of an update statement (a delete or update).(package private) void
verifySelectStarSubquery
(FromList outerFromList, int subqueryType) Verify that a SELECT * is valid for this type of subquery.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, generate, 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
-
Field Details
-
resultSetNumber
private int resultSetNumber -
referencedTableMap
-
resultColumns
-
statementResultSet
private boolean statementResultSet -
cursorTargetTable
private boolean cursorTargetTable -
insertSource
private boolean insertSource -
costEstimate
-
scratchCostEstimate
-
optimizer
-
candidateFinalCostEstimate
-
-
Constructor Details
-
ResultSetNode
ResultSetNode(ContextManager cm)
-
-
Method Details
-
toString
Convert this object to a String. See comments in QueryTreeNode.java for how this should be done for tree printing.- Overrides:
toString
in classQueryTreeNode
- Returns:
- This object as a String
-
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 classQueryTreeNode
- Parameters:
depth
- The depth of this node in the tree
-
isStatementResultSet
boolean isStatementResultSet()Return true if this is a statement result set -
isCursorTargetTable
boolean isCursorTargetTable()Return true if this is a cursor target table -
setCursorTargetTable
void setCursorTargetTable(boolean yesOrNo) Set whether this is a cursor target table -
getScratchCostEstimate
CostEstimate getScratchCostEstimate()Get the scratch estimate -
setScratchCostEstimate
Set the scratch estimate -
getResultSetNumber
public int getResultSetNumber()Get the resultSetNumber in this ResultSetNode. Expected to be set during generate(). Must be public in order to satisfy the Optimizable contract.- Returns:
- int The resultSetNumber.
-
setResultSetNumber
void setResultSetNumber(int rsn) -
getCostEstimate
CostEstimate getCostEstimate()Get the CostEstimate for this ResultSetNode.- Returns:
- The CostEstimate for this ResultSetNode.
-
setCostEstimate
Set the CostEstimate for this ResultSetNode -
getFinalCostEstimate
Get the final CostEstimate for this ResultSetNode.- Returns:
- The final CostEstimate for this ResultSetNode.
- Throws:
StandardException
-
getCandidateFinalCostEstimate
CostEstimate getCandidateFinalCostEstimate()Get the final cost estimate which we've set so far -
setCandidateFinalCostEstimate
Set the final cost estimate -
assignResultSetNumber
Assign the next resultSetNumber to the resultSetNumber in this ResultSetNode. Expected to be done during generate().- Throws:
StandardException
- Thrown on error
-
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.- Parameters:
dataDictionary
- The DataDictionary to use for bindingfromListParam
- FromList to use/append to.- Returns:
- ResultSetNode
- Throws:
StandardException
- Thrown on error
-
bindVTITables
Bind the VTI tables in this ResultSetNode. This includes getting their descriptors from the data dictionary and numbering them.- Parameters:
fromListParam
- FromList to use/append to.- Returns:
- ResultSetNode
- Throws:
StandardException
- Thrown on error
-
bindExpressions
Bind the expressions in this ResultSetNode. This means binding the sub-expressions, as well as figuring out what the return type is for each expression.- Parameters:
fromListParam
- FromList to use/append to.- Throws:
StandardException
- Thrown on error
-
bindExpressionsWithTables
Bind the expressions in this ResultSetNode if it has tables. This means binding the sub-expressions, as well as figuring out what the return type is for each expression.- Parameters:
fromListParam
- FromList to use/append to.- Throws:
StandardException
- Thrown on error
-
bindTargetExpressions
Bind the expressions in the target list. This means binding the sub-expressions, as well as figuring out what the return type is for each expression. This is useful for EXISTS subqueries, where we need to validate the target list before blowing it away and replacing it with a SELECT true.- Throws:
StandardException
- Thrown on error
-
setTableConstructorTypes
Set the type of each parameter in the result column list for this table constructor.- Parameters:
typeColumns
- The ResultColumnList containing the desired result types.- Throws:
StandardException
- Thrown on error
-
setInsertSource
void setInsertSource()Remember that this node is the source result set for an INSERT. -
isInsertSource
boolean isInsertSource()Return true if this is the source result set for an INSERT -
verifySelectStarSubquery
Verify that a SELECT * is valid for this type of subquery.- Parameters:
outerFromList
- The FromList from the outer query block(s)subqueryType
- The subquery type- Throws:
StandardException
- Thrown on error
-
getAllResultColumns
Expand "*" into a ResultColumnList with all of the columns in the table's result list.- 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
Try to find a ResultColumn in the table represented by this FromTable that matches the name in the given ColumnReference.- 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
-
setResultToBooleanTrueNode
Set the result column for the subquery to a boolean true, Useful for transformations such as changing: where exists (select ... from ...) to: where (select true from ...) NOTE: No transformation is performed if the ResultColumn.expression is already the correct boolean constant.- Parameters:
onlyConvertAlls
- Boolean, whether or not to just convert *'s- Returns:
- ResultSetNode whose resultColumn was transformed; defaults to "this" here, but can be overridden by subclasses.
- Throws:
StandardException
- Thrown on error
-
getFromList
Get the FromList. Create and return an empty FromList. (Subclasses which actuall have FromLists will override this.) This is useful because there is a FromList parameter to bindExpressions() which is used as the common FromList to bind against, allowing us to support correlation columns under unions in subqueries.- Returns:
- FromList
- Throws:
StandardException
- Thrown on error
-
bindResultColumns
Bind the result columns of this ResultSetNode when there is no base table to bind them to. This is useful for SELECT statements, where the result columns get their types from the expressions that live under them.- Parameters:
fromListParam
- FromList to use/append to.- Throws:
StandardException
- Thrown on error
-
bindResultColumns
void bindResultColumns(TableDescriptor targetTableDescriptor, FromVTI targetVTI, ResultColumnList targetColumnList, DMLStatementNode statement, FromList fromListParam) throws StandardException Bind the result columns for this ResultSetNode to a base table. This is useful for INSERT and UPDATE statements, where the result columns get their types from the table being updated or inserted into. If a result column list is specified, then the verification that the result column list does not contain any duplicates will be done when binding them by name.- Parameters:
targetTableDescriptor
- The TableDescriptor for the table being updated or inserted intotargetColumnList
- For INSERT statements, the user does not have to supply column names (for example, "insert into t values (1,2,3)". When this parameter is null, it means that the user did not supply column names, and so the binding should be done based on order. When it is not null, it means do the binding by name, not position.statement
- Calling DMLStatementNode (Insert or Update)fromListParam
- FromList to use/append to.- Throws:
StandardException
- Thrown on error
-
bindUntypedNullsToResultColumns
Bind untyped nulls to the types in the given ResultColumnList. This is used for binding the nulls in row constructors and table constructors. In all other cases (as of the time of this writing), we do nothing.- Parameters:
rcl
- The ResultColumnList with the types to bind nulls to- 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.- 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
-
projectResultColumns
Find the unreferenced result columns and project them out.- Throws:
StandardException
-
ensurePredicateList
Ensure that the top of the RSN tree has a PredicateList.- Parameters:
numTables
- The number of tables in the query.- Returns:
- ResultSetNode A RSN tree with a node which has a PredicateList on top.
- Throws:
StandardException
- Thrown on error
-
addNewPredicate
Add a new predicate to the list. This is useful when doing subquery transformations, when we build a new predicate with the left side of the subquery operator and the subquery's result column.- Parameters:
predicate
- The predicate to add- Returns:
- ResultSetNode The new top of the tree.
- Throws:
StandardException
- Thrown on error
-
flattenableInFromSubquery
Evaluate whether or not the subquery in a FromSubquery is flattenable. Currently, a FSqry is flattenable if all of the following are true: o Subquery is a SelectNode. (ie, not a RowResultSetNode or a UnionNode) o It contains no top level subqueries. (RESOLVE - we can relax this) o It does not contain a group by or having clause o It does not contain aggregates.- Parameters:
fromList
- The outer from list- Returns:
- boolean Whether or not the FromSubquery is flattenable.
-
genProjectRestrictForReordering
Get a parent ProjectRestrictNode above us. This is useful when we need to preserve the user specified column order when reordering the columns in the distinct when we combine an order by with a distinct.- Returns:
- A parent ProjectRestrictNode to do column reordering
- Throws:
StandardException
- Thrown on error
-
optimize
ResultSetNode optimize(DataDictionary dataDictionary, PredicateList predicates, double outerRows) throws StandardException Optimize a ResultSetNode. This means choosing the best access path for each table under the ResultSetNode, among other things. The only RSNs that need to implement their own optimize() are a SelectNode and those RSNs that can appear above a SelectNode in the query tree. Currently, a ProjectRestrictNode is the only RSN that can appear above a SelectNode.- Parameters:
dataDictionary
- The DataDictionary to use for optimizationpredicates
- The PredicateList to apply.outerRows
- The number of outer joining rows- Returns:
- ResultSetNode The top of the optimized query tree
- Throws:
StandardException
- Thrown on error
-
modifyAccessPaths
Modify the access paths according to the decisions the optimizer made. This can include adding project/restrict nodes, index-to-base-row nodes, etc.- Returns:
- The modified query tree
- Throws:
StandardException
- Thrown on error
-
modifyAccessPaths
Modify the access paths according to the decisions the optimizer made. This can include adding project/restrict nodes, index-to-base-row nodes, etc.- Parameters:
predList
- A list of optimizable predicates that should be pushed to this ResultSetNode, as determined by optimizer.- Returns:
- The modified query tree
- Throws:
StandardException
- Thrown on error
-
makeResultDescriptors
ResultColumnDescriptor[] makeResultDescriptors() -
columnTypesAndLengthsMatch
- Throws:
StandardException
-
setResultColumns
Set the resultColumns in this ResultSetNode- Parameters:
newRCL
- The new ResultColumnList for this ResultSetNode
-
getResultColumns
ResultColumnList getResultColumns()Get the resultColumns for this ResultSetNode- Returns:
- ResultColumnList for this ResultSetNode
-
setReferencedTableMap
Set the referencedTableMap in this ResultSetNode- Parameters:
newRTM
- The new referencedTableMap for this ResultSetNode
-
getReferencedTableMap
Get the referencedTableMap for this ResultSetNode. Must be public in order to satisfy the Optimizable contract.- Returns:
- JBitSet Referenced table map for this ResultSetNode
-
fillInReferencedTableMap
Fill the referencedTableMap with this ResultSetNode.- Parameters:
passedMap
- The table map to fill in.
-
rejectParameters
Check for (and reject) ? parameters directly under the ResultColumns. This is done for SELECT statements.- Throws:
StandardException
- Thrown if a ? parameter found directly under a ResultColumn
-
rejectXMLValues
Check for (and reject) XML values directly under the ResultColumns. This is done for SELECT/VALUES statements. We reject values in this case because JDBC does not define an XML type/binding and thus there's no standard way to pass such a type back to a JDBC application.- Throws:
StandardException
- Thrown if an XML value found directly under a ResultColumn
-
renameGeneratedResultNames
Rename generated result column names as '1', '2' etc... These will be the result column names seen by JDBC clients.- Throws:
StandardException
-
markStatementResultSet
void markStatementResultSet()This method is overridden to allow a resultset node to know if it is the one controlling the statement -- i.e., it is the outermost result set node for the statement. -
enhanceRCLForInsert
ResultSetNode enhanceRCLForInsert(InsertNode target, boolean inOrder, int[] colMap) throws StandardException This ResultSet is the source for an Insert. The target RCL is in a different order and/or a superset of this RCL. In most cases we will add a ProjectRestrictNode on top of the source with an RCL that matches the target RCL. NOTE - The new or enhanced RCL will be fully bound.- Parameters:
target
- the target node for the insertinOrder
- are source cols in same order as target cols?colMap
- int array representation of correspondence between RCLs - colmap[i] = -1 -> missing in current RCL colmap[i] = j -> targetRCL(i) <-> thisRCL(j+1)- Returns:
- a node that replaces this node and whose RCL matches the target RCL. May return this node if no changes to the RCL are needed, or if the RCL is modified in-place.
- Throws:
StandardException
- Thrown on error
-
getRCLForInsert
Generate an RCL that can replace the original RCL of this node to match the RCL of the target for the insert.- Parameters:
target
- the target node for the insertcolMap
- int array representation of correspondence between RCLs - colmap[i] = -1 -> missing in current RCL colmap[i] = j -> targetRCL(i) <-> thisRCL(j+1)- Returns:
- an RCL that matches the target RCL
- Throws:
StandardException
-
genNewRCForInsert
private ResultColumn genNewRCForInsert(TableDescriptor targetTD, FromVTI targetVTI, int columnNumber, DataDictionary dataDictionary) throws StandardException Generate the RC/expression for an unspecified column in an insert. Use the default if one exists.- Parameters:
targetTD
- Target TableDescriptor if the target is not a VTI, null if a VTI.targetVTI
- Target description if it is a VTI, null if not a VTIcolumnNumber
- The column numberdataDictionary
- The DataDictionary- Returns:
- The RC/expression for the unspecified column.
- Throws:
StandardException
- Thrown on error
-
generateProjectRestrictForInsert
private ResultSetNode generateProjectRestrictForInsert(InsertNode target, int[] colMap) throws StandardException Generate a ProjectRestrictNode to put on top of this node if it's the source for an insert, and the RCL needs reordering and/or addition of columns in order to match the target RCL.- Parameters:
target
- the target node for the insertcolMap
- int array representation of correspondence between RCLs - colmap[i] = -1 -> missing in current RCL colmap[i] = j -> targetRCL(i) <-> thisRCL(j+1)- Returns:
- a ProjectRestrictNode whos RCL matches the target RCL
- Throws:
StandardException
-
createGeneratedColumn
private ResultColumn createGeneratedColumn(TableDescriptor targetTD, ColumnDescriptor colDesc) throws StandardException Create a ResultColumn for a column with a generation clause.- Throws:
StandardException
-
parseDefault
Parse a default and turn it into a query tree.- Parameters:
defaultText
- Text of Default.- Returns:
- The parsed default as a query tree.
- Throws:
StandardException
- Thrown on failure
-
makeResultDescription
Make a ResultDescription for use in a ResultSet. This is useful when generating/executing a NormalizeResultSet, since it can appear anywhere in the tree.- Returns:
- A ResultDescription for this ResultSetNode.
-
isUpdatableCursor
Determine if this result set is updatable or not, for a cursor (i.e., is it a cursor-updatable select). This returns false and we expect selectnode to refine it for further checking.- Throws:
StandardException
- Thrown on error
-
getCursorTargetTable
FromTable getCursorTargetTable()return the target table of an updatable cursor result set. since this is not updatable, just return null. -
markAsCursorTargetTable
boolean markAsCursorTargetTable()Mark this ResultSetNode as the target table of an updatable cursor. Most types of ResultSetNode can't be target tables.- Returns:
- true if the target table supports positioned updates.
-
notCursorTargetTable
void notCursorTargetTable()Mark this ResultSetNode as *not* the target table of an updatable cursor. -
genProjectRestrict
Put a ProjectRestrictNode on top of this ResultSetNode. 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.) This is useful for UNIONs, where we want to generate a DistinctNode above the UnionNode to eliminate the duplicates, because DistinctNodes expect their immediate child to be a PRN.- Returns:
- The generated ProjectRestrictNode atop the original ResultSetNode.
- Throws:
StandardException
- Thrown on error
-
genProjectRestrict
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.- Parameters:
numTables
- Number of tables in the DML Statement- Returns:
- The generated ProjectRestrictNode atop the original FromTable.
- Throws:
StandardException
- Thrown on error
-
generateNormalizationResultSet
void generateNormalizationResultSet(ActivationClassBuilder acb, MethodBuilder mb, int resultSetNumber, ResultDescription resultDescription) throws StandardException Generate the code for a NormalizeResultSet. The call must push two items before calling this method- pushGetResultSetFactoryExpression
- the expression to normalize
- Parameters:
acb
- The ActivationClassBuildermb
- The method to put the generated code inresultSetNumber
- The result set number for the NRSresultDescription
- The ERD for the ResultSet- Throws:
StandardException
- Thrown on error
-
changeAccessPath
The optimizer's decision on the access path for a result set may require the generation of extra result sets. For example, if it chooses an index for a FromBaseTable, we need an IndexToBaseRowNode above the FromBaseTable (and the FromBaseTable has to change its column list to match the index. This method in the parent class does not generate any extra result sets. It may be overridden in child classes.- Returns:
- A ResultSetNode tree modified to do any extra processing for the chosen access path
- Throws:
StandardException
- Thrown on error
-
referencesTarget
Search to see if a query references the specifed table name.- 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
-
subqueryReferencesTarget
Return whether or not this ResultSetNode contains a subquery with a reference to the specified target.- Parameters:
name
- The table name.- Returns:
- boolean Whether or not a reference to the table was found.
- Throws:
StandardException
- Thrown on error
-
isOneRowResultSet
Return whether or not the underlying ResultSet tree will return a single row, at most. This is important for join nodes where we can save the extra next on the right side if we know that it will return at most 1 row.- Returns:
- Whether or not the underlying ResultSet tree will return a single row.
- Throws:
StandardException
- Thrown on error
-
isNotExists
boolean isNotExists()Return whether or not the underlying ResultSet tree is for a NOT EXISTS join.- Returns:
- Whether or not the underlying ResultSet tree if for NOT EXISTS.
-
getOptimizerImpl
Get the optimizer for this result set.- Returns:
- If this.optimizer has has already been created by the getOptimizer() method above, then return it; otherwise, return null.
-
getOptimizer
Optimizer getOptimizer()Get the optimizer being used on this result set -
setOptimizer
Set the optimizer for use on this result set -
getNewCostEstimate
Get a cost estimate to use for this ResultSetNode.- Throws:
StandardException
- Thrown on error
-
acceptChildren
Accept the visitor for all visitable children of this node.- Overrides:
acceptChildren
in classQueryTreeNode
- Parameters:
v
- the visitor- Throws:
StandardException
- on error
-
considerMaterialization
Consider materialization for this ResultSet tree if it is valid and cost effective (It is not valid if incorrect results would be returned.)- Returns:
- Top of the new/same ResultSet tree.
- Throws:
StandardException
- Thrown on error
-
performMaterialization
Return whether or not to materialize this ResultSet tree.- Returns:
- Whether or not to materialize this ResultSet tree. would return valid results.
- Throws:
StandardException
- Thrown on error
-
getFromTableByName
FromTable getFromTableByName(String name, String schemaName, boolean exactMatch) throws StandardException Determine whether or not the specified name is an exposed name in the current query block.- Parameters:
name
- The specified name to search for as an exposed name.schemaName
- Schema name, if non-null.exactMatch
- Whether or not we need an exact match on specified schema and table names or match on table id.- Returns:
- The FromTable, if any, with the exposed name.
- Throws:
StandardException
- Thrown on error
-
decrementLevel
abstract void decrementLevel(int decrement) Decrement (query block) level (0-based) for all of the tables in this ResultSet tree. This is useful when flattening a subquery.- Parameters:
decrement
- The amount to decrement by.
-
pushOrderByList
Push the order by list down from the cursor node into its child result set so that the optimizer has all of the information that it needs to consider sort avoidance. Presumes a new level has been initialized bypushQueryExpressionSuffix()
.- Parameters:
orderByList
- The order by list
-
pushOffsetFetchFirst
Push down the offset and fetch first parameters, if any. This method should be overridden by the result sets that need this. Presumes a new level has been initialized bypushQueryExpressionSuffix()
.- Parameters:
offset
- the OFFSET, if anyfetchFirst
- the OFFSET FIRST, if anyhasJDBClimitClause
- true if the clauses were added by (and have the semantics of) a JDBC limit clause
-
generateResultSet
General logic shared by Core compilation and by the Replication Filter compiler. A couple ResultSets (the ones used by PREPARE SELECT FILTER) implement this method.- Parameters:
acb
- The ExpressionClassBuilder for the class being builtmb
- The method the expression will go into- Throws:
StandardException
- Thrown on error
-
updateTargetLockMode
int updateTargetLockMode()Get the lock mode for the target of an update statement (a delete or update). The update mode will always be row for CurrentOfNodes. It will be table if there is no where clause.- Returns:
- The lock mode
- See Also:
-
notFlattenableJoin
void notFlattenableJoin()Mark this node and its children as not being a flattenable join. -
isOrderedOn
boolean isOrderedOn(ColumnReference[] crs, boolean permuteOrdering, List<FromBaseTable> fbtHolder) throws StandardException Return whether or not the underlying ResultSet tree is ordered on the specified columns. RESOLVE - This method currently only considers the outermost table of the query block.- Parameters:
crs
- The specified ColumnReference[]permuteOrdering
- Whether or not the order of the CRs in the array can be permutedfbtHolder
- List that is to be filled with the FromBaseTable- Returns:
- Whether the underlying ResultSet tree is ordered on the specified column.
- Throws:
StandardException
- Thrown on error
-
returnsAtMostOneRow
boolean returnsAtMostOneRow()Return whether or not this ResultSet tree is guaranteed to return at most 1 row based on heuristics. (A RowResultSetNode and a SELECT with a non-grouped aggregate will return at most 1 row.)- Returns:
- Whether or not this ResultSet tree is guaranteed to return at most 1 row based on heuristics.
-
replaceOrForbidDefaults
void replaceOrForbidDefaults(TableDescriptor ttd, ResultColumnList tcl, boolean allowDefaults) throws StandardException Replace any DEFAULTs with the associated tree for the default if allowed, or flag (when inside top level set operator nodes). Subqueries are checked for illegal DEFAULTs elsewhere.- Parameters:
ttd
- The TableDescriptor for the target table.tcl
- The RCL for the target table.allowDefaults
- true if allowed- Throws:
StandardException
- Thrown on error
-
isPossibleDistinctScan
Is it possible to do a distinct scan on this ResultSet tree. (See SelectNode for the criteria.)- Parameters:
distinctColumns
- the set of distinct columns- Returns:
- Whether or not it is possible to do a distinct scan on this ResultSet tree.
-
markForDistinctScan
void markForDistinctScan()Mark the underlying scan as a distinct scan. -
adjustForSortElimination
void adjustForSortElimination()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. -
adjustForSortElimination
Same goal as adjustForSortElimination above, but this version takes a RequiredRowOrdering to allow nodes to adjust based on the ORDER BY clause, if needed.- Throws:
StandardException
-
numDistinctAggregates
Count the number of distinct aggregates in the list. By 'distinct' we mean aggregates of the form: SELECT MAX(DISTINCT x) FROM T- Returns:
- number of aggregates
-
LOJgetReferencedTables
- Throws:
StandardException
-
pushQueryExpressionSuffix
void pushQueryExpressionSuffix()Set up a new level for order by and fetch/offset clauses. See Javadoc forResultSetNode.QueryExpressionClauses
. Overridden by implementors of pushOrderByNode, pushOffsetFetchFirst. -
printQueryExpressionSuffixClauses
-