Class UnionNode
- All Implemented Interfaces:
Optimizable, Visitable
A UnionNode represents a UNION in a DML statement. It contains a boolean
telling whether the union operation should eliminate duplicate rows.
-
Nested Class Summary
Nested classes/interfaces inherited from class ResultSetNode
ResultSetNode.QueryExpressionClauses -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate boolean(package private) boolean(package private) booleanFields inherited from class SetOperatorNode
all, qecFields inherited from class TableOperatorNode
leftOptimizer, leftResultSet, rightOptimizer, rightResultSetFields inherited from class FromTable
ADD_PLAN, bestAccessPath, bestCostEstimate, bestSortAvoidancePath, correlationName, corrTableName, currentAccessPath, hashKeyColumns, initialCapacity, level, LOAD_PLAN, loadFactor, maxCapacity, origTableName, REMOVE_PLAN, tableNumber, tableProperties, trulyTheBestAccessPath, userSpecifiedJoinStrategyFields inherited from class QueryTreeNode
AUTOINCREMENT_CREATE_MODIFY, AUTOINCREMENT_CYCLE, AUTOINCREMENT_INC_INDEX, AUTOINCREMENT_IS_AUTOINCREMENT_INDEX, AUTOINCREMENT_START_INDEX -
Constructor Summary
ConstructorsConstructorDescriptionUnionNode(ResultSetNode leftResult, ResultSetNode rightResult, boolean all, boolean tableConstructor, Properties tableProperties, ContextManager cm) Constructor for a UnionNode. -
Method Summary
Modifier and TypeMethodDescriptionprivate ResultSetNodeAdd any new ResultSetNodes that are necessary to the tree.voidbindExpressions(FromList fromListParam) Bind the expressions under this TableOperatorNode.(package private) ResultSetNodeenhanceRCLForInsert(InsertNode target, boolean inOrder, int[] colMap) Make the RCL of this node match the target node for the insert.(package private) voidgenerate(ActivationClassBuilder acb, MethodBuilder mb) Generate the code for this UnionNode.(package private) CostEstimateGet the final CostEstimate for this FromTable.(package private) String(package private) voidMark this as the top node of a table constructor.modifyAccessPath(JBitSet outerTables) Modify the access path for this Optimizable, as necessary.(package private) ResultSetNodeModify the access paths according to the decisions the optimizer made.optimizeIt(Optimizer optimizer, OptimizablePredicateList predList, CostEstimate outerCost, RowOrdering rowOrdering) Choose the best access path for this Optimizable.(package private) voidpushExpressions(PredicateList predicateList) DERBY-649: Handle pushing predicates into UnionNodes.(package private) voidCheck for (and reject) ?(package private) voidsetTableConstructorTypes(ResultColumnList typeColumns) Set the type of column in the result column lists of each source of this union tree to the type in the given result column list (which represents the result columns for an insert).(package private) booleanTell whether this is a UNION for a table constructor.toString()Convert this object to a String.Methods inherited from class SetOperatorNode
bindResultColumns, bindResultColumns, bindTargetExpressions, bindUntypedNullsToResultColumns, ensurePredicateList, flattenableInFromSubquery, getFromTableByName, getLeftOptPredicateList, getParamColumnTypes, getRightOptPredicateList, hasUnPushedPredicates, modifyAccessPath, performMaterialization, preprocess, printSubNodes, pullOptPredicates, pushOffsetFetchFirst, pushOptPredicate, pushOrderByList, pushQueryExpressionSuffix, replaceOrForbidDefaults, setParamColumnTypes, setResultToBooleanTrueNode, verifySelectStarSubqueryMethods inherited from class TableOperatorNode
acceptChildren, adjustForSortElimination, adjustForSortElimination, bindExpressionsWithTables, bindNonVTITables, bindVTITables, decrementLevel, getExposedName, getLeftmostResultSet, getLeftResultSet, getRightResultSet, needsSpecialRCLBinding, optimize, optimizeSource, projectResultColumns, referencesSessionSchema, referencesTarget, setLeftmostResultSet, setLevel, setNestedInParens, setReferencedColumns, updateBestPlanMap, verifyPropertiesMethods inherited from class FromTable
assignCostEstimate, canBeOrdered, columnsAreUpdatable, considerSortAvoidancePath, convertAbsoluteToRelativeColumnPosition, cursorTargetTable, estimateCost, feasibleJoinStrategy, fillInReferencedTableMap, flatten, forUpdate, getBaseTableName, getBestAccessPath, getBestSortAvoidancePath, getCorrelationName, getCostEstimate, getCurrentAccessPath, getLevel, getMergeTableID, getName, getNumColumnsReturned, getOrigTableName, getProperties, getResultColumnsForList, getSchemaDescriptor, getSchemaDescriptor, getScratchCostEstimate, getTableDescriptor, getTableName, getTableNumber, getTrulyTheBestAccessPath, getUserSpecifiedJoinStrategy, hashKeyColumns, hasLargeObjectColumns, hasTableNumber, initAccessPaths, initialCapacity, isBaseTable, isCoveringIndex, isFlattenableJoinNode, isJoinColumnForRightOuterJoin, isMaterializable, isOneRowScan, isTargetTable, legalJoinOrder, loadFactor, LOJ_reorderable, markUpdatableByCursor, maxCapacity, memoryUsageOK, nextAccessPath, optimizeSubqueries, rememberAsBest, rememberJoinStrategyAsBest, rememberSortAvoidancePath, resetJoinStrategies, setCostEstimateCost, setHashKeyColumns, setMergeTableID, setOrigTableName, setProperties, setTableNumber, startOptimizing, supportsMultipleInstantiations, tellRowOrderingAboutConstantColumns, transformOuterJoins, uniqueJoinMethods inherited from class ResultSetNode
addNewPredicate, assignResultSetNumber, changeAccessPath, columnTypesAndLengthsMatch, considerMaterialization, generateNormalizationResultSet, generateResultSet, genProjectRestrict, genProjectRestrict, genProjectRestrictForReordering, getAllResultColumns, getCandidateFinalCostEstimate, getCostEstimate, getCursorTargetTable, getFromList, getMatchingColumn, getNewCostEstimate, getOptimizer, getOptimizerImpl, getRCLForInsert, getReferencedTableMap, getResultColumns, getResultSetNumber, getScratchCostEstimate, isCursorTargetTable, isInsertSource, isNotExists, isOneRowResultSet, isOrderedOn, isPossibleDistinctScan, isStatementResultSet, isUpdatableCursor, LOJgetReferencedTables, makeResultDescription, makeResultDescriptors, markAsCursorTargetTable, markForDistinctScan, markStatementResultSet, modifyAccessPaths, notCursorTargetTable, notFlattenableJoin, numDistinctAggregates, parseDefault, printQueryExpressionSuffixClauses, rejectXMLValues, renameGeneratedResultNames, returnsAtMostOneRow, setCandidateFinalCostEstimate, setCostEstimate, setCursorTargetTable, setInsertSource, setOptimizer, setReferencedTableMap, setResultColumns, setResultSetNumber, setScratchCostEstimate, subqueryReferencesTarget, updateTargetLockModeMethods inherited from class 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, resolveTableToSynonym, setBeginOffset, setEndOffset, setRefActionInfo, stackPrint, taggedWith, treePrint, treePrint, verifyClassExistMethods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface Optimizable
getDataDictionary, getOptimizerTracer, getReferencedTableMap, getResultSetNumber, optimizerTracingIsOnMethods inherited from interface Visitable
accept, addTag, taggedWith
-
Field Details
-
addNewNodesCalled
private boolean addNewNodesCalled -
tableConstructor
boolean tableConstructor -
topTableConstructor
boolean topTableConstructor
-
-
Constructor Details
-
UnionNode
UnionNode(ResultSetNode leftResult, ResultSetNode rightResult, boolean all, boolean tableConstructor, Properties tableProperties, ContextManager cm) throws StandardException Constructor for a UnionNode.- Parameters:
leftResult- The ResultSetNode on the left side of this unionrightResult- The ResultSetNode on the right side of this unionall- Whether or not this is a UNION ALL.tableConstructor- Whether or not this is from a table constructor.tableProperties- Properties list associated with the table- Throws:
StandardException- Thrown on error
-
-
Method Details
-
markTopTableConstructor
void markTopTableConstructor()Mark this as the top node of a table constructor. -
tableConstructor
boolean tableConstructor()Tell whether this is a UNION for a table constructor. -
rejectParameters
Check for (and reject) ? parameters directly under the ResultColumns. This is done for SELECT statements. Don't reject parameters that are in a table constructor - these are allowed, as long as the table constructor is in an INSERT statement or each column of the table constructor has at least one non-? column. The latter case is checked below, in bindExpressions().- Overrides:
rejectParametersin classTableOperatorNode- Throws:
StandardException- Thrown if a ? parameter found directly under a ResultColumn
-
setTableConstructorTypes
Set the type of column in the result column lists of each source of this union tree to the type in the given result column list (which represents the result columns for an insert). This is only for table constructors that appear in insert statements.- Overrides:
setTableConstructorTypesin classResultSetNode- Parameters:
typeColumns- The ResultColumnList containing the desired result types.- Throws:
StandardException- Thrown on error
-
enhanceRCLForInsert
ResultSetNode enhanceRCLForInsert(InsertNode target, boolean inOrder, int[] colMap) throws StandardException Make the RCL of this node match the target node for the insert. If this node represents a table constructor (a VALUES clause), we replace the RCL with an enhanced one if necessary, and recursively enhance the RCL of each child node. For table constructors, we also need to check that we don't attempt to override auto-increment columns in each child node (checking the top-level RCL isn't sufficient since a table constructor may contain the DEFAULT keyword, which makes it possible to specify a column without overriding its value). If this node represents a regular UNION, put a ProjectRestrictNode on top of this node and enhance the RCL in that node.- Overrides:
enhanceRCLForInsertin classResultSetNode- 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
-
optimizeIt
public CostEstimate optimizeIt(Optimizer optimizer, OptimizablePredicateList predList, CostEstimate outerCost, RowOrdering rowOrdering) throws StandardException Description copied from interface:OptimizableChoose the best access path for this Optimizable.- Specified by:
optimizeItin interfaceOptimizable- Overrides:
optimizeItin classFromTable- Parameters:
optimizer- Optimizer to use.predList- The predicate list to optimize againstouterCost- The CostEstimate for the outer tables in the join order, telling how many times this Optimizable will be scanned.rowOrdering- The row ordering for all the tables in the join order, including this one.- Returns:
- The optimizer's estimated cost of the best access path.
- Throws:
StandardException- Thrown on error- See Also:
-
pushExpressions
DERBY-649: Handle pushing predicates into UnionNodes. It is possible to push single table predicates that are binaryOperations or inListOperations. Predicates of the formor IN are currently handled. Since these predicates would allow optimizer to pick available indices, pushing them provides maximum benifit. It should be possible to expand this logic to cover more cases. Even pushing expressions (like a+b = 10) into SELECTs would improve performance, even if they don't allow use of index. It would mean evaluating expressions closer to data and hence could avoid sorting or other overheads that UNION may require. Note that the predicates are not removed after pushing. This is to ensure if pushing is not possible or only partially feasible. - Overrides:
pushExpressionsin classFromTable- Parameters:
predicateList- List of single table predicates to push- Throws:
StandardException- Thrown on error
-
modifyAccessPath
Description copied from interface:OptimizableModify 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:
modifyAccessPathin interfaceOptimizable- Overrides:
modifyAccessPathin classTableOperatorNode- 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:
-
modifyAccessPaths
Description copied from class:ResultSetNodeModify the access paths according to the decisions the optimizer made. This can include adding project/restrict nodes, index-to-base-row nodes, etc.- Overrides:
modifyAccessPathsin classTableOperatorNode- Returns:
- The modified query tree
- Throws:
StandardException- Thrown on error- See Also:
-
addNewNodes
Add any new ResultSetNodes that are necessary to the tree. We wait until after optimization to do this in order to make it easier on the optimizer.- Returns:
- (Potentially new) head of the ResultSetNode tree.
- Throws:
StandardException- Thrown on error
-
toString
Convert this object to a String. See comments in QueryTreeNode.java for how this should be done for tree printing.- Overrides:
toStringin classSetOperatorNode- Returns:
- This object as a String
-
bindExpressions
Bind the expressions under this TableOperatorNode. This means binding the sub-expressions, as well as figuring out what the return type is for each expression.- Overrides:
bindExpressionsin classSetOperatorNode- Parameters:
fromListParam- FromList to use/append to.- Throws:
StandardException- Thrown on error
-
generate
Generate the code for this UnionNode.- Overrides:
generatein classQueryTreeNode- Parameters:
acb- The ActivationClassBuilder for the class being builtmb- The method for the generated code to go into- Throws:
StandardException- Thrown on error
-
getFinalCostEstimate
Description copied from class:FromTableGet the final CostEstimate for this FromTable.- Overrides:
getFinalCostEstimatein classFromTable- Returns:
- The final CostEstimate for this UnionNode, which is the sum of the two child costs.
- Throws:
StandardException- See Also:
-
getOperatorName
String getOperatorName()- Specified by:
getOperatorNamein classSetOperatorNode- Returns:
- the operator name: "UNION", "INTERSECT", or "EXCEPT"
-