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 ka...@apache.org on 2012/12/12 10:14:53 UTC

svn commit: r1420579 - in /db/derby/code/trunk/java/engine/org/apache/derby: iapi/sql/execute/ impl/sql/compile/ impl/sql/execute/

Author: kahatlen
Date: Wed Dec 12 09:14:44 2012
New Revision: 1420579

URL: http://svn.apache.org/viewvc?rev=1420579&view=rev
Log:
DERBY-6003: Create row templates outside of the generated code

Make SortResultSet, VTIResultSet, aggregates and WindowResultSet use an
ExecRowBuilder instead of a generated method to allocate row templates.

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/execute/ResultSetFactory.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/DistinctNode.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/FromVTI.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/GroupByNode.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/OrderByList.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/WindowResultSetNode.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DistinctGroupedAggregateResultSet.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DistinctScalarAggregateResultSet.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericAggregateResultSet.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericResultSetFactory.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GroupedAggregateResultSet.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ScalarAggregateResultSet.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/SortResultSet.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/VTIResultSet.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/WindowResultSet.java

Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/execute/ResultSetFactory.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/execute/ResultSetFactory.java?rev=1420579&r1=1420578&r2=1420579&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/execute/ResultSetFactory.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/execute/ResultSetFactory.java Wed Dec 12 09:14:44 2012
@@ -382,7 +382,7 @@ public interface ResultSetFactory {
 		@param distinct true if distinct SELECT list
 		@param isInSortedOrder	true if the source result set is in sorted order
 		@param orderItem entry in preparedStatement's savedObjects for order
-		@param rowAllocator a reference to a method in the activation
+		@param rowAllocator a reference to a saved object
 			that generates rows of the right size and shape for the source
 		@param rowSize the size of the row that is allocated by rowAllocator.
 			size should be the maximum size of the sum of all the datatypes.
@@ -399,7 +399,7 @@ public interface ResultSetFactory {
 		boolean distinct, 
 		boolean isInSortedOrder,
 		int orderItem,
-		GeneratedMethod rowAllocator, 
+		int rowAllocator,
 		int rowSize,
 		int resultSetNumber, 
 		double optimizerEstimatedRowCount,
@@ -415,7 +415,7 @@ public interface ResultSetFactory {
 		@param isInSortedOrder	true if the source result set is in sorted order
 		@param aggregateItem entry in preparedStatement's savedObjects for aggregates
 		@param orderingItem		Ignored to allow same signature as getDistinctScalarAggregateResultSet
-		@param rowAllocator a reference to a method in the activation
+		@param rowAllocator     a reference to a saved object
 			that generates rows of the right size and shape for the source
 		@param rowSize			Ignored to allow same signature as getDistinctScalarAggregateResultSet
 		@param resultSetNumber	The resultSetNumber for the ResultSet
@@ -431,7 +431,7 @@ public interface ResultSetFactory {
 		boolean isInSortedOrder,
 		int aggregateItem,
 		int orderingItem,
-		GeneratedMethod rowAllocator, 
+		int rowAllocator,
 		int rowSize,
 		int resultSetNumber, 
 		boolean singleInputRow,
@@ -449,7 +449,7 @@ public interface ResultSetFactory {
 		@param isInSortedOrder	true if the source result set is in sorted order
 		@param aggregateItem entry in preparedStatement's savedObjects for aggregates
 		@param orderingItem entry in preparedStatement's savedObjects for order
-		@param rowAllocator a reference to a method in the activation
+		@param rowAllocator a reference to a saved object
 			that generates rows of the right size and shape for the source
 		@param rowSize the size of the row that is allocated by rowAllocator.
 			size should be the maximum size of the sum of all the datatypes.
@@ -467,7 +467,7 @@ public interface ResultSetFactory {
 		boolean isInSortedOrder,
 		int aggregateItem,
 		int orderingItem,
-		GeneratedMethod rowAllocator, 
+		int rowAllocator,
 		int rowSize,
 		int resultSetNumber, 
 		boolean singleInputRow,
@@ -484,7 +484,7 @@ public interface ResultSetFactory {
 		@param isInSortedOrder	true if the source result set is in sorted order
 		@param aggregateItem entry in preparedStatement's savedObjects for aggregates
 		@param orderingItem		Ignored to allow same signature as getDistinctScalarAggregateResultSet
-		@param rowAllocator a reference to a method in the activation
+		@param rowAllocator     a reference to a saved object
 			that generates rows of the right size and shape for the source
 		@param rowSize			Ignored to allow same signature as getDistinctScalarAggregateResultSet
 		@param resultSetNumber	The resultSetNumber for the ResultSet
@@ -500,7 +500,7 @@ public interface ResultSetFactory {
 		boolean isInSortedOrder,
 		int aggregateItem,
 		int orderingItem,
-		GeneratedMethod rowAllocator, 
+		int rowAllocator,
 		int rowSize,
 		int resultSetNumber, 
 		double optimizerEstimatedRowCount,
@@ -518,7 +518,7 @@ public interface ResultSetFactory {
 		@param isInSortedOrder	true if the source result set is in sorted order
 		@param aggregateItem entry in preparedStatement's savedObjects for aggregates
 		@param orderingItem entry in preparedStatement's savedObjects for order
-		@param rowAllocator a reference to a method in the activation
+		@param rowAllocator a reference to a saved object
 			that generates rows of the right size and shape for the source
 		@param rowSize the size of the row that is allocated by rowAllocator.
 			size should be the maximum size of the sum of all the datatypes.
@@ -536,7 +536,7 @@ public interface ResultSetFactory {
 		boolean isInSortedOrder,
 		int aggregateItem,
 		int orderingItem,
-		GeneratedMethod rowAllocator, 
+		int rowAllocator,
 		int rowSize,
 		int resultSetNumber, 
 		double optimizerEstimatedRowCount,
@@ -640,11 +640,8 @@ public interface ResultSetFactory {
 		@param activation the activation for this result set,
 			against which the row operation is performed to
 			create the result set.
-		@param row a reference to a method in the activation
+		@param row a reference to a saved object
 			that creates the expected row.
-			<verbatim>
-				ExecRow row() throws StandardException;
-			</verbatim>
 		@param resultSetNumber	The resultSetNumber for the ResultSet
 		@param constructor		The GeneratedMethod for the user's constructor
 		@param javaClassName	The java class name for the VTI
@@ -661,7 +658,7 @@ public interface ResultSetFactory {
 		@exception StandardException thrown when unable to create the
 			result set
 	 */
-	public NoPutResultSet getVTIResultSet(Activation activation, GeneratedMethod row,
+	public NoPutResultSet getVTIResultSet(Activation activation, int row,
 									 int resultSetNumber,
 									 GeneratedMethod constructor,
 									 String javaClassName,
@@ -1101,7 +1098,7 @@ public interface ResultSetFactory {
 	   <p>
 	   @param activation   Activation
 	   @param source       The result set input to this result set.
-	   @param rowAllocator A reference to a method in the activation
+	   @param rowAllocator A reference to a saved object
 			               that generates rows of the right size and
 						   shape for the source.
 	   @param resultSetNumber The resultSetNumber for the ResultSet
@@ -1118,7 +1115,7 @@ public interface ResultSetFactory {
 	public NoPutResultSet getWindowResultSet(
 								Activation activation,
 								NoPutResultSet source,
-								GeneratedMethod rowAllocator,
+								int rowAllocator,
 								int resultSetNumber,
 								int erdNumber,
 								GeneratedMethod restriction,

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/DistinctNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/DistinctNode.java?rev=1420579&r1=1420578&r2=1420579&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/DistinctNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/DistinctNode.java Wed Dec 12 09:14:44 2012
@@ -313,7 +313,7 @@ public class DistinctNode extends Single
 		mb.push(true);
 		mb.push(inSortedOrder);
 		mb.push(orderItem);
-		resultColumns.generateHolder(acb, mb);
+        mb.push(acb.addItem(resultColumns.buildRowTemplate(null)));
 		mb.push(resultColumns.getTotalColumnSize());
 		mb.push(resultSetNumber);
 		mb.push(costEstimate.rowCount());

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/FromVTI.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/FromVTI.java?rev=1420579&r1=1420578&r2=1420579&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/FromVTI.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/FromVTI.java Wed Dec 12 09:14:44 2012
@@ -1661,8 +1661,8 @@ public class FromVTI extends FromTable i
 
 		acb.pushThisAsActivation(mb); // arg 1
 
-        // get a function to allocate scan rows of the right shape and size
-		resultColumns.generateHolder(acb, mb); // arg 2
+        // Get a row builder to allocate scan rows of the right shape and size.
+        mb.push(acb.addItem(resultColumns.buildRowTemplate(null))); // arg 2
 
 		// For a Version 2 VTI we never maintain the java.sql.PreparedStatement
 		// from compile time to execute time. This would rquire the PreparedStatement

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/GroupByNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/GroupByNode.java?rev=1420579&r1=1420578&r2=1420579&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/GroupByNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/GroupByNode.java Wed Dec 12 09:14:44 2012
@@ -1088,7 +1088,7 @@ public class GroupByNode extends SingleC
 		mb.push(aggInfoItem);
 		mb.push(orderingItem);
 
-		resultColumns.generateHolder(acb, mb);
+        mb.push(acb.addItem(resultColumns.buildRowTemplate(null)));
 
 		mb.push(resultColumns.getTotalColumnSize());
 		mb.push(resultSetNumber);

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/OrderByList.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/OrderByList.java?rev=1420579&r1=1420578&r2=1420579&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/OrderByList.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/OrderByList.java Wed Dec 12 09:14:44 2012
@@ -398,7 +398,7 @@ public class OrderByList extends Ordered
 		mb.push(orderItem);
 
 		// row allocator
-		child.getResultColumns().generateHolder(acb, mb);
+        mb.push(acb.addItem(child.getResultColumns().buildRowTemplate(null)));
 
 		mb.push(child.getResultColumns().getTotalColumnSize());
 

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java?rev=1420579&r1=1420578&r2=1420579&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java Wed Dec 12 09:14:44 2012
@@ -1561,25 +1561,6 @@ public class ResultColumnList extends Qu
 		@exception StandardException
 	 */
 	void generateHolder(ExpressionClassBuilder acb,
-								MethodBuilder mb)
-							throws StandardException 
-	{
-		generateHolder(acb, mb, (FormatableBitSet) null, (FormatableBitSet) null);
-	}
-
-	/**
-		Generates a row with the size and shape of the ResultColumnList.
-
-		Some structures, like FromBaseTable and DistinctNode,
-		need to generate rowAllocator functions to get a row
-		the size and shape of their ResultColumnList.  
-
-		We return the method pointer, which is a field access
-		in the generated class.
-
-		@exception StandardException
-	 */
-	void generateHolder(ExpressionClassBuilder acb,
 								MethodBuilder mb,
 								FormatableBitSet referencedCols,
 								FormatableBitSet propagatedCols)

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/WindowResultSetNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/WindowResultSetNode.java?rev=1420579&r1=1420578&r2=1420579&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/WindowResultSetNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/WindowResultSetNode.java Wed Dec 12 09:14:44 2012
@@ -410,7 +410,7 @@ public class WindowResultSetNode extends
         mb.upCast(ClassName.NoPutResultSet);
 
         /* row allocator */
-        resultColumns.generateHolder(acb, mb); // arg 3
+        mb.push(acb.addItem(resultColumns.buildRowTemplate(null))); // arg 3
 
         mb.push(resultSetNumber); //arg 4
 

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DistinctGroupedAggregateResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DistinctGroupedAggregateResultSet.java?rev=1420579&r1=1420578&r2=1420579&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DistinctGroupedAggregateResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DistinctGroupedAggregateResultSet.java Wed Dec 12 09:14:44 2012
@@ -52,8 +52,7 @@ class DistinctGroupedAggregateResultSet 
 	 *		SavedObject off of the PreparedStatement that holds the
 	 *		ColumOrdering array used by this routine
 	 * @param	a				activation
-	 * @param	ra				generated method to build an empty
-	 *	 	output row 
+	 * @param	ra				saved object that builds an empty output row
 	 * @param	maxRowSize		approx row size, passed to sorter
 	 * @param	resultSetNumber	The resultSetNumber for this result set
 	 *
@@ -64,7 +63,7 @@ class DistinctGroupedAggregateResultSet 
 					int	aggregateItem,
 					int	orderingItem,
 					Activation a,
-					GeneratedMethod ra,
+					int ra,
 					int maxRowSize,
 					int resultSetNumber,
 					double optimizerEstimatedRowCount,

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DistinctScalarAggregateResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DistinctScalarAggregateResultSet.java?rev=1420579&r1=1420578&r2=1420579&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DistinctScalarAggregateResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DistinctScalarAggregateResultSet.java Wed Dec 12 09:14:44 2012
@@ -35,9 +35,6 @@ import org.apache.derby.iapi.store.acces
 import org.apache.derby.iapi.store.access.SortController;
 import org.apache.derby.iapi.store.access.ScanController;
 
-import org.apache.derby.iapi.services.loader.GeneratedMethod;
-
-
 import org.apache.derby.iapi.error.StandardException;
 
 import org.apache.derby.iapi.services.io.FormatableArrayHolder;
@@ -77,8 +74,7 @@ class DistinctScalarAggregateResultSet e
 	 *		SavedObject off of the PreparedStatement that holds the
 	 *		AggregatorInfoList used by this routine. 
 	 * @param	a				activation
-	 * @param	ra				generated method to build an empty
-	 *	 	output row 
+	 * @param	ra				saved object that builds an empty output row
 	 * @param	resultSetNumber	The resultSetNumber for this result set
 	 *
 	 * @exception StandardException Thrown on error
@@ -88,7 +84,7 @@ class DistinctScalarAggregateResultSet e
 					int	aggregateItem,
 					int	orderingItem,
 					Activation a,
-					GeneratedMethod ra,
+					int ra,
 					int maxRowSize,
 					int resultSetNumber,
 					boolean singleInputRow,
@@ -133,8 +129,8 @@ class DistinctScalarAggregateResultSet e
 		if (SanityManager.DEBUG)
 	    	SanityManager.ASSERT( ! isOpen, "DistinctScalarResultSet already open");
 
-		sortResultRow = getExecutionFactory().getIndexableRow(sortTemplateRow.getClone());
-		sourceExecIndexRow = getExecutionFactory().getIndexableRow(sortTemplateRow.getClone());
+        sortResultRow = (ExecIndexRow) getRowTemplate().getClone();
+        sourceExecIndexRow = (ExecIndexRow) getRowTemplate().getClone();
 
         source.openCore();
 
@@ -353,6 +349,7 @@ class DistinctScalarAggregateResultSet e
 	{
 		SortController 			sorter;
 		ExecRow 				sourceRow;
+        ExecIndexRow            sortTemplateRow = getRowTemplate();
 		int						inputRowCountEstimate = (int) optimizerEstimatedRowCount;
 
 		TransactionController tc = getTransactionController();

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericAggregateResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericAggregateResultSet.java?rev=1420579&r1=1420578&r2=1420579&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericAggregateResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericAggregateResultSet.java Wed Dec 12 09:14:44 2012
@@ -27,11 +27,13 @@ import org.apache.derby.iapi.error.SQLWa
 import org.apache.derby.iapi.error.StandardException;
 import org.apache.derby.iapi.reference.SQLState;
 import org.apache.derby.iapi.services.loader.ClassFactory;
-import org.apache.derby.iapi.services.loader.GeneratedMethod;
 import org.apache.derby.iapi.sql.Activation;
 import org.apache.derby.iapi.sql.conn.LanguageConnectionContext;
 import org.apache.derby.iapi.sql.execute.ExecIndexRow;
+import org.apache.derby.iapi.sql.execute.ExecPreparedStatement;
 import org.apache.derby.iapi.sql.execute.ExecRow;
+import org.apache.derby.iapi.sql.execute.ExecRowBuilder;
+import org.apache.derby.iapi.sql.execute.ExecutionFactory;
 import org.apache.derby.iapi.sql.execute.NoPutResultSet;
 
 /**
@@ -41,16 +43,16 @@ import org.apache.derby.iapi.sql.execute
 abstract class GenericAggregateResultSet extends NoPutResultSetImpl
 {
 	protected GenericAggregator[]		aggregates;	
-	protected GeneratedMethod			rowAllocator;
 	protected AggregatorInfoList	aggInfoList;	
 	public NoPutResultSet source;
 	protected	NoPutResultSet	originalSource; // used for run time stats only
+    private final ExecIndexRow rowTemplate;
 
 	/**
 	 * Constructor
 	 *
 	 * @param a activation
-	 * @param ra row allocator generated method
+	 * @param ra reference to a saved row allocator instance
 	 * @param resultSetNumber result set number
 	 * @param optimizerEstimatedRowCount optimizer estimated row count
 	 * @param optimizerEstimatedCost optimizer estimated cost
@@ -62,7 +64,7 @@ abstract class GenericAggregateResultSet
 		NoPutResultSet s,
 		int	aggregateItem,
 		Activation 	a,
-		GeneratedMethod	ra,
+		int ra,
 		int 			resultSetNumber,
 		double 			optimizerEstimatedRowCount,
 		double 			optimizerEstimatedCost
@@ -73,14 +75,28 @@ abstract class GenericAggregateResultSet
 		source = s;
 		originalSource = s;
 
+        ExecPreparedStatement ps = a.getPreparedStatement();
+        ExecutionFactory ef = a.getExecutionFactory();
 
-		rowAllocator = ra;
+        rowTemplate = ef.getIndexableRow(
+                ((ExecRowBuilder) ps.getSavedObject(ra)).build(ef));
 
-		aggInfoList = (AggregatorInfoList) (a.getPreparedStatement().getSavedObject(aggregateItem));
+		aggInfoList = (AggregatorInfoList) ps.getSavedObject(aggregateItem);
 		aggregates = getSortAggregators(aggInfoList, false, 
 				a.getLanguageConnectionContext(), s);
 	}
 
+    /**
+     * Get a template row of the right shape for sorting or returning results.
+     * The template is cached, so it may need to be cloned if callers use it
+     * for multiple purposes at the same time.
+     *
+     * @return a row template of the right shape for this result set
+     */
+    ExecIndexRow getRowTemplate() {
+        return rowTemplate;
+    }
+
 	/**
 	 * For each AggregatorInfo in the list, generate a
 	 * GenericAggregator and stick it in an array of
@@ -160,7 +176,7 @@ abstract class GenericAggregateResultSet
 		*/ 
 		if (row == null)
 		{
-			row = getExecutionFactory().getIndexableRow((ExecRow) rowAllocator.invoke(activation));
+			row = getRowTemplate();
 		}
 
 		setCurrentRow(row);

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericResultSetFactory.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericResultSetFactory.java?rev=1420579&r1=1420578&r2=1420579&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericResultSetFactory.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GenericResultSetFactory.java Wed Dec 12 09:14:44 2012
@@ -270,7 +270,7 @@ public class GenericResultSetFactory imp
 		boolean distinct, 
 		boolean isInSortedOrder,
 		int orderItem,
-		GeneratedMethod rowAllocator, 
+		int rowAllocator,
 		int maxRowSize,
 		int resultSetNumber, 
 		double optimizerEstimatedRowCount,
@@ -297,7 +297,7 @@ public class GenericResultSetFactory imp
 		boolean isInSortedOrder,
 		int aggregateItem,
 		int orderItem,
-		GeneratedMethod rowAllocator, 
+		int rowAllocator,
 		int maxRowSize,
 		int resultSetNumber, 
 		boolean singleInputRow,
@@ -320,7 +320,7 @@ public class GenericResultSetFactory imp
 		boolean isInSortedOrder,
 		int aggregateItem,
 		int orderItem,
-		GeneratedMethod rowAllocator, 
+		int rowAllocator,
 		int maxRowSize,
 		int resultSetNumber, 
 		boolean singleInputRow,
@@ -343,7 +343,7 @@ public class GenericResultSetFactory imp
 		boolean isInSortedOrder,
 		int aggregateItem,
 		int orderItem,
-		GeneratedMethod rowAllocator, 
+		int rowAllocator,
 		int maxRowSize,
 		int resultSetNumber, 
 		double optimizerEstimatedRowCount,
@@ -365,7 +365,7 @@ public class GenericResultSetFactory imp
 		boolean isInSortedOrder,
 		int aggregateItem,
 		int orderItem,
-		GeneratedMethod rowAllocator, 
+		int rowAllocator,
 		int maxRowSize,
 		int resultSetNumber, 
 		double optimizerEstimatedRowCount,
@@ -436,7 +436,7 @@ public class GenericResultSetFactory imp
 		@see ResultSetFactory#getVTIResultSet
 		@exception StandardException thrown on error
 	 */
-	public NoPutResultSet getVTIResultSet(Activation activation, GeneratedMethod row,
+	public NoPutResultSet getVTIResultSet(Activation activation, int row,
 									 int resultSetNumber,
 									 GeneratedMethod constructor,
 									 String javaClassName,
@@ -842,7 +842,7 @@ public class GenericResultSetFactory imp
 	public NoPutResultSet getWindowResultSet(
 								Activation activation,
 								NoPutResultSet source,
-								GeneratedMethod rowAllocator,
+								int rowAllocator,
 								int resultSetNumber,
 								int erdNumber,
 								GeneratedMethod restriction,

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GroupedAggregateResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GroupedAggregateResultSet.java?rev=1420579&r1=1420578&r2=1420579&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GroupedAggregateResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/GroupedAggregateResultSet.java Wed Dec 12 09:14:44 2012
@@ -28,7 +28,6 @@ import java.util.HashSet;
 
 import org.apache.derby.iapi.error.StandardException;
 import org.apache.derby.iapi.services.io.FormatableArrayHolder;
-import org.apache.derby.iapi.services.loader.GeneratedMethod;
 import org.apache.derby.iapi.services.sanity.SanityManager;
 import org.apache.derby.iapi.sql.Activation;
 import org.apache.derby.iapi.sql.execute.CursorResultSet;
@@ -85,7 +84,6 @@ class GroupedAggregateResultSet extends 
     // set in constructor and not altered during
     // life of object.
 	private ColumnOrdering[] order;
-	private ExecIndexRow sortTemplateRow;
 	public	boolean	hasDistinctAggregate;	// true if distinct aggregate
 	public	boolean isInSortedOrder;				// true if source results in sorted order
 	private	int numDistinctAggs = 0;
@@ -145,8 +143,7 @@ class GroupedAggregateResultSet extends 
 	 *		SavedObject off of the PreparedStatement that holds the
 	 *		ColumOrdering array used by this routine
 	 * @param	a				activation
-	 * @param	ra				generated method to build an empty
-	 *	 	output row 
+	 * @param	ra				saved object that builds an empty output row
 	 * @param	maxRowSize		approx row size, passed to sorter
 	 * @param	resultSetNumber	The resultSetNumber for this result set
 	 *
@@ -157,7 +154,7 @@ class GroupedAggregateResultSet extends 
 					int	aggregateItem,
 					int	orderingItem,
 					Activation a,
-					GeneratedMethod ra,
+					int ra,
 					int maxRowSize,
 					int resultSetNumber,
 				    double optimizerEstimatedRowCount,
@@ -168,7 +165,6 @@ class GroupedAggregateResultSet extends 
 		this.isInSortedOrder = isInSortedOrder;
 		rollup = isRollup;
 		finishedResults = new ArrayList();
-		sortTemplateRow = getExecutionFactory().getIndexableRow((ExecRow) rowAllocator.invoke(activation));
 		order = (ColumnOrdering[])
 					((FormatableArrayHolder)
 						(a.getPreparedStatement().getSavedObject(orderingItem)))
@@ -213,8 +209,8 @@ class GroupedAggregateResultSet extends 
 		if (SanityManager.DEBUG)
 	    	SanityManager.ASSERT( ! isOpen, "GroupedAggregateResultSet already open");
 
-		sortResultRow = getExecutionFactory().getIndexableRow(sortTemplateRow.getClone());
-		sourceExecIndexRow = getExecutionFactory().getIndexableRow(sortTemplateRow.getClone());
+        sortResultRow = (ExecIndexRow) getRowTemplate().getClone();
+        sourceExecIndexRow = (ExecIndexRow) getRowTemplate().getClone();
 
         source.openCore();
 
@@ -282,9 +278,9 @@ class GroupedAggregateResultSet extends 
 		throws StandardException
 	{
 		SortController 			sorter;
-		ExecRow 				sourceRow;
 		ExecRow 				inputRow;
 		int						inputRowCountEstimate = (int) optimizerEstimatedRowCount;
+        ExecIndexRow            sortTemplateRow = getRowTemplate();
 
 		tc = getTransactionController();
 

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ScalarAggregateResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ScalarAggregateResultSet.java?rev=1420579&r1=1420578&r2=1420579&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ScalarAggregateResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ScalarAggregateResultSet.java Wed Dec 12 09:14:44 2012
@@ -22,7 +22,6 @@
 package org.apache.derby.impl.sql.execute;
 
 import org.apache.derby.iapi.error.StandardException;
-import org.apache.derby.iapi.services.loader.GeneratedMethod;
 import org.apache.derby.iapi.services.sanity.SanityManager;
 import org.apache.derby.iapi.sql.Activation;
 import org.apache.derby.iapi.sql.execute.CursorResultSet;
@@ -48,7 +47,6 @@ class ScalarAggregateResultSet extends G
     // set in constructor and not altered during
     // life of object.
 	public 		boolean 			singleInputRow;
-	protected 	ExecIndexRow 		sortTemplateRow;
 	protected 	boolean 			isInSortedOrder;		// true if source results in sorted order
 
 	// Cache ExecIndexRow for scalar aggregates
@@ -66,8 +64,7 @@ class ScalarAggregateResultSet extends G
 	 *		SavedObject off of the PreparedStatement that holds the
 	 *		AggregatorInfoList used by this routine. 
 	 * @param	a				activation
-	 * @param	ra				generated method to build an empty
-	 *	 	output row 
+	 * @param	ra				saved object that builds an empty output row
 	 * @param	resultSetNumber	The resultSetNumber for this result set
 	 *
 	 * @exception StandardException Thrown on error
@@ -76,7 +73,7 @@ class ScalarAggregateResultSet extends G
 					boolean isInSortedOrder,
 					int	aggregateItem,
 					Activation a,
-					GeneratedMethod ra,
+					int ra,
 					int resultSetNumber,
 					boolean singleInputRow,
 				    double optimizerEstimatedRowCount,
@@ -91,7 +88,6 @@ class ScalarAggregateResultSet extends G
 			SanityManager.ASSERT(source != null,
 				"SARS(), source expected to be non-null");
 		}
-		sortTemplateRow = getExecutionFactory().getIndexableRow((ExecRow) rowAllocator.invoke(activation));
 		this.singleInputRow = singleInputRow;
 
 		if (SanityManager.DEBUG)
@@ -128,7 +124,7 @@ class ScalarAggregateResultSet extends G
 	    	SanityManager.ASSERT( ! isOpen, "ScalarAggregateResultSet already open");
 		}
 
-		sourceExecIndexRow = getExecutionFactory().getIndexableRow(sortTemplateRow);
+		sourceExecIndexRow = (ExecIndexRow) getRowTemplate().getClone();
 
         source.openCore();
 

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/SortResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/SortResultSet.java?rev=1420579&r1=1420578&r2=1420579&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/SortResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/SortResultSet.java Wed Dec 12 09:14:44 2012
@@ -21,17 +21,10 @@
 
 package org.apache.derby.impl.sql.execute;
 
-import org.apache.derby.iapi.services.monitor.Monitor;
-
 import org.apache.derby.iapi.services.sanity.SanityManager;
 
-import org.apache.derby.iapi.services.stream.HeaderPrintWriter;
-import org.apache.derby.iapi.services.stream.InfoStreams;
-
-import org.apache.derby.iapi.services.io.Formatable;
-
 import org.apache.derby.iapi.sql.execute.CursorResultSet;
-import org.apache.derby.iapi.sql.ResultSet;
+import org.apache.derby.iapi.sql.execute.ExecPreparedStatement;
 import org.apache.derby.iapi.sql.execute.ExecRow;
 import org.apache.derby.iapi.sql.execute.NoPutResultSet;
 
@@ -44,10 +37,6 @@ import org.apache.derby.iapi.store.acces
 import org.apache.derby.iapi.store.access.SortController;
 import org.apache.derby.iapi.store.access.ScanController;
 
-import org.apache.derby.iapi.services.loader.GeneratedMethod;
-
-import org.apache.derby.iapi.sql.conn.LanguageConnectionContext;
-
 import org.apache.derby.iapi.error.StandardException;
 
 import org.apache.derby.iapi.types.RowLocation;
@@ -55,8 +44,7 @@ import org.apache.derby.iapi.types.RowLo
 import org.apache.derby.iapi.services.io.FormatableArrayHolder;
 
 import java.util.Properties;
-import java.util.Vector;
-import java.util.Enumeration;
+import org.apache.derby.iapi.sql.execute.ExecRowBuilder;
 
 /**
  * Takes a source result set, sends it to the sorter,
@@ -122,7 +110,6 @@ class SortResultSet extends NoPutResultS
     // set in constructor and not altered during
     // life of object.
     public NoPutResultSet source;
-	private GeneratedMethod rowAllocator;
 	private ColumnOrdering[] order;
 	private ColumnOrdering[] savedOrder;
 	private SortObserver observer;
@@ -164,8 +151,7 @@ class SortResultSet extends NoPutResultS
 	 *		SavedObject off of the PreparedStatement that holds the
 	 *		ColumOrdering array used by this routine
 	 * @param	a				activation
-	 * @param	ra				generated method to build an empty
-	 *	 	output row 
+     * @param   ra              saved object that generates an empty row
 	 * @param	maxRowSize		approx row size, passed to sorter
 	 * @param	resultSetNumber	The resultSetNumber for this result set
 	 *
@@ -176,7 +162,7 @@ class SortResultSet extends NoPutResultS
 					boolean isInSortedOrder,
 					int	orderingItem,
 					Activation a,
-					GeneratedMethod ra,
+					int ra,
 					int maxRowSize,
 					int resultSetNumber,
 				    double optimizerEstimatedRowCount,
@@ -187,12 +173,15 @@ class SortResultSet extends NoPutResultS
 		this.isInSortedOrder = isInSortedOrder;
         source = s;
         originalSource = s;
-		rowAllocator = ra;
 		this.maxRowSize = maxRowSize;
-		sortTemplateRow = (ExecRow) rowAllocator.invoke(activation);
+
+        ExecPreparedStatement ps = a.getPreparedStatement();
+
+		sortTemplateRow = ((ExecRowBuilder) ps.getSavedObject(ra))
+                                .build(a.getExecutionFactory());
+
 		order = (ColumnOrdering[])
-					((FormatableArrayHolder)
-						(a.getPreparedStatement().getSavedObject(orderingItem)))
+					((FormatableArrayHolder) ps.getSavedObject(orderingItem))
 					.getArray(ColumnOrdering.class);
 
 		/* NOTE: We need to save order to another variable

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/VTIResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/VTIResultSet.java?rev=1420579&r1=1420578&r2=1420579&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/VTIResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/VTIResultSet.java Wed Dec 12 09:14:44 2012
@@ -26,7 +26,9 @@ import org.apache.derby.catalog.TypeDesc
 import org.apache.derby.iapi.services.sanity.SanityManager;
 
 import org.apache.derby.iapi.sql.execute.CursorResultSet;
+import org.apache.derby.iapi.sql.execute.ExecPreparedStatement;
 import org.apache.derby.iapi.sql.execute.ExecRow;
+import org.apache.derby.iapi.sql.execute.ExecRowBuilder;
 import org.apache.derby.iapi.sql.execute.NoPutResultSet;
 
 import org.apache.derby.iapi.sql.Activation;
@@ -70,11 +72,10 @@ class VTIResultSet extends NoPutResultSe
 	public int rowsReturned;
 	public String javaClassName;
 
-    private GeneratedMethod row;
     private GeneratedMethod constructor;
 	private PreparedStatement userPS;
 	private ResultSet userVTI;
-	private ExecRow allocatedRow;
+	private final ExecRow allocatedRow;
 	private FormatableBitSet referencedColumns;
 	private boolean version2;
 	private boolean reuseablePs;
@@ -107,7 +108,7 @@ class VTIResultSet extends NoPutResultSe
     //
     // class interface
     //
-    VTIResultSet(Activation activation, GeneratedMethod row, int resultSetNumber,
+    VTIResultSet(Activation activation, int row, int resultSetNumber,
 				 GeneratedMethod constructor,
 				 String javaClassName,
 				 Qualifier[][] pushedQualifiers,
@@ -127,7 +128,6 @@ class VTIResultSet extends NoPutResultSe
 	{
 		super(activation, resultSetNumber, 
 			  optimizerEstimatedRowCount, optimizerEstimatedCost);
-        this.row = row;
 		this.constructor = constructor;
 		this.javaClassName = javaClassName;
 		this.version2 = version2;
@@ -137,6 +137,11 @@ class VTIResultSet extends NoPutResultSe
 		this.scanIsolationLevel = scanIsolationLevel;
 		this.isDerbyStyleTableFunction = isDerbyStyleTableFunction;
 
+        ExecPreparedStatement ps = activation.getPreparedStatement();
+
+        this.allocatedRow = ((ExecRowBuilder) ps.getSavedObject(row))
+                .build(activation.getExecutionFactory());
+
         this.returnType = returnTypeNumber == -1 ? null :
             (TypeDescriptor)
             activation.getPreparedStatement().getSavedObject(returnTypeNumber);
@@ -592,11 +597,6 @@ class VTIResultSet extends NoPutResultSe
 	private ExecRow getAllocatedRow()
 		throws StandardException
 	{
-		if (allocatedRow == null)
-		{
-			allocatedRow = (ExecRow) row.invoke(activation);
-		}
-
 		return allocatedRow;
 	}
 

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/WindowResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/WindowResultSet.java?rev=1420579&r1=1420578&r2=1420579&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/WindowResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/WindowResultSet.java Wed Dec 12 09:14:44 2012
@@ -32,6 +32,8 @@ import org.apache.derby.iapi.types.DataV
 import org.apache.derby.iapi.reference.SQLState;
 import org.apache.derby.iapi.error.StandardException;
 import org.apache.derby.iapi.services.io.FormatableBitSet;
+import org.apache.derby.iapi.sql.execute.ExecPreparedStatement;
+import org.apache.derby.iapi.sql.execute.ExecRowBuilder;
 
 /**
  * WindowResultSet
@@ -46,8 +48,6 @@ import org.apache.derby.iapi.services.io
 class WindowResultSet extends NoPutResultSetImpl
 {
     private GeneratedMethod restriction = null;
-    private GeneratedMethod row;
-
 
     /**
      * Source result set,
@@ -56,7 +56,7 @@ class WindowResultSet extends NoPutResul
 
 
     /**
-     * Cumulative time needed to evalute any restriction on this result set.
+     * Cumulative time needed to evaluate any restriction on this result set.
      */
     public long restrictionTime;
 
@@ -81,12 +81,13 @@ class WindowResultSet extends NoPutResul
 
     WindowResultSet(Activation activation,
         NoPutResultSet         source,
-        GeneratedMethod        rowAllocator,
+        int                    rowAllocator,
         int                    resultSetNumber,
         int                    erdNumber,
         GeneratedMethod        restriction,
         double                 optimizerEstimatedRowCount,
         double                 optimizerEstimatedCost)
+      throws StandardException
     {
 
         super(activation,
@@ -103,14 +104,16 @@ class WindowResultSet extends NoPutResul
 
         this.restriction = restriction;
         this.source = source;
-        this.row = rowAllocator;
-        this.allocatedRow = null;
         this.rownumber = 0;
 
+        ExecPreparedStatement ps = activation.getPreparedStatement();
+
+        this.allocatedRow = ((ExecRowBuilder) ps.getSavedObject(rowAllocator))
+                .build(activation.getExecutionFactory());
+
         if (erdNumber != -1) {
             this.referencedColumns =
-                (FormatableBitSet)(activation.getPreparedStatement().
-                                   getSavedObject(erdNumber));
+                (FormatableBitSet) ps.getSavedObject(erdNumber);
         }
 
         recordConstructorTime();
@@ -316,13 +319,7 @@ class WindowResultSet extends NoPutResul
      *
      * @exception StandardException thrown on failure.
      */
-    private ExecRow getAllocatedRow()
-        throws StandardException {
-
-        if (allocatedRow == null) {
-            allocatedRow = (ExecRow) row.invoke(activation);
-        }
-
+    private ExecRow getAllocatedRow() throws StandardException {
         return allocatedRow;
     }
 }