Class DeleteNode
- java.lang.Object
-
- All Implemented Interfaces:
Visitable
class DeleteNode extends DMLModStatementNode
A DeleteNode represents a DELETE statement. It is the top-level node for the statement. For positioned delete, there may be no from table specified. The from table will be derived from the cursor specification of the named cursor.
-
-
Field Summary
Fields Modifier and Type Field Description private boolean
cascadeDelete
private static java.lang.String
COLUMNNAME
private boolean
deferred
private ConstantAction[]
dependentConstantActions
private StatementNode[]
dependentNodes
private FormatableBitSet
readColsBitSet
private FromTable
targetTable
-
Fields inherited from class org.apache.derby.impl.sql.compile.DMLModStatementNode
dependentTables, fkColArrays, fkColDescriptors, fkIndexConglomNumbers, fkInfo, fkRefActions, fkSchemaNames, fkTableNames, indexConglomerateNumbers, indexNames, indicesToMaintain, isDependentTable, lockMode, matchingClause, relevantCdl, relevantTriggers, resultColumnList, synonymTableName, targetTableDescriptor, targetTableName, targetVTI, triggerInfo
-
Fields inherited from class org.apache.derby.impl.sql.compile.DMLStatementNode
resultSet
-
Fields inherited from class org.apache.derby.impl.sql.compile.StatementNode
EMPTY_TD_LIST, NEED_CURSOR_ACTIVATION, NEED_DDL_ACTIVATION, NEED_NOTHING_ACTIVATION, NEED_PARAM_ACTIVATION, NEED_ROW_ACTIVATION
-
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 DeleteNode(TableName targetTableName, ResultSetNode queryExpression, MatchingClauseNode matchingClause, ContextManager cm)
Constructor for a DeleteNode.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
bindStatement()
Bind this DeleteNode.private void
correlateAddedColumns(ResultColumnList rcl, FromTable fromTable)
(package private) void
generate(ActivationClassBuilder acb, MethodBuilder mb)
Code generation for delete.private static FormatableBitSet
getDeleteReadMap(TableDescriptor baseTable, java.util.List<ConglomerateDescriptor> conglomerates, TriggerDescriptorList relevantTriggers, boolean[] needsDeferredProcessing)
Builds a bitmap of all columns which should be read from the Store in order to satisfy an DELETE statement. 1) finds all indices on this table 2) adds the index columns to a bitmap of affected columns 3) adds the index descriptors to a list of conglomerate descriptors. 4) finds all DELETE triggers on the table 5) if there are any DELETE triggers, then do one of the following a)If all of the triggers have MISSING referencing clause, then that means that the trigger actions do not have access to before and after values.private StatementNode
getDependentTableNode(java.lang.String schemaName, java.lang.String tableName, int refAction, ColumnDescriptorList cdl)
In case of referential actions, we require to perform DML (UPDATE or DELETE) on the dependent tables.private DeleteNode
getEmptyDeleteNode(java.lang.String schemaName, java.lang.String targetTableName)
private UpdateNode
getEmptyUpdateNode(java.lang.String schemaName, java.lang.String targetTableName, ColumnDescriptorList cdl)
(package private) int
getPrivType()
Return default privilege needed for this node.FormatableBitSet
getReadMap(DataDictionary dd, TableDescriptor baseTable)
Gets the map of all columns which must be read out of the base table.private ResultColumnList
getSetClause(ColumnDescriptorList cdl)
protected int
getStatementType()
Return the type of statement, something from StatementType.ConstantAction
makeConstantAction()
Compile constants that Execution will usevoid
optimizeStatement()
Generate an optimized QueryTree from a bound QueryTree.boolean
referencesSessionSchema()
Return true if the node references SESSION schema tables (temporary or permanent)(package private) java.lang.String
statementToString()
-
Methods inherited from class org.apache.derby.impl.sql.compile.DMLModStatementNode
acceptChildren, adjustDeferredFlag, bindConstraints, bindRowScopedExpression, generateCheckConstraints, generateCheckConstraints, generateCodeForTemporaryTable, generateGenerationClauses, getAffectedIndexes, getAllRelevantConstraints, getAllRelevantTriggers, getCheckConstraints, getFKInfo, getReadColMap, getResultColumnList, getResultColumnList, getSchemaDescriptor, getTriggerInfo, getXAffectedIndexes, hasCheckConstraints, hasGenerationClauses, inMatchingClause, isAtomic, markAffectedIndexes, normalizeSynonymColumns, parseAndBindGenerationClauses, parseCheckConstraint, parseGenerationClause, printSubNodes, requiresDeferredProcessing, setRefActionInfo, setTarget, verifyTargetTable
-
Methods inherited from class org.apache.derby.impl.sql.compile.DMLStatementNode
activationKind, bind, bindExpressions, bindExpressionsWithTables, bindResultSetsWithTables, bindTables, generateParameterValueSet, getResultSetNode, makeResultDescription
-
Methods inherited from class org.apache.derby.impl.sql.compile.StatementNode
executeSchemaName, executeStatementName, generate, getCursorInfo, getSPSName, lockTableForCompilation, needsSavepoint, toString, updateIndexStatisticsFor
-
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, getTableDescriptor, getTypeCompiler, getUDTDesc, isPrivilegeCollectionRequired, isSessionSchema, isSessionSchema, makeTableName, makeTableName, nodeHeader, optimizerTracingIsOn, orReliability, parseSearchCondition, parseStatement, printLabel, resolveTableToSynonym, setBeginOffset, setEndOffset, stackPrint, taggedWith, treePrint, treePrint, verifyClassExist
-
-
-
-
Field Detail
-
COLUMNNAME
private static final java.lang.String COLUMNNAME
- See Also:
- Constant Field Values
-
deferred
private boolean deferred
-
targetTable
private FromTable targetTable
-
readColsBitSet
private FormatableBitSet readColsBitSet
-
dependentConstantActions
private ConstantAction[] dependentConstantActions
-
cascadeDelete
private boolean cascadeDelete
-
dependentNodes
private StatementNode[] dependentNodes
-
-
Constructor Detail
-
DeleteNode
DeleteNode(TableName targetTableName, ResultSetNode queryExpression, MatchingClauseNode matchingClause, ContextManager cm)
Constructor for a DeleteNode.- Parameters:
targetTableName
- The name of the table to delete fromqueryExpression
- The query expression that will generate the rows to delete from the given tablematchingClause
- Non-null if this DML is part of a MATCHED clause of a MERGE statement.cm
- The context manager
-
-
Method Detail
-
statementToString
java.lang.String statementToString()
- Overrides:
statementToString
in classDMLModStatementNode
-
bindStatement
public void bindStatement() throws StandardException
Bind this DeleteNode. This means looking up tables and columns and getting their types, and figuring out the result types of all expressions, as well as doing view resolution, permissions checking, etc.If any indexes need to be updated, we add all the columns in the base table to the result column list, so that we can use the column values as look-up keys for the index rows to be deleted. Binding a delete will also massage the tree so that the ResultSetNode has column containing the RowLocation of the base row.
- Overrides:
bindStatement
in classStatementNode
- Throws:
StandardException
- Thrown on error
-
getPrivType
int getPrivType()
Description copied from class:DMLStatementNode
Return default privilege needed for this node. Other DML nodes can override this method to set their own default privilege.- Overrides:
getPrivType
in classDMLStatementNode
- Returns:
- true if the statement is atomic
-
referencesSessionSchema
public boolean referencesSessionSchema() throws StandardException
Return true if the node references SESSION schema tables (temporary or permanent)- Overrides:
referencesSessionSchema
in classQueryTreeNode
- Returns:
- true if references SESSION schema tables, else false
- Throws:
StandardException
- Thrown on error
-
makeConstantAction
public ConstantAction makeConstantAction() throws StandardException
Compile constants that Execution will use- Overrides:
makeConstantAction
in classQueryTreeNode
- Throws:
StandardException
- Thrown on failure
-
generate
void generate(ActivationClassBuilder acb, MethodBuilder mb) throws StandardException
Code generation for delete. The generated code will contain: o A static member for the (xxx)ResultSet with the RowLocations o The static member will be assigned the appropriate ResultSet within the nested calls to get the ResultSets. (The appropriate cast to the (xxx)ResultSet will be generated.) o The CurrentRowLocation() in SelectNode's select list will generate a new method for returning the RowLocation as well as a call to that method which will be stuffed in the call to the ProjectRestrictResultSet. o In case of referential actions, this function generate an array of resultsets on its dependent tables.- Overrides:
generate
in classQueryTreeNode
- Parameters:
acb
- The ActivationClassBuilder for the class being builtmb
- The execute() method to be built- Throws:
StandardException
- Thrown on error
-
getStatementType
protected final int getStatementType()
Return the type of statement, something from StatementType.- Overrides:
getStatementType
in classQueryTreeNode
- Returns:
- the type of statement
-
getReadMap
public FormatableBitSet getReadMap(DataDictionary dd, TableDescriptor baseTable) throws StandardException
Gets the map of all columns which must be read out of the base table. These are the columns needed to: o maintain indices o maintain foreign keys The returned map is a FormatableBitSet with 1 bit for each column in the table plus an extra, unsued 0-bit. If a 1-based column id must be read from the base table, then the corresponding 1-based bit is turned ON in the returned FormatableBitSet.- Parameters:
dd
- the data dictionary to look inbaseTable
- the base table descriptor- Returns:
- a FormatableBitSet of columns to be read out of the base table
- Throws:
StandardException
- Thrown on error
-
getDependentTableNode
private StatementNode getDependentTableNode(java.lang.String schemaName, java.lang.String tableName, int refAction, ColumnDescriptorList cdl) throws StandardException
In case of referential actions, we require to perform DML (UPDATE or DELETE) on the dependent tables. Following function returns the DML Node for the dependent table.- Throws:
StandardException
-
getEmptyDeleteNode
private DeleteNode getEmptyDeleteNode(java.lang.String schemaName, java.lang.String targetTableName) throws StandardException
- Throws:
StandardException
-
getEmptyUpdateNode
private UpdateNode getEmptyUpdateNode(java.lang.String schemaName, java.lang.String targetTableName, ColumnDescriptorList cdl) throws StandardException
- Throws:
StandardException
-
getSetClause
private ResultColumnList getSetClause(ColumnDescriptorList cdl) throws StandardException
- Throws:
StandardException
-
optimizeStatement
public void optimizeStatement() throws StandardException
Description copied from class:DMLModStatementNode
Generate an optimized QueryTree from a bound QueryTree. Actually, it can annotate the tree in place rather than generate a new tree, but this interface allows the root node of the optimized QueryTree to be different from the root node of the bound QueryTree. For non-optimizable statements, this method is a no-op. Throws an exception if the tree is not bound, or if the binding is out of date.- Overrides:
optimizeStatement
in classDMLModStatementNode
- Throws:
StandardException
- Thrown on failure
-
getDeleteReadMap
private static FormatableBitSet getDeleteReadMap(TableDescriptor baseTable, java.util.List<ConglomerateDescriptor> conglomerates, TriggerDescriptorList relevantTriggers, boolean[] needsDeferredProcessing) throws StandardException
Builds a bitmap of all columns which should be read from the Store in order to satisfy an DELETE statement. 1) finds all indices on this table 2) adds the index columns to a bitmap of affected columns 3) adds the index descriptors to a list of conglomerate descriptors. 4) finds all DELETE triggers on the table 5) if there are any DELETE triggers, then do one of the following a)If all of the triggers have MISSING referencing clause, then that means that the trigger actions do not have access to before and after values. In that case, there is no need to blanketly decide to include all the columns in the read map just because there are triggers defined on the table. b)Since one/more triggers have REFERENCING clause on them, get all the columns because we don't know what the user will ultimately reference. 6) adds the triggers to an evolving list of triggers- Parameters:
conglomerates
- OUT: list of affected indicesrelevantTriggers
- IN/OUT. Passed in as an empty list. Filled in as we go.needsDeferredProcessing
- IN/OUT. true if the statement already needs deferred processing. set while evaluating this routine if a trigger requires deferred processing- Returns:
- a FormatableBitSet of columns to be read out of the base table
- Throws:
StandardException
- Thrown on error
-
correlateAddedColumns
private void correlateAddedColumns(ResultColumnList rcl, FromTable fromTable) throws StandardException
- Throws:
StandardException
-
-