You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by rh...@apache.org on 2014/03/21 14:07:45 UTC
svn commit: r1579937 - in
/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql:
compile/MatchingClauseNode.java compile/MergeNode.java
execute/GenericConstantActionFactory.java
execute/MatchingClauseConstantAction.java
Author: rhillegas
Date: Fri Mar 21 13:07:45 2014
New Revision: 1579937
URL: http://svn.apache.org/r1579937
Log:
DERBY-3155: Simplify processing of then rows for the DELETE actions of MERGE statements; commit derby-3155-50-aa-revampDeleteThenRows.diff.
Modified:
db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MatchingClauseNode.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MergeNode.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericConstantActionFactory.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/MatchingClauseConstantAction.java
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MatchingClauseNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MatchingClauseNode.java?rev=1579937&r1=1579936&r2=1579937&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MatchingClauseNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MatchingClauseNode.java Fri Mar 21 13:07:45 2014
@@ -87,7 +87,6 @@ public class MatchingClauseNode extends
/** the columns in the temporary conglomerate which drives the INSERT/UPDATE/DELETE */
private ResultColumnList _thenColumns;
- private int[] _deleteColumnOffsets;
// Filled in at generate() time
private int _clauseNumber;
@@ -775,33 +774,6 @@ public class MatchingClauseNode extends
}
}
- /**
- * <p>
- * Calculate the 1-based offsets which define the "then" rows which will be buffered up
- * for a DELETE action at run-time. The rows are constructed
- * from the columns in the SELECT list of the driving left joins. This method
- * calculates an array of offsets into the SELECT list. The columns at those
- * offsets will form the row which is buffered up for the DELETE
- * action.
- * </p>
- */
- private void bindDeleteThenColumns( ResultColumnList selectList )
- throws StandardException
- {
- int thenCount = _thenColumns.size();
- int selectCount = selectList.size();
-
- _deleteColumnOffsets = new int[ thenCount ];
-
- for ( int bidx = 0; bidx < thenCount; bidx++ )
- {
- ResultColumn thenRC = _thenColumns.elementAt( bidx );
- ValueNode thenExpression = thenRC.getExpression();
-
- _deleteColumnOffsets[ bidx ] = getSelectListOffset( selectList, thenExpression );
- }
- }
-
////////////////
//
// BIND INSERT
@@ -1096,100 +1068,6 @@ public class MatchingClauseNode extends
}
- ////////////////////////
- //
- // BIND THE THEN ROW
- //
- ////////////////////////
-
- /**
- * <p>
- * Bind the row which will go into the temporary table at run-time.
- * </p>
- */
- void bindThenColumns( ResultColumnList selectList )
- throws StandardException
- {
- if ( isDeleteClause() ) { bindDeleteThenColumns( selectList ); }
- }
-
- /**
- * <p>
- * Find a column reference in the SELECT list of the driving left join
- * and return its 1-based offset into that list. Returns -1 if the column
- * can't be found.
- * </p>
- */
- private int getSelectListOffset( ResultColumnList selectList, ValueNode thenExpression )
- throws StandardException
- {
- int selectCount = selectList.size();
-
- if ( thenExpression instanceof ColumnReference )
- {
- ColumnReference thenCR = (ColumnReference) thenExpression;
- String thenCRName = thenCR.getColumnName();
- int thenCRMergeTableID = getMergeTableID( thenCR );
-
- // loop through the SELECT list to find this column reference
- for ( int sidx = 0; sidx < selectCount; sidx++ )
- {
- ResultColumn selectRC = selectList.elementAt( sidx );
- ValueNode selectExpression = selectRC.getExpression();
- ColumnReference selectCR = selectExpression instanceof ColumnReference ?
- (ColumnReference) selectExpression : null;
-
- if ( selectCR != null )
- {
- if (
- ( getMergeTableID( selectCR ) == thenCRMergeTableID) &&
- thenCRName.equals( selectCR.getColumnName() )
- )
- {
- return sidx + 1;
- }
- }
- }
-
- if (SanityManager.DEBUG)
- {
- SanityManager.THROWASSERT
- (
- "Can't find select list column corresponding to " + thenCR.getSQLColumnName() +
- " with merge table id = " + thenCRMergeTableID
- );
- }
- }
- else if ( thenExpression instanceof CurrentRowLocationNode )
- {
- //
- // There is only one RowLocation in the SELECT list, the row location for the
- // tuple from the target table. The RowLocation is always the last column in
- // the SELECT list.
- //
- return selectCount;
- }
-
- return -1;
- }
-
- /** Find the MERGE table id of the indicated column */
- private int getMergeTableID( ColumnReference cr )
- {
- int mergeTableID = cr.getMergeTableID();
-
- if (SanityManager.DEBUG)
- {
- SanityManager.ASSERT
- (
- ( (mergeTableID == ColumnReference.MERGE_SOURCE) || (mergeTableID == ColumnReference.MERGE_TARGET) ),
- "Column " + cr.getSQLColumnName() + " has illegal MERGE table id: " + mergeTableID
- );
- }
-
- return mergeTableID;
- }
-
/////////////////
//
// BIND MINIONS
@@ -1307,7 +1185,6 @@ public class MatchingClauseNode extends
refinementName,
buildThenColumnSignature(),
_rowMakingMethodName,
- _deleteColumnOffsets,
_resultSetFieldName,
_actionMethodName,
_dml.makeConstantAction()
@@ -1353,7 +1230,7 @@ public class MatchingClauseNode extends
adjustMatchingRefinement( selectList, generatedScan );
- if ( isInsertClause() || isUpdateClause() ) { generateInsertUpdateRow( acb, selectList, generatedScan, hojn ); }
+ generateInsertUpdateRow( acb, selectList, generatedScan, hojn );
_actionMethodName = "mergeActionMethod_" + _clauseNumber;
@@ -1544,6 +1421,83 @@ public class MatchingClauseNode extends
}
}
+ /**
+ * <p>
+ * Find a column reference in the SELECT list of the driving left join
+ * and return its 1-based offset into that list. Returns -1 if the column
+ * can't be found.
+ * </p>
+ */
+ private int getSelectListOffset( ResultColumnList selectList, ValueNode thenExpression )
+ throws StandardException
+ {
+ int selectCount = selectList.size();
+
+ if ( thenExpression instanceof ColumnReference )
+ {
+ ColumnReference thenCR = (ColumnReference) thenExpression;
+ String thenCRName = thenCR.getColumnName();
+ int thenCRMergeTableID = getMergeTableID( thenCR );
+
+ // loop through the SELECT list to find this column reference
+ for ( int sidx = 0; sidx < selectCount; sidx++ )
+ {
+ ResultColumn selectRC = selectList.elementAt( sidx );
+ ValueNode selectExpression = selectRC.getExpression();
+ ColumnReference selectCR = selectExpression instanceof ColumnReference ?
+ (ColumnReference) selectExpression : null;
+
+ if ( selectCR != null )
+ {
+ if (
+ ( getMergeTableID( selectCR ) == thenCRMergeTableID) &&
+ thenCRName.equals( selectCR.getColumnName() )
+ )
+ {
+ return sidx + 1;
+ }
+ }
+ }
+
+ if (SanityManager.DEBUG)
+ {
+ SanityManager.THROWASSERT
+ (
+ "Can't find select list column corresponding to " + thenCR.getSQLColumnName() +
+ " with merge table id = " + thenCRMergeTableID
+ );
+ }
+ }
+ else if ( thenExpression instanceof CurrentRowLocationNode )
+ {
+ //
+ // There is only one RowLocation in the SELECT list, the row location for the
+ // tuple from the target table. The RowLocation is always the last column in
+ // the SELECT list.
+ //
+ return selectCount;
+ }
+
+ return -1;
+ }
+
+ /** Find the MERGE table id of the indicated column */
+ private int getMergeTableID( ColumnReference cr )
+ {
+ int mergeTableID = cr.getMergeTableID();
+
+ if (SanityManager.DEBUG)
+ {
+ SanityManager.ASSERT
+ (
+ ( (mergeTableID == ColumnReference.MERGE_SOURCE) || (mergeTableID == ColumnReference.MERGE_TARGET) ),
+ "Column " + cr.getSQLColumnName() + " has illegal MERGE table id: " + mergeTableID
+ );
+ }
+
+ return mergeTableID;
+ }
+
///////////////////////////////////////////////////////////////////////////////////
//
// Visitable BEHAVIOR
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MergeNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MergeNode.java?rev=1579937&r1=1579936&r2=1579937&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MergeNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MergeNode.java Fri Mar 21 13:07:45 2014
@@ -504,13 +504,6 @@ public final class MergeNode extends DML
// save a copy so that we can remap column references when generating the temporary rows
_selectList = selectList.copyListAndObjects();
- // calculate the offsets into the SELECT list which define the rows for
- // the WHEN [ NOT ] MATCHED actions
- for ( MatchingClauseNode mcn : _matchingClauses )
- {
- mcn.bindThenColumns( _selectList );
- }
-
resultSet = new SelectNode
(
selectList,
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericConstantActionFactory.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericConstantActionFactory.java?rev=1579937&r1=1579936&r2=1579937&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericConstantActionFactory.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericConstantActionFactory.java Fri Mar 21 13:07:45 2014
@@ -1155,7 +1155,6 @@ public class GenericConstantActionFactor
String matchRefinementName,
ResultDescription thenColumnSignature,
String rowMakingMethodName,
- int[] thenColumns,
String resultSetFieldName,
String actionMethodName,
ConstantAction thenAction
@@ -1167,7 +1166,6 @@ public class GenericConstantActionFactor
matchRefinementName,
thenColumnSignature,
rowMakingMethodName,
- thenColumns,
resultSetFieldName,
actionMethodName,
thenAction
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/MatchingClauseConstantAction.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/MatchingClauseConstantAction.java?rev=1579937&r1=1579936&r2=1579937&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/MatchingClauseConstantAction.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/MatchingClauseConstantAction.java Fri Mar 21 13:07:45 2014
@@ -74,7 +74,6 @@ public class MatchingClauseConstantActio
private String _matchRefinementName;
private ResultDescription _thenColumnSignature;
private String _rowMakingMethodName;
- private int[] _deleteColumnOffsets;
private String _resultSetFieldName;
private String _actionMethodName;
private ConstantAction _thenAction;
@@ -100,7 +99,7 @@ public class MatchingClauseConstantActio
* @param clauseType WHEN_NOT_MATCHED_THEN_INSERT, WHEN_MATCHED_THEN_UPDATE, WHEN_MATCHED_THEN_DELETE
* @param matchRefinementName Name of the method which evaluates the boolean expression in the WHEN clause.
* @param thenColumnSignature The shape of the row which goes into the temporary table.
- * @param thenColumns Column positions (1-based) from the driving left join which are needed to execute the THEN clause.
+ * @param rowMakingMethodName Name of the method which populates the "then" row with expressions from the driving left join.
* @param resultSetFieldName Name of the field which will be stuffed at runtime with the temporary table of relevant rows.
* @param actionMethodName Name of the method which invokes the INSERT/UPDATE/DELETE action.
* @param thenAction The ConstantAction describing the associated INSERT/UPDATE/DELETE action.
@@ -111,7 +110,6 @@ public class MatchingClauseConstantActio
String matchRefinementName,
ResultDescription thenColumnSignature,
String rowMakingMethodName,
- int[] thenColumns,
String resultSetFieldName,
String actionMethodName,
ConstantAction thenAction
@@ -121,7 +119,6 @@ public class MatchingClauseConstantActio
_matchRefinementName = matchRefinementName;
_thenColumnSignature = thenColumnSignature;
_rowMakingMethodName = rowMakingMethodName;
- _deleteColumnOffsets = ArrayUtil.copy( thenColumns );
_resultSetFieldName = resultSetFieldName;
_actionMethodName = actionMethodName;
_thenAction = thenAction;
@@ -248,18 +245,7 @@ public class MatchingClauseConstantActio
{
if ( thenRows == null ) { thenRows = createThenRows( activation ); }
- ExecRow thenRow;
-
- switch( _clauseType )
- {
- case WHEN_MATCHED_THEN_DELETE:
- thenRow = bufferThenRowForDelete( activation, selectRow );
- break;
-
- default:
- thenRow = bufferThenRow( activation );
- break;
- }
+ ExecRow thenRow = bufferThenRow( activation );
thenRows.insert( thenRow );
@@ -285,37 +271,12 @@ public class MatchingClauseConstantActio
///////////////////////////////////////////////////////////////////////////////////
//
- // MINIONS
+ // CONSTRUCT ROWS TO PUT INTO THE TEMPORARY TABLE
//
///////////////////////////////////////////////////////////////////////////////////
/**
* <p>
- * Construct and buffer a row for the DELETE
- * action corresponding to this MATCHED clause. The buffered row
- * is built from columns in the passed-in row. The passed-in row is the SELECT list
- * of the MERGE statement's driving left join.
- * </p>
- */
- private ExecRow bufferThenRowForDelete
- (
- Activation activation,
- ExecRow selectRow
- )
- throws StandardException
- {
- int thenRowLength = _thenColumnSignature.getColumnCount();
- ValueRow thenRow = new ValueRow( thenRowLength );
- for ( int i = 0; i < thenRowLength; i++ )
- {
- thenRow.setColumn( i + 1, selectRow.getColumn( _deleteColumnOffsets[ i ] ) );
- }
-
- return thenRow;
- }
-
- /**
- * <p>
* Construct and buffer a row for the INSERT/UPDATE/DELETE
* action corresponding to this [ NOT ] MATCHED clause.
* </p>
@@ -370,7 +331,6 @@ public class MatchingClauseConstantActio
_matchRefinementName = (String) in.readObject();
_thenColumnSignature = (ResultDescription) in.readObject();
_rowMakingMethodName = (String) in.readObject();
- _deleteColumnOffsets = ArrayUtil.readIntArray( in );
_resultSetFieldName = (String) in.readObject();
_actionMethodName = (String) in.readObject();
_thenAction = (ConstantAction) in.readObject();
@@ -392,7 +352,6 @@ public class MatchingClauseConstantActio
out.writeObject( _matchRefinementName );
out.writeObject( _thenColumnSignature );
out.writeObject( _rowMakingMethodName );
- ArrayUtil.writeIntArray( out, _deleteColumnOffsets );
out.writeObject( _resultSetFieldName );
out.writeObject( _actionMethodName );
out.writeObject( _thenAction );