Adding JMCR-Stable version
[Benchmarks_CSolver.git] / JMCR-Stable / real-world application / MyDerby-10.3 / java / engine / org / apache / derby / impl / sql / execute / RealResultSetStatisticsFactory.java
diff --git a/JMCR-Stable/real-world application/MyDerby-10.3/java/engine/org/apache/derby/impl/sql/execute/RealResultSetStatisticsFactory.java b/JMCR-Stable/real-world application/MyDerby-10.3/java/engine/org/apache/derby/impl/sql/execute/RealResultSetStatisticsFactory.java
new file mode 100644 (file)
index 0000000..8a07a6c
--- /dev/null
@@ -0,0 +1,1329 @@
+/*\r
+\r
+   Derby - Class org.apache.derby.impl.sql.execute.RealResultSetStatisticsFactory\r
+\r
+   Licensed to the Apache Software Foundation (ASF) under one or more\r
+   contributor license agreements.  See the NOTICE file distributed with\r
+   this work for additional information regarding copyright ownership.\r
+   The ASF licenses this file to you under the Apache License, Version 2.0\r
+   (the "License"); you may not use this file except in compliance with\r
+   the License.  You may obtain a copy of the License at\r
+\r
+      http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+   Unless required by applicable law or agreed to in writing, software\r
+   distributed under the License is distributed on an "AS IS" BASIS,\r
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+   See the License for the specific language governing permissions and\r
+   limitations under the License.\r
+\r
+ */\r
+\r
+package org.apache.derby.impl.sql.execute;\r
+\r
+import org.apache.derby.iapi.services.sanity.SanityManager;\r
+\r
+import org.apache.derby.iapi.services.io.FormatIdUtil;\r
+\r
+import org.apache.derby.iapi.error.StandardException;\r
+import org.apache.derby.iapi.services.i18n.MessageService;\r
+\r
+import org.apache.derby.iapi.sql.Activation;\r
+import org.apache.derby.iapi.sql.ResultSet;\r
+import org.apache.derby.iapi.sql.PreparedStatement;\r
+\r
+import org.apache.derby.iapi.sql.execute.NoPutResultSet;\r
+import org.apache.derby.iapi.sql.execute.ResultSetFactory;\r
+import org.apache.derby.iapi.sql.execute.ResultSetStatisticsFactory;\r
+\r
+import org.apache.derby.iapi.store.access.TransactionController;\r
+\r
+import org.apache.derby.impl.sql.execute.AnyResultSet;\r
+import org.apache.derby.impl.sql.execute.CurrentOfResultSet;\r
+import org.apache.derby.impl.sql.execute.DeleteResultSet;\r
+import org.apache.derby.impl.sql.execute.DeleteCascadeResultSet;\r
+import org.apache.derby.impl.sql.execute.DeleteVTIResultSet;\r
+import org.apache.derby.impl.sql.execute.DistinctScalarAggregateResultSet;\r
+import org.apache.derby.impl.sql.execute.DistinctScanResultSet;\r
+import org.apache.derby.impl.sql.execute.GroupedAggregateResultSet;\r
+import org.apache.derby.impl.sql.execute.HashJoinResultSet;\r
+import org.apache.derby.impl.sql.execute.HashLeftOuterJoinResultSet;\r
+import org.apache.derby.impl.sql.execute.HashScanResultSet;\r
+import org.apache.derby.impl.sql.execute.HashTableResultSet;\r
+import org.apache.derby.impl.sql.execute.IndexRowToBaseRowResultSet;\r
+import org.apache.derby.impl.sql.execute.InsertResultSet;\r
+import org.apache.derby.impl.sql.execute.InsertVTIResultSet;\r
+import org.apache.derby.impl.sql.execute.LastIndexKeyResultSet;\r
+import org.apache.derby.impl.sql.execute.MaterializedResultSet;\r
+import org.apache.derby.impl.sql.execute.NestedLoopJoinResultSet;\r
+import org.apache.derby.impl.sql.execute.NestedLoopLeftOuterJoinResultSet;\r
+import org.apache.derby.impl.sql.execute.NormalizeResultSet;\r
+import org.apache.derby.impl.sql.execute.OnceResultSet;\r
+import org.apache.derby.impl.sql.execute.ProjectRestrictResultSet;\r
+import org.apache.derby.impl.sql.execute.RowResultSet;\r
+import org.apache.derby.impl.sql.execute.ScalarAggregateResultSet;\r
+import org.apache.derby.impl.sql.execute.ScrollInsensitiveResultSet;\r
+import org.apache.derby.impl.sql.execute.SetOpResultSet;\r
+import org.apache.derby.impl.sql.execute.SortResultSet;\r
+import org.apache.derby.impl.sql.execute.TableScanResultSet;\r
+import org.apache.derby.impl.sql.execute.UnionResultSet;\r
+import org.apache.derby.impl.sql.execute.UpdateResultSet;\r
+import org.apache.derby.impl.sql.execute.VTIResultSet;\r
+import org.apache.derby.impl.sql.execute.DependentResultSet;\r
+\r
+import org.apache.derby.iapi.sql.execute.RunTimeStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealAnyResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealCurrentOfStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealDeleteResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealDeleteCascadeResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealDeleteVTIResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealDistinctScalarAggregateStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealDistinctScanStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealGroupedAggregateStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealHashJoinStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealHashLeftOuterJoinStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealHashScanStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealHashTableStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealIndexRowToBaseRowStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealInsertResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealInsertVTIResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealJoinResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealLastIndexKeyScanStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealMaterializedResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealNestedLoopJoinStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealNestedLoopLeftOuterJoinStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealNormalizeResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealOnceResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealProjectRestrictStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealRowResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealScalarAggregateStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealScrollInsensitiveResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealSetOpResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealSortStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealTableScanStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealUnionResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealUpdateResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealVTIStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.ResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RunTimeStatisticsImpl;\r
+\r
+import org.apache.derby.iapi.reference.SQLState;\r
+\r
+import java.util.Properties;\r
+\r
+/**\r
+ * ResultSetStatisticsFactory provides a wrapper around all of\r
+ * objects associated with run time statistics.\r
+ * <p>\r
+ * This implementation of the protocol is for returning the "real"\r
+ * run time statistics.  We have modularized this so that we could\r
+ * have an implementation that just returns null for each of the\r
+ * objects should we decided to provide a configuration without\r
+ * the run time statistics feature.\r
+ *\r
+ */\r
+public class RealResultSetStatisticsFactory \r
+               implements ResultSetStatisticsFactory\r
+{\r
+\r
+       //\r
+       // ExecutionFactory interface\r
+       //\r
+       //\r
+       // ResultSetStatisticsFactory interface\r
+       //\r
+\r
+       /**\r
+               @see ResultSetStatisticsFactory#getRunTimeStatistics\r
+        */\r
+       public RunTimeStatistics getRunTimeStatistics(\r
+                       Activation activation, \r
+                       ResultSet rs,\r
+                       NoPutResultSet[] subqueryTrackingArray)\r
+               throws StandardException\r
+       {\r
+               PreparedStatement preStmt = activation.getPreparedStatement();\r
+\r
+               // If the prepared statement is null then the result set is being\r
+               // finished as a result of a activation being closed during a recompile.\r
+               // In this case statistics should not be generated.\r
+               if (preStmt == null)\r
+                       return null;\r
+\r
+\r
+\r
+\r
+               ResultSetStatistics topResultSetStatistics;\r
+\r
+               if (rs instanceof NoPutResultSet)\r
+               {\r
+                       topResultSetStatistics =\r
+                                                                       getResultSetStatistics((NoPutResultSet) rs);\r
+               }\r
+               else\r
+               {\r
+                       topResultSetStatistics = getResultSetStatistics(rs);\r
+               }\r
+\r
+               /* Build up the info on the materialized subqueries */\r
+               int subqueryTrackingArrayLength =\r
+                               (subqueryTrackingArray == null) ? 0 :\r
+                                       subqueryTrackingArray.length;\r
+               ResultSetStatistics[] subqueryRSS =\r
+                               new ResultSetStatistics[subqueryTrackingArrayLength];\r
+               boolean anyAttached = false;\r
+               for (int index = 0; index < subqueryTrackingArrayLength; index++)\r
+               {\r
+                       if (subqueryTrackingArray[index] != null &&\r
+                               subqueryTrackingArray[index].getPointOfAttachment() == -1)\r
+                       {\r
+                               subqueryRSS[index] =\r
+                                               getResultSetStatistics(subqueryTrackingArray[index]);\r
+                               anyAttached = true;\r
+                       }\r
+               }\r
+               if (anyAttached == false)\r
+               {\r
+                       subqueryRSS = null;\r
+               }\r
+\r
+               // Get the info on all of the materialized subqueries (attachment point = -1)\r
+               return new RunTimeStatisticsImpl(\r
+                                                               preStmt.getSPSName(),\r
+                                                               activation.getCursorName(),\r
+                                                               preStmt.getSource(),\r
+                                                               preStmt.getCompileTimeInMillis(),\r
+                                                               preStmt.getParseTimeInMillis(),\r
+                                                               preStmt.getBindTimeInMillis(),\r
+                                                               preStmt.getOptimizeTimeInMillis(),\r
+                                                               preStmt.getGenerateTimeInMillis(),\r
+                                                               rs.getExecuteTime(),\r
+                                                               preStmt.getBeginCompileTimestamp(),\r
+                                                               preStmt.getEndCompileTimestamp(),\r
+                                                               rs.getBeginExecutionTimestamp(),\r
+                                                               rs.getEndExecutionTimestamp(),\r
+                                                               subqueryRSS,\r
+                                                               topResultSetStatistics);\r
+       }\r
+\r
+       /**\r
+               @see ResultSetStatisticsFactory#getResultSetStatistics\r
+        */\r
+       public ResultSetStatistics getResultSetStatistics(ResultSet rs)\r
+       {\r
+               if (!rs.returnsRows())\r
+               {\r
+                       return getNoRowsResultSetStatistics(rs);\r
+               }\r
+               else if (rs instanceof NoPutResultSet)\r
+               {\r
+                       return getResultSetStatistics((NoPutResultSet) rs);\r
+               }\r
+               else\r
+               {\r
+                       return null;\r
+               }\r
+       }\r
+\r
+       public ResultSetStatistics getNoRowsResultSetStatistics(ResultSet rs)\r
+       {\r
+               ResultSetStatistics retval = null;\r
+\r
+               /* We need to differentiate based on instanceof in order\r
+                * to find the right constructor to call.  This is ugly,\r
+                * but if we don't do instanceof then rs is always seen as an\r
+                * interface instead of a class when we try to overload \r
+                * a method with both.\r
+                */\r
+               if( rs instanceof InsertResultSet)\r
+               {\r
+                       InsertResultSet irs = (InsertResultSet) rs;\r
+\r
+                       retval = new RealInsertResultSetStatistics(\r
+                                                                       irs.rowCount,\r
+                                                                       irs.constants.deferred,\r
+                                                                       irs.constants.irgs.length,\r
+                                                                       irs.userSpecifiedBulkInsert,\r
+                                                                       irs.bulkInsertPerformed,\r
+                                                                       irs.constants.lockMode ==\r
+                                                                               TransactionController.MODE_TABLE,\r
+                                                                       irs.getExecuteTime(), \r
+                                                                       getResultSetStatistics(irs.savedSource)\r
+                                                                       );\r
+\r
+                       irs.savedSource = null;\r
+               }\r
+               else if( rs instanceof InsertVTIResultSet)\r
+               {\r
+                       InsertVTIResultSet iVTIrs = (InsertVTIResultSet) rs;\r
+\r
+                       retval = new RealInsertVTIResultSetStatistics(\r
+                                                                       iVTIrs.rowCount,\r
+                                                                       iVTIrs.constants.deferred,\r
+                                                                       iVTIrs.getExecuteTime(), \r
+                                                                       getResultSetStatistics(iVTIrs.savedSource)\r
+                                                                       );\r
+\r
+                       iVTIrs.savedSource = null;\r
+               }\r
+               else if( rs instanceof UpdateResultSet)\r
+               {\r
+                       UpdateResultSet urs = (UpdateResultSet) rs;\r
+\r
+                       retval = new RealUpdateResultSetStatistics(\r
+                                                                       urs.rowCount,\r
+                                                                       urs.constants.deferred,\r
+                                                                       urs.constants.irgs.length,\r
+                                                                       urs.constants.lockMode ==\r
+                                                                               TransactionController.MODE_TABLE,\r
+                                                                       urs.getExecuteTime(),\r
+                                                                       getResultSetStatistics(urs.savedSource)\r
+                                                                       );\r
+\r
+                       urs.savedSource = null;\r
+               }\r
+               else if( rs instanceof DeleteCascadeResultSet)\r
+               {\r
+                       DeleteCascadeResultSet dcrs = (DeleteCascadeResultSet) rs;\r
+                       int dependentTrackingArrayLength =\r
+                               (dcrs.dependentResultSets == null) ? 0 :\r
+                                       dcrs.dependentResultSets.length;\r
+                       ResultSetStatistics[] dependentTrackingArray =\r
+                               new ResultSetStatistics[dependentTrackingArrayLength];\r
+                       boolean anyAttached = false;\r
+                       for (int index = 0; index < dependentTrackingArrayLength; index++)\r
+                       {\r
+                               if (dcrs.dependentResultSets[index] != null)\r
+                               {\r
+                                       dependentTrackingArray[index] =\r
+                                                                               getResultSetStatistics(\r
+                                                                                       dcrs.dependentResultSets[index]);\r
+                                       anyAttached = true;\r
+                               }\r
+                       }\r
+                       if (! anyAttached)\r
+                       {\r
+                               dependentTrackingArray = null;\r
+                       }\r
+\r
+                       retval = new RealDeleteCascadeResultSetStatistics(\r
+                                                                       dcrs.rowCount,\r
+                                                                       dcrs.constants.deferred,\r
+                                                                       dcrs.constants.irgs.length,\r
+                                                                       dcrs.constants.lockMode ==\r
+                                                                               TransactionController.MODE_TABLE,\r
+                                                                       dcrs.getExecuteTime(),\r
+                                                                       getResultSetStatistics(dcrs.savedSource),\r
+                                                                       dependentTrackingArray\r
+                                                                       );\r
+\r
+                       dcrs.savedSource = null;\r
+               }\r
+               else if( rs instanceof DeleteResultSet)\r
+               {\r
+                       DeleteResultSet drs = (DeleteResultSet) rs;\r
+\r
+                       retval = new RealDeleteResultSetStatistics(\r
+                                                                       drs.rowCount,\r
+                                                                       drs.constants.deferred,\r
+                                                                       drs.constants.irgs.length,\r
+                                                                       drs.constants.lockMode ==\r
+                                                                               TransactionController.MODE_TABLE,\r
+                                                                       drs.getExecuteTime(),\r
+                                                                       getResultSetStatistics(drs.savedSource)\r
+                                                                       );\r
+\r
+                       drs.savedSource = null;\r
+               }\r
+               else if( rs instanceof DeleteVTIResultSet)\r
+               {\r
+                       DeleteVTIResultSet dVTIrs = (DeleteVTIResultSet) rs;\r
+\r
+                       retval = new RealDeleteVTIResultSetStatistics(\r
+                                                                       dVTIrs.rowCount,\r
+                                                                       dVTIrs.getExecuteTime(), \r
+                                                                       getResultSetStatistics(dVTIrs.savedSource)\r
+                                                                       );\r
+\r
+                       dVTIrs.savedSource = null;\r
+               }\r
+\r
+\r
+               return retval;\r
+       }\r
+\r
+       public ResultSetStatistics getResultSetStatistics(NoPutResultSet rs)\r
+       {\r
+               /* We need to differentiate based on instanceof in order\r
+                * to find the right constructor to call.  This is ugly,\r
+                * but if we don't do instanceof then rs is always seen as an\r
+                * interface instead of a class when we try to overload \r
+                * a method with both.\r
+                */\r
+               if( rs instanceof ProjectRestrictResultSet)\r
+               {\r
+                       ProjectRestrictResultSet prrs = (ProjectRestrictResultSet) rs;\r
+                       int subqueryTrackingArrayLength =\r
+                               (prrs.subqueryTrackingArray == null) ? 0 :\r
+                                       prrs.subqueryTrackingArray.length;\r
+                       ResultSetStatistics[] subqueryTrackingArray =\r
+                               new ResultSetStatistics[subqueryTrackingArrayLength];\r
+                       boolean anyAttached = false;\r
+                       for (int index = 0; index < subqueryTrackingArrayLength; index++)\r
+                       {\r
+                               if (prrs.subqueryTrackingArray[index] != null &&\r
+                                       prrs.subqueryTrackingArray[index].getPointOfAttachment() ==\r
+                                               prrs.resultSetNumber)\r
+                               {\r
+                                       subqueryTrackingArray[index] =\r
+                                                                               getResultSetStatistics(\r
+                                                                                       prrs.subqueryTrackingArray[index]);\r
+                                       anyAttached = true;\r
+                               }\r
+                       }\r
+                       if (! anyAttached)\r
+                       {\r
+                               subqueryTrackingArray = null;\r
+                       }\r
+\r
+                       return new RealProjectRestrictStatistics(\r
+                                                                                       prrs.numOpens,\r
+                                                                                       prrs.rowsSeen,\r
+                                                                                       prrs.rowsFiltered,\r
+                                                                                       prrs.constructorTime,\r
+                                                                                       prrs.openTime,\r
+                                                                                       prrs.nextTime,\r
+                                                                                       prrs.closeTime,\r
+                                                                                       prrs.resultSetNumber,\r
+                                                                                       prrs.restrictionTime,\r
+                                                                                       prrs.projectionTime,\r
+                                                                                       subqueryTrackingArray,\r
+                                                                                       (prrs.restriction != null),\r
+                                                                                       prrs.doesProjection,\r
+                                                                                       prrs.optimizerEstimatedRowCount,\r
+                                                                                       prrs.optimizerEstimatedCost,\r
+                                                                                       getResultSetStatistics(prrs.source)\r
+                                                                                       );\r
+               }\r
+               else if (rs instanceof SortResultSet)\r
+               {\r
+                       SortResultSet srs = (SortResultSet) rs;\r
+\r
+                       return new RealSortStatistics(\r
+                                                                                       srs.numOpens,\r
+                                                                                       srs.rowsSeen,\r
+                                                                                       srs.rowsFiltered,\r
+                                                                                       srs.constructorTime,\r
+                                                                                       srs.openTime,\r
+                                                                                       srs.nextTime,\r
+                                                                                       srs.closeTime,\r
+                                                                                       srs.resultSetNumber,\r
+                                                                                       srs.rowsInput,\r
+                                                                                       srs.rowsReturned,\r
+                                                                                       srs.distinct,\r
+                                                                                       srs.isInSortedOrder,\r
+                                                                                       srs.sortProperties,\r
+                                                                                       srs.optimizerEstimatedRowCount,\r
+                                                                                       srs.optimizerEstimatedCost,\r
+                                                                                       getResultSetStatistics(srs.source)\r
+                                                                               );\r
+               }\r
+               else if (rs instanceof DistinctScalarAggregateResultSet)\r
+               {\r
+                       DistinctScalarAggregateResultSet dsars = (DistinctScalarAggregateResultSet) rs;\r
+\r
+                       return new RealDistinctScalarAggregateStatistics(\r
+                                                                                       dsars.numOpens,\r
+                                                                                       dsars.rowsSeen,\r
+                                                                                       dsars.rowsFiltered,\r
+                                                                                       dsars.constructorTime,\r
+                                                                                       dsars.openTime,\r
+                                                                                       dsars.nextTime,\r
+                                                                                       dsars.closeTime,\r
+                                                                                       dsars.resultSetNumber,\r
+                                                                                       dsars.rowsInput,\r
+                                                                                       dsars.optimizerEstimatedRowCount,\r
+                                                                                       dsars.optimizerEstimatedCost,\r
+                                                                                       getResultSetStatistics(dsars.source)\r
+                                                                               );\r
+               }\r
+               else if (rs instanceof ScalarAggregateResultSet)\r
+               {\r
+                       ScalarAggregateResultSet sars = (ScalarAggregateResultSet) rs;\r
+\r
+                       return new RealScalarAggregateStatistics(\r
+                                                                                       sars.numOpens,\r
+                                                                                       sars.rowsSeen,\r
+                                                                                       sars.rowsFiltered,\r
+                                                                                       sars.constructorTime,\r
+                                                                                       sars.openTime,\r
+                                                                                       sars.nextTime,\r
+                                                                                       sars.closeTime,\r
+                                                                                       sars.resultSetNumber,\r
+                                                                                       sars.singleInputRow,\r
+                                                                                       sars.rowsInput,\r
+                                                                                       sars.optimizerEstimatedRowCount,\r
+                                                                                       sars.optimizerEstimatedCost,\r
+                                                                                       getResultSetStatistics(sars.source)\r
+                                                                               );\r
+               }\r
+               else if (rs instanceof GroupedAggregateResultSet)\r
+               {\r
+                       GroupedAggregateResultSet gars = (GroupedAggregateResultSet) rs;\r
+\r
+                       return new RealGroupedAggregateStatistics(\r
+                                                                                       gars.numOpens,\r
+                                                                                       gars.rowsSeen,\r
+                                                                                       gars.rowsFiltered,\r
+                                                                                       gars.constructorTime,\r
+                                                                                       gars.openTime,\r
+                                                                                       gars.nextTime,\r
+                                                                                       gars.closeTime,\r
+                                                                                       gars.resultSetNumber,\r
+                                                                                       gars.rowsInput,\r
+                                                                                       gars.hasDistinctAggregate,\r
+                                                                                       gars.isInSortedOrder,\r
+                                                                                       gars.sortProperties,\r
+                                                                                       gars.optimizerEstimatedRowCount,\r
+                                                                                       gars.optimizerEstimatedCost,\r
+                                                                                       getResultSetStatistics(gars.source)\r
+                                                                               );\r
+               }\r
+               else if (rs instanceof TableScanResultSet)\r
+               {\r
+                       boolean instantaneousLocks = false;\r
+                       TableScanResultSet tsrs = (TableScanResultSet) rs;\r
+                       String startPosition = null;\r
+                       String stopPosition = null;\r
+                       String isolationLevel =  null;\r
+                       String lockString = null;\r
+                       String lockRequestString = null;\r
+\r
+                       switch (tsrs.isolationLevel)\r
+                       {\r
+                               case TransactionController.ISOLATION_SERIALIZABLE:\r
+                                       isolationLevel = \r
+                        MessageService.getTextMessage(\r
+                            SQLState.LANG_SERIALIZABLE);\r
+                                       break;\r
+\r
+                               case TransactionController.ISOLATION_REPEATABLE_READ:\r
+                                       isolationLevel = \r
+                        MessageService.getTextMessage(\r
+                            SQLState.LANG_REPEATABLE_READ);\r
+                                       break;\r
+\r
+                               case TransactionController.ISOLATION_READ_COMMITTED_NOHOLDLOCK:\r
+                                       instantaneousLocks = true;\r
+                                       //fall through\r
+                               case TransactionController.ISOLATION_READ_COMMITTED:\r
+                                       isolationLevel = MessageService.getTextMessage(\r
+                                                                                               SQLState.LANG_READ_COMMITTED);\r
+                                       break;\r
+\r
+                               case TransactionController.ISOLATION_READ_UNCOMMITTED:\r
+                                       isolationLevel = \r
+                        MessageService.getTextMessage(\r
+                            SQLState.LANG_READ_UNCOMMITTED);\r
+                                       break;\r
+                       }\r
+\r
+                       if (tsrs.forUpdate)\r
+                       {\r
+                               lockString = MessageService.getTextMessage(\r
+                                                                                               SQLState.LANG_EXCLUSIVE);\r
+                       }\r
+                       else\r
+                       {\r
+                               if (instantaneousLocks)\r
+                               {\r
+                                       lockString = MessageService.getTextMessage(\r
+                                                                                       SQLState.LANG_INSTANTANEOUS_SHARE);\r
+                               }\r
+                               else\r
+                               {\r
+                                       lockString = MessageService.getTextMessage(\r
+                                                                                                               SQLState.LANG_SHARE);\r
+                               }\r
+                       }\r
+\r
+                       switch (tsrs.lockMode)\r
+                       {\r
+                               case TransactionController.MODE_TABLE:\r
+                                       // RESOLVE: Not sure this will really work, as we\r
+                                       // are tacking together English words to make a phrase.\r
+                                       // Will this work in other languages?\r
+                                       lockRequestString = lockString + " " +\r
+                                                                               MessageService.getTextMessage(\r
+                                                                                       SQLState.LANG_TABLE);\r
+                                       break;\r
+\r
+                               case TransactionController.MODE_RECORD:\r
+                                       // RESOLVE: Not sure this will really work, as we\r
+                                       // are tacking together English words to make a phrase.\r
+                                       // Will this work in other languages?\r
+                                       lockRequestString = lockString + " " +\r
+                                                                               MessageService.getTextMessage(\r
+                                                                                       SQLState.LANG_ROW);\r
+                                       break;\r
+                       }\r
+\r
+                       if (tsrs.indexName != null)\r
+                       {\r
+                               /* Start and stop position strings will be non-null\r
+                               * if the TSRS has been closed.  Otherwise, we go off\r
+                               * and build the strings now.\r
+                               */\r
+                               startPosition = tsrs.startPositionString;\r
+                               if (startPosition == null)\r
+                               {\r
+                                       startPosition = tsrs.printStartPosition();\r
+                               }\r
+                               stopPosition = tsrs.stopPositionString;\r
+                               if (stopPosition == null)\r
+                               {\r
+                                       stopPosition = tsrs.printStopPosition();\r
+                               }\r
+                       }\r
+\r
+                       return new \r
+                RealTableScanStatistics(\r
+                    tsrs.numOpens,\r
+                    tsrs.rowsSeen,\r
+                    tsrs.rowsFiltered,\r
+                    tsrs.constructorTime,\r
+                    tsrs.openTime,\r
+                    tsrs.nextTime,\r
+                    tsrs.closeTime,\r
+                    tsrs.resultSetNumber,\r
+                    tsrs.tableName,\r
+                                       tsrs.userSuppliedOptimizerOverrides,\r
+                    tsrs.indexName,\r
+                    tsrs.isConstraint,\r
+                    tsrs.printQualifiers(tsrs.qualifiers),\r
+                    tsrs.getScanProperties(),\r
+                    startPosition,\r
+                    stopPosition,\r
+                    isolationLevel,\r
+                    lockRequestString,\r
+                    tsrs.rowsPerRead,\r
+                    tsrs.coarserLock,\r
+                    tsrs.optimizerEstimatedRowCount,\r
+                    tsrs.optimizerEstimatedCost);\r
+               }\r
+\r
+               else if (rs instanceof LastIndexKeyResultSet )\r
+               {\r
+                       LastIndexKeyResultSet lrs = (LastIndexKeyResultSet) rs;\r
+                       String isolationLevel =  null;\r
+                       String lockRequestString = null;\r
+\r
+                       switch (lrs.isolationLevel)\r
+                       {\r
+                               case TransactionController.ISOLATION_SERIALIZABLE:\r
+                                       isolationLevel = \r
+                        MessageService.getTextMessage(\r
+                            SQLState.LANG_SERIALIZABLE);\r
+                                       break;\r
+\r
+                               case TransactionController.ISOLATION_REPEATABLE_READ:\r
+                                       isolationLevel = \r
+                        MessageService.getTextMessage(\r
+                            SQLState.LANG_REPEATABLE_READ);\r
+                                       break;\r
+\r
+                               case TransactionController.ISOLATION_READ_COMMITTED_NOHOLDLOCK:\r
+                               case TransactionController.ISOLATION_READ_COMMITTED:\r
+                                       isolationLevel = MessageService.getTextMessage(\r
+                                                                                               SQLState.LANG_READ_COMMITTED);\r
+                                       break;\r
+\r
+                               case TransactionController.ISOLATION_READ_UNCOMMITTED:\r
+                                       isolationLevel = MessageService.getTextMessage(\r
+                                                                                               SQLState.LANG_READ_UNCOMMITTED);\r
+                    break;\r
+                       }\r
+\r
+                       switch (lrs.lockMode)\r
+                       {\r
+                               case TransactionController.MODE_TABLE:\r
+                                       lockRequestString = MessageService.getTextMessage(\r
+                                                                                                       SQLState.LANG_SHARE_TABLE);\r
+                                       break;\r
+\r
+                               case TransactionController.MODE_RECORD:\r
+                                       lockRequestString = MessageService.getTextMessage(\r
+                                                                                                       SQLState.LANG_SHARE_ROW);\r
+                                       break;\r
+                       }\r
+\r
+                       return new RealLastIndexKeyScanStatistics(\r
+                                                                                       lrs.numOpens,\r
+                                                                                       lrs.constructorTime,\r
+                                                                                       lrs.openTime,\r
+                                                                                       lrs.nextTime,\r
+                                                                                       lrs.closeTime,\r
+                                                                                       lrs.resultSetNumber,\r
+                                                                                       lrs.tableName,\r
+                                                                                       lrs.indexName,\r
+                                                                                       isolationLevel,\r
+                                                                                       lockRequestString,\r
+                                                                                       lrs.optimizerEstimatedRowCount,\r
+                                                                                       lrs.optimizerEstimatedCost);\r
+               }\r
+               else if (rs instanceof HashLeftOuterJoinResultSet)\r
+               {\r
+                       HashLeftOuterJoinResultSet hlojrs =\r
+                               (HashLeftOuterJoinResultSet) rs;\r
+\r
+                       return new RealHashLeftOuterJoinStatistics(\r
+                                                                                       hlojrs.numOpens,\r
+                                                                                       hlojrs.rowsSeen,\r
+                                                                                       hlojrs.rowsFiltered,\r
+                                                                                       hlojrs.constructorTime,\r
+                                                                                       hlojrs.openTime,\r
+                                                                                       hlojrs.nextTime,\r
+                                                                                       hlojrs.closeTime,\r
+                                                                                       hlojrs.resultSetNumber,\r
+                                                                                       hlojrs.rowsSeenLeft,\r
+                                                                                       hlojrs.rowsSeenRight,\r
+                                                                                       hlojrs.rowsReturned,\r
+                                                                                       hlojrs.restrictionTime,\r
+                                                                                       hlojrs.optimizerEstimatedRowCount,\r
+                                                                                       hlojrs.optimizerEstimatedCost,\r
+                                                                                       hlojrs.userSuppliedOptimizerOverrides,\r
+                                                                                       getResultSetStatistics(\r
+                                                                                               hlojrs.leftResultSet),\r
+                                                                                       getResultSetStatistics(\r
+                                                                                               hlojrs.rightResultSet),\r
+                                                                                       hlojrs.emptyRightRowsReturned);\r
+               }\r
+               else if (rs instanceof NestedLoopLeftOuterJoinResultSet)\r
+               {\r
+                       NestedLoopLeftOuterJoinResultSet nllojrs =\r
+                               (NestedLoopLeftOuterJoinResultSet) rs;\r
+\r
+                       return new RealNestedLoopLeftOuterJoinStatistics(\r
+                                                                                       nllojrs.numOpens,\r
+                                                                                       nllojrs.rowsSeen,\r
+                                                                                       nllojrs.rowsFiltered,\r
+                                                                                       nllojrs.constructorTime,\r
+                                                                                       nllojrs.openTime,\r
+                                                                                       nllojrs.nextTime,\r
+                                                                                       nllojrs.closeTime,\r
+                                                                                       nllojrs.resultSetNumber,\r
+                                                                                       nllojrs.rowsSeenLeft,\r
+                                                                                       nllojrs.rowsSeenRight,\r
+                                                                                       nllojrs.rowsReturned,\r
+                                                                                       nllojrs.restrictionTime,\r
+                                                                                       nllojrs.optimizerEstimatedRowCount,\r
+                                                                                       nllojrs.optimizerEstimatedCost,\r
+                                                                                       nllojrs.userSuppliedOptimizerOverrides,\r
+                                                                                       getResultSetStatistics(\r
+                                                                                               nllojrs.leftResultSet),\r
+                                                                                       getResultSetStatistics(\r
+                                                                                               nllojrs.rightResultSet),\r
+                                                                                       nllojrs.emptyRightRowsReturned);\r
+               }\r
+               else if (rs instanceof HashJoinResultSet)\r
+               {\r
+                       HashJoinResultSet hjrs = (HashJoinResultSet) rs;\r
+\r
+                       return new RealHashJoinStatistics(\r
+                                                                                       hjrs.numOpens,\r
+                                                                                       hjrs.rowsSeen,\r
+                                                                                       hjrs.rowsFiltered,\r
+                                                                                       hjrs.constructorTime,\r
+                                                                                       hjrs.openTime,\r
+                                                                                       hjrs.nextTime,\r
+                                                                                       hjrs.closeTime,\r
+                                                                                       hjrs.resultSetNumber,\r
+                                                                                       hjrs.rowsSeenLeft,\r
+                                                                                       hjrs.rowsSeenRight,\r
+                                                                                       hjrs.rowsReturned,\r
+                                                                                       hjrs.restrictionTime,\r
+                                                                                       hjrs.oneRowRightSide,\r
+                                                                                       hjrs.optimizerEstimatedRowCount,\r
+                                                                                       hjrs.optimizerEstimatedCost,\r
+                                                                                       hjrs.userSuppliedOptimizerOverrides,\r
+                                                                                       getResultSetStatistics(\r
+                                                                                               hjrs.leftResultSet),\r
+                                                                                       getResultSetStatistics(\r
+                                                                                               hjrs.rightResultSet)\r
+                                                                                       );\r
+               }\r
+               else if (rs instanceof NestedLoopJoinResultSet)\r
+               {\r
+                       NestedLoopJoinResultSet nljrs = (NestedLoopJoinResultSet) rs;\r
+\r
+                       return new RealNestedLoopJoinStatistics(\r
+                                                                                       nljrs.numOpens,\r
+                                                                                       nljrs.rowsSeen,\r
+                                                                                       nljrs.rowsFiltered,\r
+                                                                                       nljrs.constructorTime,\r
+                                                                                       nljrs.openTime,\r
+                                                                                       nljrs.nextTime,\r
+                                                                                       nljrs.closeTime,\r
+                                                                                       nljrs.resultSetNumber,\r
+                                                                                       nljrs.rowsSeenLeft,\r
+                                                                                       nljrs.rowsSeenRight,\r
+                                                                                       nljrs.rowsReturned,\r
+                                                                                       nljrs.restrictionTime,\r
+                                                                                       nljrs.oneRowRightSide,\r
+                                                                                       nljrs.optimizerEstimatedRowCount,\r
+                                                                                       nljrs.optimizerEstimatedCost,\r
+                                                                                       nljrs.userSuppliedOptimizerOverrides,\r
+                                                                                       getResultSetStatistics(\r
+                                                                                               nljrs.leftResultSet),\r
+                                                                                       getResultSetStatistics(\r
+                                                                                               nljrs.rightResultSet)\r
+                                                                                       );\r
+               }\r
+               else if (rs instanceof IndexRowToBaseRowResultSet)\r
+               {\r
+                       IndexRowToBaseRowResultSet irtbrrs =\r
+                                                                                       (IndexRowToBaseRowResultSet) rs;\r
+\r
+                       return new RealIndexRowToBaseRowStatistics(\r
+                                                                                       irtbrrs.numOpens,\r
+                                                                                       irtbrrs.rowsSeen,\r
+                                                                                       irtbrrs.rowsFiltered,\r
+                                                                                       irtbrrs.constructorTime,\r
+                                                                                       irtbrrs.openTime,\r
+                                                                                       irtbrrs.nextTime,\r
+                                                                                       irtbrrs.closeTime,\r
+                                                                                       irtbrrs.resultSetNumber,\r
+                                                                                       irtbrrs.indexName,\r
+                                                                                       irtbrrs.accessedHeapCols,\r
+                                                                                       irtbrrs.optimizerEstimatedRowCount,\r
+                                                                                       irtbrrs.optimizerEstimatedCost,\r
+                                                                                       getResultSetStatistics(\r
+                                                                                                                               irtbrrs.source)\r
+                                                                                       );\r
+               }\r
+               else if (rs instanceof RowResultSet)\r
+               {\r
+                       RowResultSet rrs = (RowResultSet) rs;\r
+\r
+                       return new RealRowResultSetStatistics(\r
+                                                                                       rrs.numOpens,\r
+                                                                                       rrs.rowsSeen,\r
+                                                                                       rrs.rowsFiltered,\r
+                                                                                       rrs.constructorTime,\r
+                                                                                       rrs.openTime,\r
+                                                                                       rrs.nextTime,\r
+                                                                                       rrs.closeTime,\r
+                                                                                       rrs.resultSetNumber,\r
+                                                                                       rrs.rowsReturned,\r
+                                                                                       rrs.optimizerEstimatedRowCount,\r
+                                                                                       rrs.optimizerEstimatedCost);\r
+               }\r
+               else if (rs instanceof SetOpResultSet)\r
+               {\r
+                       SetOpResultSet srs = (SetOpResultSet) rs;\r
+\r
+                       return new RealSetOpResultSetStatistics(\r
+                                                                                       srs.getOpType(),\r
+                                                                                       srs.numOpens,\r
+                                                                                       srs.rowsSeen,\r
+                                                                                       srs.rowsFiltered,\r
+                                                                                       srs.constructorTime,\r
+                                                                                       srs.openTime,\r
+                                                                                       srs.nextTime,\r
+                                                                                       srs.closeTime,\r
+                                                                                       srs.getResultSetNumber(),\r
+                                                                                       srs.getRowsSeenLeft(),\r
+                                                                                       srs.getRowsSeenRight(),\r
+                                                                                       srs.getRowsReturned(),\r
+                                                                                       srs.optimizerEstimatedRowCount,\r
+                                                                                       srs.optimizerEstimatedCost,\r
+                                                                                       getResultSetStatistics(srs.getLeftSourceInput()),\r
+                                                                                       getResultSetStatistics(srs.getRightSourceInput())\r
+                                                                                       );\r
+               }\r
+               else if (rs instanceof UnionResultSet)\r
+               {\r
+                       UnionResultSet urs = (UnionResultSet)rs;\r
+\r
+                       return new RealUnionResultSetStatistics(\r
+                                                                                       urs.numOpens,\r
+                                                                                       urs.rowsSeen,\r
+                                                                                       urs.rowsFiltered,\r
+                                                                                       urs.constructorTime,\r
+                                                                                       urs.openTime,\r
+                                                                                       urs.nextTime,\r
+                                                                                       urs.closeTime,\r
+                                                                                       urs.resultSetNumber,\r
+                                                                                       urs.rowsSeenLeft,\r
+                                                                                       urs.rowsSeenRight,\r
+                                                                                       urs.rowsReturned,\r
+                                                                                       urs.optimizerEstimatedRowCount,\r
+                                                                                       urs.optimizerEstimatedCost,\r
+                                                                                       getResultSetStatistics(urs.source1),\r
+                                                                                       getResultSetStatistics(urs.source2)\r
+                                                                                       );\r
+               }\r
+               else if (rs instanceof AnyResultSet)\r
+               {\r
+                       AnyResultSet ars = (AnyResultSet) rs;\r
+\r
+                       return new RealAnyResultSetStatistics(\r
+                                                                                       ars.numOpens,\r
+                                                                                       ars.rowsSeen,\r
+                                                                                       ars.rowsFiltered,\r
+                                                                                       ars.constructorTime,\r
+                                                                                       ars.openTime,\r
+                                                                                       ars.nextTime,\r
+                                                                                       ars.closeTime,\r
+                                                                                       ars.resultSetNumber,\r
+                                                                                       ars.subqueryNumber,\r
+                                                                                       ars.pointOfAttachment,\r
+                                                                                       ars.optimizerEstimatedRowCount,\r
+                                                                                       ars.optimizerEstimatedCost,\r
+                                                                                       getResultSetStatistics(ars.source)\r
+                                                                                       );\r
+               }\r
+               else if (rs instanceof OnceResultSet)\r
+               {\r
+                       OnceResultSet ors = (OnceResultSet) rs;\r
+\r
+                       return new RealOnceResultSetStatistics(\r
+                                                                                       ors.numOpens,\r
+                                                                                       ors.rowsSeen,\r
+                                                                                       ors.rowsFiltered,\r
+                                                                                       ors.constructorTime,\r
+                                                                                       ors.openTime,\r
+                                                                                       ors.nextTime,\r
+                                                                                       ors.closeTime,\r
+                                                                                       ors.resultSetNumber,\r
+                                                                                       ors.subqueryNumber,\r
+                                                                                       ors.pointOfAttachment,\r
+                                                                                       ors.optimizerEstimatedRowCount,\r
+                                                                                       ors.optimizerEstimatedCost,\r
+                                                                                       getResultSetStatistics(ors.source)\r
+                                                                                       );\r
+               }\r
+               else if (rs instanceof NormalizeResultSet)\r
+               {\r
+                       NormalizeResultSet nrs = (NormalizeResultSet) rs;\r
+\r
+                       return new RealNormalizeResultSetStatistics(\r
+                                                                                       nrs.numOpens,\r
+                                                                                       nrs.rowsSeen,\r
+                                                                                       nrs.rowsFiltered,\r
+                                                                                       nrs.constructorTime,\r
+                                                                                       nrs.openTime,\r
+                                                                                       nrs.nextTime,\r
+                                                                                       nrs.closeTime,\r
+                                                                                       nrs.resultSetNumber,\r
+                                                                                       nrs.optimizerEstimatedRowCount,\r
+                                                                                       nrs.optimizerEstimatedCost,\r
+                                                                                       getResultSetStatistics(nrs.source)\r
+                                                                                       );\r
+               }\r
+               else if (rs instanceof MaterializedResultSet)\r
+               {\r
+                       MaterializedResultSet mrs = (MaterializedResultSet) rs;\r
+\r
+                       return new RealMaterializedResultSetStatistics(\r
+                                                                                       mrs.numOpens,\r
+                                                                                       mrs.rowsSeen,\r
+                                                                                       mrs.rowsFiltered,\r
+                                                                                       mrs.constructorTime,\r
+                                                                                       mrs.openTime,\r
+                                                                                       mrs.nextTime,\r
+                                                                                       mrs.closeTime,\r
+                                                                                       mrs.createTCTime,\r
+                                                                                       mrs.fetchTCTime,\r
+                                                                                       mrs.resultSetNumber,\r
+                                                                                       mrs.optimizerEstimatedRowCount,\r
+                                                                                       mrs.optimizerEstimatedCost,\r
+                                                                                       getResultSetStatistics(mrs.source)\r
+                                                                                       );\r
+               }\r
+               else if (rs instanceof ScrollInsensitiveResultSet)\r
+               {\r
+                       ScrollInsensitiveResultSet sirs = (ScrollInsensitiveResultSet) rs;\r
+\r
+                       return new RealScrollInsensitiveResultSetStatistics(\r
+                                                                                       sirs.numOpens,\r
+                                                                                       sirs.rowsSeen,\r
+                                                                                       sirs.rowsFiltered,\r
+                                                                                       sirs.constructorTime,\r
+                                                                                       sirs.openTime,\r
+                                                                                       sirs.nextTime,\r
+                                                                                       sirs.closeTime,\r
+                                                                                       sirs.numFromHashTable,\r
+                                                                                       sirs.numToHashTable,\r
+                                                                                       sirs.resultSetNumber,\r
+                                                                                       sirs.optimizerEstimatedRowCount,\r
+                                                                                       sirs.optimizerEstimatedCost,\r
+                                                                                       getResultSetStatistics(sirs.source)\r
+                                                                                       );\r
+               }\r
+               else if (rs instanceof CurrentOfResultSet)\r
+               {\r
+                       CurrentOfResultSet cors = (CurrentOfResultSet) rs;\r
+\r
+                       return new RealCurrentOfStatistics(\r
+                                                                                       cors.numOpens,\r
+                                                                                       cors.rowsSeen,\r
+                                                                                       cors.rowsFiltered,\r
+                                                                                       cors.constructorTime,\r
+                                                                                       cors.openTime,\r
+                                                                                       cors.nextTime,\r
+                                                                                       cors.closeTime,\r
+                                                                                       cors.resultSetNumber\r
+                                                                                       );\r
+               }\r
+               else if (rs instanceof HashScanResultSet)\r
+               {\r
+                       boolean instantaneousLocks = false;\r
+                       HashScanResultSet hsrs = (HashScanResultSet) rs;\r
+                       String startPosition = null;\r
+                       String stopPosition = null;\r
+                       String isolationLevel =  null;\r
+                       String lockString = null;\r
+\r
+                       switch (hsrs.isolationLevel)\r
+                       {\r
+                               case TransactionController.ISOLATION_SERIALIZABLE:\r
+                                       isolationLevel = \r
+                        MessageService.getTextMessage(\r
+                            SQLState.LANG_SERIALIZABLE);\r
+                                       break;\r
+\r
+                               case TransactionController.ISOLATION_REPEATABLE_READ:\r
+                                       isolationLevel = \r
+                        MessageService.getTextMessage(\r
+                            SQLState.LANG_REPEATABLE_READ);\r
+                                       break;\r
+\r
+                               case TransactionController.ISOLATION_READ_COMMITTED_NOHOLDLOCK:\r
+                                       instantaneousLocks = true;\r
+                                       //fall through\r
+                               case TransactionController.ISOLATION_READ_COMMITTED:\r
+                                       isolationLevel = MessageService.getTextMessage(\r
+                                                                                               SQLState.LANG_READ_COMMITTED);\r
+                                       break;\r
+\r
+                       }\r
+\r
+                       if (hsrs.forUpdate)\r
+                       {\r
+                               lockString = MessageService.getTextMessage(\r
+                                                                                                       SQLState.LANG_EXCLUSIVE);\r
+                       }\r
+                       else\r
+                       {\r
+                               if (instantaneousLocks)\r
+                               {\r
+                                       lockString = MessageService.getTextMessage(\r
+                                                                                       SQLState.LANG_INSTANTANEOUS_SHARE);\r
+                               }\r
+                               else\r
+                               {\r
+                                       lockString = MessageService.getTextMessage(\r
+                                                                                                               SQLState.LANG_SHARE);\r
+                               }\r
+                       }\r
+\r
+                       switch (hsrs.lockMode)\r
+                       {\r
+                               case TransactionController.MODE_TABLE:\r
+                                       // RESOLVE: Not sure this will really work, as we\r
+                                       // are tacking together English words to make a phrase.\r
+                                       // Will this work in other languages?\r
+                                       lockString = lockString + " " +\r
+                                                                       MessageService.getTextMessage(\r
+                                                                                                               SQLState.LANG_TABLE);\r
+                                       break;\r
+\r
+                               case TransactionController.MODE_RECORD:\r
+                                       // RESOLVE: Not sure this will really work, as we\r
+                                       // are tacking together English words to make a phrase.\r
+                                       // Will this work in other languages?\r
+                                       lockString = lockString + " " +\r
+                                                                       MessageService.getTextMessage(\r
+                                                                                                                       SQLState.LANG_ROW);\r
+                                       break;\r
+                       }\r
+\r
+                       if (hsrs.indexName != null)\r
+                       {\r
+                               /* Start and stop position strings will be non-null\r
+                               * if the HSRS has been closed.  Otherwise, we go off\r
+                               * and build the strings now.\r
+                               */\r
+                               startPosition = hsrs.startPositionString;\r
+                               if (startPosition == null)\r
+                               {\r
+                                       startPosition = hsrs.printStartPosition();\r
+                               }\r
+                               stopPosition = hsrs.stopPositionString;\r
+                               if (stopPosition == null)\r
+                               {\r
+                                       stopPosition = hsrs.printStopPosition();\r
+                               }\r
+                       }\r
+\r
+                       // DistinctScanResultSet is simple sub-class of\r
+                       // HashScanResultSet\r
+                       if (rs instanceof DistinctScanResultSet)\r
+                       {\r
+                               return new RealDistinctScanStatistics(\r
+                                                                                       hsrs.numOpens,\r
+                                                                                       hsrs.rowsSeen,\r
+                                                                                       hsrs.rowsFiltered,\r
+                                                                                       hsrs.constructorTime,\r
+                                                                                       hsrs.openTime,\r
+                                                                                       hsrs.nextTime,\r
+                                                                                       hsrs.closeTime,\r
+                                                                                       hsrs.resultSetNumber,\r
+                                                                                       hsrs.tableName,\r
+                                                                                       hsrs.indexName,\r
+                                                                                       hsrs.isConstraint,\r
+                                                                                       hsrs.hashtableSize,\r
+                                                                                       hsrs.keyColumns,\r
+                                                                                       hsrs.printQualifiers(\r
+                                                                                               hsrs.scanQualifiers),\r
+                                                                                       hsrs.printQualifiers(\r
+                                                                                               hsrs.nextQualifiers),\r
+                                                                                       hsrs.getScanProperties(),\r
+                                                                                       startPosition,\r
+                                                                                       stopPosition,\r
+                                                                                       isolationLevel,\r
+                                                                                       lockString,\r
+                                                                                       hsrs.optimizerEstimatedRowCount,\r
+                                                                                       hsrs.optimizerEstimatedCost\r
+                                                                                       );\r
+                       }\r
+                       else\r
+                       {\r
+                               return new RealHashScanStatistics(\r
+                                                                                       hsrs.numOpens,\r
+                                                                                       hsrs.rowsSeen,\r
+                                                                                       hsrs.rowsFiltered,\r
+                                                                                       hsrs.constructorTime,\r
+                                                                                       hsrs.openTime,\r
+                                                                                       hsrs.nextTime,\r
+                                                                                       hsrs.closeTime,\r
+                                                                                       hsrs.resultSetNumber,\r
+                                                                                       hsrs.tableName,\r
+                                                                                       hsrs.indexName,\r
+                                                                                       hsrs.isConstraint,\r
+                                                                                       hsrs.hashtableSize,\r
+                                                                                       hsrs.keyColumns,\r
+                                                                                       hsrs.printQualifiers(\r
+                                                                                               hsrs.scanQualifiers),\r
+                                                                                       hsrs.printQualifiers(\r
+                                                                                               hsrs.nextQualifiers),\r
+                                                                                       hsrs.getScanProperties(),\r
+                                                                                       startPosition,\r
+                                                                                       stopPosition,\r
+                                                                                       isolationLevel,\r
+                                                                                       lockString,\r
+                                                                                       hsrs.optimizerEstimatedRowCount,\r
+                                                                                       hsrs.optimizerEstimatedCost\r
+                                                                                       );\r
+                       }\r
+               }\r
+               else if (rs instanceof HashTableResultSet)\r
+               {\r
+                       HashTableResultSet htrs = (HashTableResultSet) rs;\r
+                       int subqueryTrackingArrayLength =\r
+                               (htrs.subqueryTrackingArray == null) ? 0 :\r
+                                       htrs.subqueryTrackingArray.length;\r
+                       ResultSetStatistics[] subqueryTrackingArray =\r
+                               new ResultSetStatistics[subqueryTrackingArrayLength];\r
+                       boolean anyAttached = false;\r
+                       for (int index = 0; index < subqueryTrackingArrayLength; index++)\r
+                       {\r
+                               if (htrs.subqueryTrackingArray[index] != null &&\r
+                                       htrs.subqueryTrackingArray[index].getPointOfAttachment() ==\r
+                                               htrs.resultSetNumber)\r
+                               {\r
+                                       subqueryTrackingArray[index] =\r
+                                                                               getResultSetStatistics(\r
+                                                                                       htrs.subqueryTrackingArray[index]);\r
+                                       anyAttached = true;\r
+                               }\r
+                       }\r
+                       if (! anyAttached)\r
+                       {\r
+                               subqueryTrackingArray = null;\r
+                       }\r
+\r
+                       return new \r
+                RealHashTableStatistics(\r
+                    htrs.numOpens,\r
+                    htrs.rowsSeen,\r
+                    htrs.rowsFiltered,\r
+                    htrs.constructorTime,\r
+                    htrs.openTime,\r
+                    htrs.nextTime,\r
+                    htrs.closeTime,\r
+                    htrs.resultSetNumber,\r
+                    htrs.hashtableSize,\r
+                    htrs.keyColumns,\r
+                    HashScanResultSet.printQualifiers(\r
+                        htrs.nextQualifiers),\r
+                    htrs.scanProperties,\r
+                    htrs.optimizerEstimatedRowCount,\r
+                    htrs.optimizerEstimatedCost,\r
+                    subqueryTrackingArray,\r
+                    getResultSetStatistics(htrs.source)\r
+                    );\r
+               }\r
+               else if (rs instanceof VTIResultSet)\r
+               {\r
+                       VTIResultSet vtirs = (VTIResultSet) rs;\r
+\r
+                       return new RealVTIStatistics(\r
+                                                                               vtirs.numOpens,\r
+                                                                               vtirs.rowsSeen,\r
+                                                                               vtirs.rowsFiltered,\r
+                                                                               vtirs.constructorTime,\r
+                                                                               vtirs.openTime,\r
+                                                                               vtirs.nextTime,\r
+                                                                               vtirs.closeTime,\r
+                                                                               vtirs.resultSetNumber,\r
+                                                                               vtirs.javaClassName,\r
+                                                                               vtirs.optimizerEstimatedRowCount,\r
+                                                                               vtirs.optimizerEstimatedCost\r
+                                                                               );\r
+               }\r
+\r
+               else if (rs instanceof DependentResultSet)\r
+               {\r
+                       boolean instantaneousLocks = false;\r
+                       DependentResultSet dsrs = (DependentResultSet) rs;\r
+                       String startPosition = null;\r
+                       String stopPosition = null;\r
+                       String isolationLevel =  null;\r
+                       String lockString = null;\r
+                       String lockRequestString = null;\r
+\r
+                       switch (dsrs.isolationLevel)\r
+                       {\r
+                               case TransactionController.ISOLATION_SERIALIZABLE:\r
+                                       isolationLevel = \r
+                        MessageService.getTextMessage(\r
+                            SQLState.LANG_SERIALIZABLE);\r
+                                       break;\r
+\r
+                               case TransactionController.ISOLATION_REPEATABLE_READ:\r
+                                       isolationLevel = \r
+                        MessageService.getTextMessage(\r
+                            SQLState.LANG_REPEATABLE_READ);\r
+                                       break;\r
+\r
+                               case TransactionController.ISOLATION_READ_COMMITTED_NOHOLDLOCK:\r
+                                       instantaneousLocks = true;\r
+                                       //fall through\r
+                               case TransactionController.ISOLATION_READ_COMMITTED:\r
+                                       isolationLevel = MessageService.getTextMessage(\r
+                                                                                               SQLState.LANG_READ_COMMITTED);\r
+                                       break;\r
+\r
+                               case TransactionController.ISOLATION_READ_UNCOMMITTED:\r
+                                       isolationLevel = \r
+                        MessageService.getTextMessage(\r
+                            SQLState.LANG_READ_UNCOMMITTED);\r
+                                       break;\r
+                       }\r
+\r
+                       if (dsrs.forUpdate)\r
+                       {\r
+                               lockString = MessageService.getTextMessage(\r
+                                                                                               SQLState.LANG_EXCLUSIVE);\r
+                       }\r
+                       else\r
+                       {\r
+                               if (instantaneousLocks)\r
+                               {\r
+                                       lockString = MessageService.getTextMessage(\r
+                                                                                       SQLState.LANG_INSTANTANEOUS_SHARE);\r
+                               }\r
+                               else\r
+                               {\r
+                                       lockString = MessageService.getTextMessage(\r
+                                                                                                               SQLState.LANG_SHARE);\r
+                               }\r
+                       }\r
+\r
+                       switch (dsrs.lockMode)\r
+                       {\r
+                               case TransactionController.MODE_TABLE:\r
+                                       // RESOLVE: Not sure this will really work, as we\r
+                                       // are tacking together English words to make a phrase.\r
+                                       // Will this work in other languages?\r
+                                       lockRequestString = lockString + " " +\r
+                                                                               MessageService.getTextMessage(\r
+                                                                                       SQLState.LANG_TABLE);\r
+                                       break;\r
+\r
+                               case TransactionController.MODE_RECORD:\r
+                                       // RESOLVE: Not sure this will really work, as we\r
+                                       // are tacking together English words to make a phrase.\r
+                                       // Will this work in other languages?\r
+                                       lockRequestString = lockString + " " +\r
+                                                                               MessageService.getTextMessage(\r
+                                                                                       SQLState.LANG_ROW);\r
+                                       break;\r
+                       }\r
+\r
+                       /* Start and stop position strings will be non-null\r
+                        * if the dSRS has been closed.  Otherwise, we go off\r
+                        * and build the strings now.\r
+                        */\r
+                       startPosition = dsrs.startPositionString;\r
+                       if (startPosition == null)\r
+                       {\r
+                               startPosition = dsrs.printStartPosition();\r
+                       }\r
+                       stopPosition = dsrs.stopPositionString;\r
+                       if (stopPosition == null)\r
+                       {\r
+                               stopPosition = dsrs.printStopPosition();\r
+                       }\r
+               \r
+                       return new \r
+                RealTableScanStatistics(\r
+                    dsrs.numOpens,\r
+                    dsrs.rowsSeen,\r
+                    dsrs.rowsFiltered,\r
+                    dsrs.constructorTime,\r
+                    dsrs.openTime,\r
+                    dsrs.nextTime,\r
+                    dsrs.closeTime,\r
+                    dsrs.resultSetNumber,\r
+                    dsrs.tableName,\r
+                                       null,\r
+                    dsrs.indexName,\r
+                    dsrs.isConstraint,\r
+                    dsrs.printQualifiers(),\r
+                    dsrs.getScanProperties(),\r
+                    startPosition,\r
+                    stopPosition,\r
+                    isolationLevel,\r
+                    lockRequestString,\r
+                    dsrs.rowsPerRead,\r
+                    dsrs.coarserLock,\r
+                    dsrs.optimizerEstimatedRowCount,\r
+                    dsrs.optimizerEstimatedCost);\r
+               }\r
+               else\r
+               {\r
+                       return null;\r
+               }\r
+       }\r
+\r
+       //\r
+       // class interface\r
+       //\r
+       public RealResultSetStatisticsFactory() \r
+       {\r
+       }\r
+\r
+}\r