You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by rh...@apache.org on 2013/08/09 15:22:40 UTC

svn commit: r1512294 - in /db/derby/code/trunk/java: engine/org/apache/derby/impl/sql/compile/ResultSetNode.java engine/org/apache/derby/impl/sql/compile/SelectNode.java testing/org/apache/derbyTesting/functionTests/tests/lang/XMLOptimizerTraceTest.java

Author: rhillegas
Date: Fri Aug  9 13:22:40 2013
New Revision: 1512294

URL: http://svn.apache.org/r1512294
Log:
DERBY-6211: Mark the end of join optimization with a call to traceEndQueryBlock(); commit derby-6211-13-aa-SelectNode_optimizer.diff.

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultSetNode.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/SelectNode.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/XMLOptimizerTraceTest.java

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultSetNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultSetNode.java?rev=1512294&r1=1512293&r2=1512294&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultSetNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultSetNode.java Fri Aug  9 13:22:40 2013
@@ -1475,39 +1475,6 @@ public abstract class ResultSetNode exte
 	}
 
 	/**
-	 * Get an optimizer to use for this ResultSetNode.  Only get it once -
-	 * subsequent calls return the same optimizer.
-	 *
-	 * @exception StandardException		Thrown on error
-	 */
-	protected Optimizer getOptimizer(
-							OptimizableList optList,
-							OptimizablePredicateList predList,
-							DataDictionary dataDictionary,
-							RequiredRowOrdering requiredRowOrdering,
-							OptimizerPlan overridingPlan)
-			throws StandardException
-	{
-		if (optimizer == null)
-		{
-			/* Get an optimizer. */
-			OptimizerFactory optimizerFactory = getLanguageConnectionContext().getOptimizerFactory();
-
-			optimizer = optimizerFactory.getOptimizer(
-											optList,
-											predList,
-											dataDictionary,
-											requiredRowOrdering,
-											getCompilerContext().getNumTables(),
-											overridingPlan,
-								getLanguageConnectionContext());
-		}
-
-		optimizer.prepForNextRound();
-		return optimizer;
-	}
-
-	/**
 	 * Get the optimizer for this result set.
 	 * 
 	 * @return If this.optimizer has has already been created by the

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/SelectNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/SelectNode.java?rev=1512294&r1=1512293&r2=1512294&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/SelectNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/SelectNode.java Fri Aug  9 13:22:40 2013
@@ -32,8 +32,12 @@ import org.apache.derby.iapi.services.co
 import org.apache.derby.iapi.services.sanity.SanityManager;
 import org.apache.derby.iapi.sql.compile.CompilerContext;
 import org.apache.derby.iapi.sql.compile.CostEstimate;
+import org.apache.derby.iapi.sql.compile.OptimizableList;
+import org.apache.derby.iapi.sql.compile.OptimizablePredicateList;
 import org.apache.derby.iapi.sql.compile.Optimizer;
+import org.apache.derby.iapi.sql.compile.OptimizerFactory;
 import org.apache.derby.iapi.sql.compile.OptimizerPlan;
+import org.apache.derby.iapi.sql.compile.RequiredRowOrdering;
 import org.apache.derby.iapi.sql.compile.Visitor;
 import org.apache.derby.iapi.sql.conn.Authorizer;
 import org.apache.derby.iapi.sql.dictionary.DataDictionary;
@@ -2041,7 +2045,43 @@ class SelectNode extends ResultSetNode
 			havingSubquerys.optimize(dataDictionary, costEstimate.rowCount());
 		}
 
-		return this;
+        // dispose of the optimizer we created above
+        if ( optimizerTracingIsOn() ) { getOptimizerTracer().traceEndQueryBlock(); }
+
+        return this;
+	}
+
+	/**
+	 * Get an optimizer to use for this SelectNode.  Only get it once -
+	 * subsequent calls return the same optimizer.
+	 *
+	 * @exception StandardException		Thrown on error
+	 */
+	private Optimizer getOptimizer(
+							OptimizableList optList,
+							OptimizablePredicateList predList,
+							DataDictionary dataDictionary,
+							RequiredRowOrdering requiredRowOrdering,
+							OptimizerPlan overridingPlan)
+			throws StandardException
+	{
+		if (optimizer == null)
+		{
+			/* Get an optimizer. */
+			OptimizerFactory optimizerFactory = getLanguageConnectionContext().getOptimizerFactory();
+
+			optimizer = optimizerFactory.getOptimizer(
+											optList,
+											predList,
+											dataDictionary,
+											requiredRowOrdering,
+											getCompilerContext().getNumTables(),
+											overridingPlan,
+								getLanguageConnectionContext());
+		}
+
+		optimizer.prepForNextRound();
+		return optimizer;
 	}
 
 	/**

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/XMLOptimizerTraceTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/XMLOptimizerTraceTest.java?rev=1512294&r1=1512293&r2=1512294&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/XMLOptimizerTraceTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/XMLOptimizerTraceTest.java Fri Aug  9 13:22:40 2013
@@ -188,6 +188,33 @@ public class XMLOptimizerTraceTest  exte
                  "create index r_a on r( a )"
                  );
         }
+        
+        if ( !tableExists( conn, "T1" ) )
+        {
+            goodStatement
+                (
+                 conn,
+                 "create table t1( c1 int, c2 int, c3 int )"
+                 );
+        }
+        
+        if ( !tableExists( conn, "T2" ) )
+        {
+            goodStatement
+                (
+                 conn,
+                 "create table t2( c1 int, c2 int, c3 int )"
+                 );
+        }
+        
+        if ( !tableExists( conn, "T3" ) )
+        {
+            goodStatement
+                (
+                 conn,
+                 "create table t3( c1 int, c2 int, c3 int )"
+                 );
+        }
     }
     
     ///////////////////////////////////////////////////////////////////////////////////
@@ -293,6 +320,9 @@ public class XMLOptimizerTraceTest  exte
              conn,
              "call syscs_util.syscs_register_tool( 'optimizerTracingViews', false )"
              );
+
+        // use planCost to examine an outer join
+        vetOuterJoin( conn );
     }
 
     /**
@@ -542,6 +572,72 @@ public class XMLOptimizerTraceTest  exte
         goodStatement( conn, "drop type ArrayList restrict" );
     }
 
+
+    /**
+     * <p>
+     * Test xml optimizer tracing of outer joins.
+     * </p>
+     */
+    private void vetOuterJoin( Connection conn ) throws Exception
+    {
+        File    traceFile = SupportFilesSetup.getReadWrite( TRACE_FILE_NAME );
+
+        // turn on xml-based optimizer tracing
+        goodStatement
+            (
+             conn,
+             "call syscs_util.syscs_register_tool( 'optimizerTracing', true, 'xml' )"
+             );
+
+        // run an outer join
+        goodStatement
+            (
+             conn,
+             "select * from t3, (t1 left outer join t2 on t1.c1 = t2.c1) where t3.c1 = t1.c1"
+             );
+
+        // turn off optimizer tracing
+        goodStatement
+            (
+             conn,
+             "call syscs_util.syscs_register_tool( 'optimizerTracing', false, '" + traceFile.getPath() + "' )"
+             );
+
+        // load the trace viewer
+        goodStatement
+            (
+             conn,
+             "call syscs_util.syscs_register_tool( 'optimizerTracingViews', true, '" + traceFile.getPath() + "' )"
+             );
+
+        // verify the plan shapes which were considered
+        PreparedStatement   ps = chattyPrepare
+            (
+             conn,
+             "select distinct summary from planCost\n" +
+             "where complete and qbID = 1\n" +
+             "order by summary\n"
+             );
+        ResultSet   rs = ps.executeQuery();
+        rs.next();
+        String  summary1 = rs.getString( 1 ).trim();
+        rs.next();
+        String  summary2 = rs.getString( 1 ).trim();
+        assertTrue( summary1.startsWith( "( \"APP\"." ) );
+        assertTrue( summary1.endsWith( " * ProjectRestrictNode )" ) );
+        assertTrue( summary2.startsWith( "( ProjectRestrictNode # \"APP\"." ) );
+        rs.close();
+        ps.close();
+
+        // unload the trace viewer
+        goodStatement
+            (
+             conn,
+             "call syscs_util.syscs_register_tool( 'optimizerTracingViews', false )"
+             );
+
+    }
+    
    ///////////////////////////////////////////////////////////////////////////////////
     //
     // MINIONS