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/05/03 21:16:44 UTC
svn commit: r1478932 - in /db/derby/code/trunk/java:
engine/org/apache/derby/iapi/db/ engine/org/apache/derby/iapi/sql/compile/
engine/org/apache/derby/iapi/sql/conn/ engine/org/apache/derby/impl/sql/
engine/org/apache/derby/impl/sql/compile/ engine/or...
Author: rhillegas
Date: Fri May 3 19:16:33 2013
New Revision: 1478932
URL: http://svn.apache.org/r1478932
Log:
DERBY-6211: Cleanup optimizer trace support.
Modified:
db/derby/code/trunk/java/engine/org/apache/derby/iapi/db/OptimizerTrace.java
db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/compile/OptTrace.java
db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/conn/LanguageConnectionContext.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/GenericStatement.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/DefaultOptTrace.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/Level2OptimizerImpl.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/OptimizerImpl.java
db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/conn/GenericLanguageConnectionContext.java
db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/optional/OptimizerTracer.java
Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/db/OptimizerTrace.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/db/OptimizerTrace.java?rev=1478932&r1=1478931&r2=1478932&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/db/OptimizerTrace.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/db/OptimizerTrace.java Fri May 3 19:16:33 2013
@@ -21,11 +21,16 @@
package org.apache.derby.iapi.db;
+import java.io.PrintWriter;
+import java.io.StringWriter;
import java.sql.SQLException;
+import org.apache.derby.iapi.sql.compile.OptTrace;
import org.apache.derby.iapi.sql.conn.LanguageConnectionContext;
import org.apache.derby.iapi.sql.conn.ConnectionUtil;
+import org.apache.derby.impl.sql.compile.DefaultOptTrace;
+
/**
<P>
This class provides static methods for controlling the
@@ -35,68 +40,47 @@ import org.apache.derby.iapi.sql.conn.Co
public class OptimizerTrace
{
/**
- * Control whether or not optimizer trace is on.
- *
- * @param onOrOff Whether to turn optimizer trace on (true) or off (false).
+ * Turn default optimizer tracing on or off.
*
- * @return Whether or not the call was successful. (false will be returned when optimizer tracing is not supported.)
+ * @param onOrOff Whether to turn optimizer tracing on (true) or off (false).
*/
- public static boolean setOptimizerTrace(boolean onOrOff)
+ public static void setOptimizerTrace( boolean onOrOff )
{
- boolean retCode = false;
-
- try
- {
- // Get the current language connection context. This is associated
- // with the current database.
- LanguageConnectionContext lcc = ConnectionUtil.getCurrentLCC();
- retCode = lcc.setOptimizerTrace(onOrOff);
- }
- catch (Throwable t)
- {
- // eat all exceptions, simply return false
- }
+ OptTrace optimizerTracer = onOrOff ? new DefaultOptTrace() : null;
- return retCode;
+ setOptimizerTracer( optimizerTracer );
}
- /**
- * Null out the optimizer trace.
- */
- public static void nullifyTrace() throws SQLException
- {
- ConnectionUtil.getCurrentLCC().setOptimizerTraceOutput( null );
- }
-
/**
- * Control whether or not optimizer trace is generated in html.
- *
- * @param onOrOff Whether or not optimizer trace will be in html (true) or not (false).
+ * Install an optimizer tracer (to enable tracing) or uninstall the current optimizer tracer
+ * (to disable tracing).
*
- * @return Whether or not the call was successful. (false will be returned when optimizer tracing is not supported.)
+ * @param tracer Null if tracing is being turned off, otherwise an optimizer tracer
*/
- public static boolean setOptimizerTraceHtml(boolean onOrOff)
+ public static void setOptimizerTracer( OptTrace tracer )
{
- boolean retCode = false;
-
try
{
- // Get the current language connection context. This is associated
- // with the current database.
- LanguageConnectionContext lcc = ConnectionUtil.getCurrentLCC();
- retCode = lcc.setOptimizerTraceHtml(onOrOff);
+ ConnectionUtil.getCurrentLCC().setOptimizerTracer( tracer );
}
- catch (Throwable t)
+ catch (Throwable t) {}
+ }
+
+ /**
+ * Get the current optimizer tracer, if any.
+ */
+ public static OptTrace getOptimizerTracer()
+ {
+ try
{
- // eat all exceptions, simply return false
+ return ConnectionUtil.getCurrentLCC().getOptimizerTracer();
}
-
- return retCode;
+ catch (Throwable t) { return null; }
}
+
/**
- * Get the optimizer trace output for the last optimized query as a String. If optimizer trace
- * html is on, then the String will contain the html tags.
+ * Get the optimizer trace output for the last optimized query as a String.
*
* @return The optimizer trace output for the last optimized query as a String.
* Null will be returned if optimizer trace output is off or not supported
@@ -111,39 +95,23 @@ public class OptimizerTrace
// Get the current language connection context. This is associated
// with the current database.
LanguageConnectionContext lcc = ConnectionUtil.getCurrentLCC();
- retCode = lcc.getOptimizerTraceOutput();
- }
- catch (Throwable t)
- {
- // eat all exceptions, simply return null
- }
+ OptTrace tracer = lcc.getOptimizerTracer();
- return retCode;
- }
+ if ( tracer != null )
+ {
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter( sw );
+
+ tracer.printToWriter( pw );
+ pw.flush();
+ sw.flush();
- /**
- * Send the optimizer trace output for the last optimized query to a file with a .html extension.
- * If optimizer trace html is on, then the output will contain the html tags.
- *
- * @param fileName The name of the file to write to. (.html extension will be added.)
- *
- * @return Whether or not the request was successful.
- * false mayl be returned for a number of reasons, including if optimizer trace output is off or not supported
- * or no trace output was found or an exception occurred.
- */
- public static boolean writeOptimizerTraceOutputHtml(String fileName)
- {
- boolean retCode = true;
-
- try
- {
- String output = getOptimizerTraceOutput();
- //RESOLVEOPTIMIZERTRACE - need to write out the html
+ retCode = sw.toString();
+ }
}
catch (Throwable t)
{
- // eat all exceptions, simply return false
- retCode = false;
+ // eat all exceptions, simply return null
}
return retCode;
Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/compile/OptTrace.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/compile/OptTrace.java?rev=1478932&r1=1478931&r2=1478932&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/compile/OptTrace.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/compile/OptTrace.java Fri May 3 19:16:33 2013
@@ -21,6 +21,8 @@
package org.apache.derby.iapi.sql.compile;
+import java.io.PrintWriter;
+
import org.apache.derby.iapi.sql.dictionary.ConglomerateDescriptor;
import org.apache.derby.iapi.util.JBitSet;
@@ -41,8 +43,11 @@ public interface OptTrace
//
////////////////////////////////////////////////////////////////////////
+ /** Start the start of tracing a statement. */
+ public void traceStartStatement( String statementText );
+
/** Start optimizer tracing. */
- public void traceStart( long timeOptimizationStarted );
+ public void traceStart( long timeOptimizationStarted, int optimizerID );
/** Say that the optimizer ran out of time. */
public void traceTimeout( long currentTime, CostEstimate bestCost );
@@ -60,7 +65,7 @@ public interface OptTrace
public void traceNoBestPlan();
/** Say that we're modifying access paths. */
- public void traceModifyingAccessPaths();
+ public void traceModifyingAccessPaths( int optimizerID );
/** Say that we short-circuited a join order. */
public void traceShortCircuiting( boolean timeExceeded, Optimizable thisOpt, int joinPosition );
@@ -209,4 +214,7 @@ public interface OptTrace
/** Report the cost based on index statistics. */
public void traceCostIncludingStatsForIndex( CostEstimate cost, int tableNumber );
+ /** Print the trace so far. */
+ public void printToWriter( PrintWriter out );
+
}
Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/conn/LanguageConnectionContext.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/conn/LanguageConnectionContext.java?rev=1478932&r1=1478931&r2=1478932&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/conn/LanguageConnectionContext.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/conn/LanguageConnectionContext.java Fri May 3 19:16:33 2013
@@ -23,6 +23,7 @@ package org.apache.derby.iapi.sql.conn;
import org.apache.derby.iapi.services.context.Context;
import org.apache.derby.iapi.services.io.FormatableBitSet;
+import org.apache.derby.iapi.sql.compile.OptTrace;
import org.apache.derby.iapi.db.Database;
import org.apache.derby.iapi.error.StandardException;
import org.apache.derby.iapi.sql.compile.CompilerContext;
@@ -911,57 +912,24 @@ public interface LanguageConnectionConte
throws StandardException;
/**
- * Control whether or not optimizer trace is on.
+ * Install an optimizer tracer (to enable tracing) or uninstall the current optimizer tracer
+ * (to disable tracing).
*
- * @param onOrOff Whether to turn optimizer trace on (true) or off (false).
- *
- * @return Whether or not the call was successful. (false will be returned when optimizer tracing is not supported.)
+ * @param tracer Null if tracing is being turned off, otherwise an optimizer tracer
*/
- public boolean setOptimizerTrace(boolean onOrOff);
-
- /**
- * Get whether or not optimizer trace is on.
- *
- * @return Whether or not optimizer trace is on.
- */
- public boolean getOptimizerTrace();
+ public void setOptimizerTracer( OptTrace tracer );
/**
- * Control whether or not optimizer trace is generated in html.
- *
- * @param onOrOff Whether or not optimizer trace will be in html (true) or not (false).
- *
- * @return Whether or not the call was successful. (false will be returned when optimizer tracing is not supported.)
+ * Get the optimizer tracer (could be null if we aren't tracing the optimizer).
*/
- public boolean setOptimizerTraceHtml(boolean onOrOff);
+ public OptTrace getOptimizerTracer();
/**
- * Get whether or not optimizer trace html is on.
- *
- * @return Whether or not optimizer trace html is on.
- */
- public boolean getOptimizerTraceHtml();
-
- /**
- * Get the optimizer trace output for the last optimized query as a String. If optimizer trace
- * html is on, then the String will contain the html tags.
+ * Get whether or not optimizer trace is on.
*
- * @return The optimizer trace output for the last optimized query as a String.
- * Null will be returned if optimizer trace output is off or not supported
- * or no trace output was found or an exception occurred.
- */
- public String getOptimizerTraceOutput();
-
- /**
- * Set the optimizer trace output to the specified String.
- * (Done at the beginning of each statement.)
- */
- public void setOptimizerTraceOutput(String startingText);
-
- /**
- * Append the latest output to the optimizer trace output.
+ * @return Whether or not optimizer trace is on.
*/
- public void appendOptimizerTraceOutput(String output);
+ public boolean optimizerTracingIsOn();
/**
* Reports whether there is any outstanding work in the transaction.
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/GenericStatement.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/GenericStatement.java?rev=1478932&r1=1478931&r2=1478932&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/GenericStatement.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/GenericStatement.java Fri May 3 19:16:33 2013
@@ -188,9 +188,11 @@ public class GenericStatement
return preparedStmt;
}
- // Clear the optimizer trace from the last statement
- if (lcc.getOptimizerTrace())
- lcc.setOptimizerTraceOutput(getSource() + "\n");
+ // Start a new optimizer trace for this statement
+ if (lcc.optimizerTracingIsOn())
+ {
+ lcc.getOptimizerTracer().traceStartStatement( getSource() );
+ }
beginTime = getCurrentTimeMillis(lcc);
/* beginTimestamp only meaningful if beginTime is meaningful.
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/DefaultOptTrace.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/DefaultOptTrace.java?rev=1478932&r1=1478931&r2=1478932&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/DefaultOptTrace.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/DefaultOptTrace.java Fri May 3 19:16:33 2013
@@ -21,8 +21,9 @@
package org.apache.derby.impl.sql.compile;
+import java.io.PrintWriter;
+
import org.apache.derby.iapi.services.sanity.SanityManager;
-import org.apache.derby.iapi.sql.conn.LanguageConnectionContext;
import org.apache.derby.iapi.sql.compile.AccessPath;
import org.apache.derby.iapi.sql.compile.CostEstimate;
import org.apache.derby.iapi.sql.compile.JoinStrategy;
@@ -52,8 +53,7 @@ public class DefaultOptTrace implemen
//
////////////////////////////////////////////////////////////////////////
- private LanguageConnectionContext _lcc;
- private int _optimizerID;
+ private StringBuffer _buffer;
////////////////////////////////////////////////////////////////////////
//
@@ -62,10 +62,9 @@ public class DefaultOptTrace implemen
////////////////////////////////////////////////////////////////////////
/** Make a DefaultOptTrace */
- public DefaultOptTrace( LanguageConnectionContext lcc, int optimizerID )
+ public DefaultOptTrace()
{
- _lcc = lcc;
- _optimizerID = optimizerID;
+ _buffer = new StringBuffer();
}
////////////////////////////////////////////////////////////////////////
@@ -74,13 +73,18 @@ public class DefaultOptTrace implemen
//
////////////////////////////////////////////////////////////////////////
- public void traceStart( long timeOptimizationStarted )
+ public void traceStartStatement( String statementText )
+ {
+ appendTraceString( statementText );
+ }
+
+ public void traceStart( long timeOptimizationStarted, int optimizerID )
{
appendTraceString
(
"Optimization started at time " +
timeOptimizationStarted +
- " using optimizer " + _optimizerID
+ " using optimizer " + optimizerID
);
}
@@ -114,9 +118,9 @@ public class DefaultOptTrace implemen
appendTraceString( "No best plan found." );
}
- public void traceModifyingAccessPaths()
+ public void traceModifyingAccessPaths( int optimizerID )
{
- appendTraceString( "Modifying access paths using optimizer " + _optimizerID );
+ appendTraceString( "Modifying access paths using optimizer " + optimizerID );
}
public void traceShortCircuiting( boolean timeExceeded, Optimizable thisOpt, int joinPosition )
@@ -473,6 +477,11 @@ public class DefaultOptTrace implemen
appendTraceString( reportCostIncluding( "statistics for index being considered", cost, tableNumber ) );
}
+ public void printToWriter( PrintWriter out )
+ {
+ out.println( _buffer.toString() );
+ }
+
////////////////////////////////////////////////////////////////////////
//
// REPORTING MINIONS
@@ -552,7 +561,7 @@ public class DefaultOptTrace implemen
/** Append a string to the optimizer trace */
private void appendTraceString( String traceString )
{
- _lcc.appendOptimizerTraceOutput(traceString + "\n");
+ _buffer.append( traceString + "\n" );
}
}
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/Level2OptimizerImpl.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/Level2OptimizerImpl.java?rev=1478932&r1=1478931&r2=1478932&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/Level2OptimizerImpl.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/Level2OptimizerImpl.java Fri May 3 19:16:33 2013
@@ -63,13 +63,10 @@ public class Level2OptimizerImpl extends
joinStrategies, tableLockThreshold, requiredRowOrdering,
numTablesInQuery);
- // Remember whether or not optimizer trace is on;
- optimizerTrace = lcc.getOptimizerTrace();
- optimizerTraceHtml = lcc.getOptimizerTraceHtml();
this.lcc = lcc;
// Optimization started
- if (optimizerTrace) { tracer().traceStart( timeOptimizationStarted ); }
+ if (tracingIsOn()) { tracer().traceStart( timeOptimizationStarted, hashCode() ); }
}
/** @see Optimizer#getLevel */
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/OptimizerImpl.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/OptimizerImpl.java?rev=1478932&r1=1478931&r2=1478932&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/OptimizerImpl.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/OptimizerImpl.java Fri May 3 19:16:33 2013
@@ -135,11 +135,6 @@ public class OptimizerImpl implements Op
private boolean conglomerate_OneRowResultSet;
- // optimizer trace
- protected boolean optimizerTrace;
- protected boolean optimizerTraceHtml;
- private OptTrace _tracer;
-
// max memory use per table
protected int maxMemoryPerTable;
@@ -359,7 +354,7 @@ public class OptimizerImpl implements Op
desiredJoinOrderFound = false;
}
- public boolean tracingIsOn() { return optimizerTrace; }
+ public boolean tracingIsOn() { return lcc.optimizerTracingIsOn(); }
public int getMaxMemoryPerTable()
{
@@ -377,7 +372,7 @@ public class OptimizerImpl implements Op
/* Don't get any permutations if there is nothing to optimize */
if (numOptimizables < 1)
{
- if (optimizerTrace) { tracer().traceVacuous(); }
+ if ( tracingIsOn() ) { tracer().traceVacuous(); }
endOfRoundCleanup();
return false;
@@ -407,7 +402,7 @@ public class OptimizerImpl implements Op
currentTime = System.currentTimeMillis();
timeExceeded = (currentTime - timeOptimizationStarted) > timeLimit;
- if (optimizerTrace && timeExceeded) { tracer().traceTimeout( currentTime, bestCost ); }
+ if (tracingIsOn() && timeExceeded) { tracer().traceTimeout( currentTime, bestCost ); }
}
if (bestCost.isUninitialized() && foundABestPlan &&
@@ -563,7 +558,7 @@ public class OptimizerImpl implements Op
// order.
if (joinPosition < (numOptimizables - 1))
{
- if (optimizerTrace)
+ if (tracingIsOn())
{
tracer().traceShortCircuiting
(
@@ -792,7 +787,7 @@ public class OptimizerImpl implements Op
if ((nextOptimizable < numOptimizables) &&
!joinOrderMeetsDependencies(nextOptimizable))
{
- if (optimizerTrace)
+ if (tracingIsOn())
{
tracer().traceSkippingJoinOrder
( nextOptimizable, joinPosition, ArrayUtil.copy( proposedJoinOrder ), (JBitSet) assignedTableMap.clone() );
@@ -803,7 +798,7 @@ public class OptimizerImpl implements Op
*/
if ( ! optimizableList.optimizeJoinOrder())
{
- if (optimizerTrace) { tracer().traceIllegalUserJoinOrder(); }
+ if (tracingIsOn()) { tracer().traceIllegalUserJoinOrder(); }
throw StandardException.newException(
SQLState.LANG_ILLEGAL_FORCED_JOIN_ORDER);
@@ -828,12 +823,12 @@ public class OptimizerImpl implements Op
// Verify that the user specified a legal join order
if ( ! optimizableList.legalJoinOrder(numTablesInQuery))
{
- if (optimizerTrace) { tracer().traceIllegalUserJoinOrder(); }
+ if (tracingIsOn()) { tracer().traceIllegalUserJoinOrder(); }
throw StandardException.newException(SQLState.LANG_ILLEGAL_FORCED_JOIN_ORDER);
}
- if (optimizerTrace) { tracer().traceUserJoinOrderOptimized(); }
+ if (tracingIsOn()) { tracer().traceUserJoinOrderOptimized(); }
desiredJoinOrderFound = true;
}
@@ -953,7 +948,7 @@ public class OptimizerImpl implements Op
optimizableList.getOptimizable(nextOptimizable).
getBestAccessPath().setCostEstimate((CostEstimate) null);
- if (optimizerTrace)
+ if (tracingIsOn())
{
tracer().traceJoinOrderConsideration
( joinPosition, ArrayUtil.copy( proposedJoinOrder ), (JBitSet) assignedTableMap.clone() );
@@ -1614,15 +1609,16 @@ public class OptimizerImpl implements Op
ce.singleScanRowCount());
}
- if (optimizerTrace) { tracer().traceCostWithoutSortAvoidance( currentCost ); }
+ if (tracingIsOn())
{
+ tracer().traceCostWithoutSortAvoidance( currentCost );
if (curOpt.considerSortAvoidancePath()) { tracer().traceCostWithSortAvoidance( currentSortAvoidanceCost ); }
}
/* Do we have a complete join order? */
if ( joinPosition == (numOptimizables - 1) )
{
- if (optimizerTrace) { tracer().traceCompleteJoinOrder(); }
+ if (tracingIsOn()) { tracer().traceCompleteJoinOrder(); }
/* Add cost of sorting to non-sort-avoidance cost */
if (requiredRowOrdering != null)
@@ -1704,7 +1700,7 @@ public class OptimizerImpl implements Op
currentCost.singleScanRowCount()
);
- if (optimizerTrace) { tracer().traceSortCost( sortCost, currentCost ); }
+ if (tracingIsOn()) { tracer().traceSortCost( sortCost, currentCost ); }
}
/*
@@ -1772,7 +1768,7 @@ public class OptimizerImpl implements Op
bestRowOrdering, optimizableList) ==
RequiredRowOrdering.NOTHING_REQUIRED)
{
- if (optimizerTrace) { tracer().traceCurrentPlanAvoidsSort( bestCost, currentSortAvoidanceCost ); }
+ if (tracingIsOn()) { tracer().traceCurrentPlanAvoidsSort( bestCost, currentSortAvoidanceCost ); }
if ((currentSortAvoidanceCost.compare(bestCost) <= 0)
|| bestCost.isUninitialized())
@@ -1802,7 +1798,7 @@ public class OptimizerImpl implements Op
{
foundABestPlan = true;
- if (optimizerTrace) { tracer().traceCheapestPlanSoFar( planType, currentCost ); }
+ if (tracingIsOn()) { tracer().traceCheapestPlanSoFar( planType, currentCost ); }
/* Remember the current cost as best */
bestCost.setCost(currentCost);
@@ -1843,7 +1839,7 @@ public class OptimizerImpl implements Op
requiredRowOrdering.sortNeeded();
}
- if (optimizerTrace)
+ if (tracingIsOn())
{
if (requiredRowOrdering != null) { tracer().traceSortNeededForOrdering( planType, requiredRowOrdering ); }
tracer().traceRememberingBestJoinOrder( joinPosition, ArrayUtil.copy( bestJoinOrder ), (JBitSet) assignedTableMap.clone() );
@@ -2163,7 +2159,7 @@ public class OptimizerImpl implements Op
// DERBY-1259.
if( ! optimizable.memoryUsageOK( estimatedCost.rowCount() / outerCost.rowCount(), maxMemoryPerTable))
{
- if (optimizerTrace) { tracer().traceSkippingBecauseTooMuchMemory( maxMemoryPerTable ); }
+ if (tracingIsOn()) { tracer().traceSkippingBecauseTooMuchMemory( maxMemoryPerTable ); }
return;
}
@@ -2297,7 +2293,7 @@ public class OptimizerImpl implements Op
if( ! optimizable.memoryUsageOK( estimatedCost.rowCount() / outerCost.rowCount(),
maxMemoryPerTable))
{
- if (optimizerTrace) { tracer().traceSkippingBecauseTooMuchMemory( maxMemoryPerTable ); }
+ if (tracingIsOn()) { tracer().traceSkippingBecauseTooMuchMemory( maxMemoryPerTable ); }
return;
}
@@ -2383,11 +2379,11 @@ public class OptimizerImpl implements Op
*/
public void modifyAccessPaths() throws StandardException
{
- if (optimizerTrace) { tracer().traceModifyingAccessPaths(); }
+ if (tracingIsOn()) { tracer().traceModifyingAccessPaths( hashCode() ); }
if ( ! foundABestPlan)
{
- if (optimizerTrace) { tracer().traceNoBestPlan(); }
+ if (tracingIsOn()) { tracer().traceNoBestPlan(); }
throw StandardException.newException(SQLState.LANG_NO_BEST_PLAN_FOUND);
}
@@ -2752,11 +2748,6 @@ public class OptimizerImpl implements Op
}
/** Get the trace machinery */
- public OptTrace tracer()
- {
- if ( _tracer == null ) { _tracer = new DefaultOptTrace( lcc, hashCode() ); }
-
- return _tracer;
- }
+ public OptTrace tracer() { return lcc.getOptimizerTracer(); }
}
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/conn/GenericLanguageConnectionContext.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/conn/GenericLanguageConnectionContext.java?rev=1478932&r1=1478931&r2=1478932&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/conn/GenericLanguageConnectionContext.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/conn/GenericLanguageConnectionContext.java Fri May 3 19:16:33 2013
@@ -41,6 +41,7 @@ import org.apache.derby.iapi.db.Database
import org.apache.derby.iapi.error.StandardException;
import org.apache.derby.iapi.sql.compile.CompilerContext;
import org.apache.derby.iapi.sql.compile.OptimizerFactory;
+import org.apache.derby.iapi.sql.compile.OptTrace;
import org.apache.derby.iapi.sql.compile.ASTVisitor;
import org.apache.derby.iapi.sql.conn.Authorizer;
import org.apache.derby.iapi.error.ExceptionSeverity;
@@ -273,10 +274,7 @@ public class GenericLanguageConnectionCo
private ArrayList triggerTables;
// OptimizerTrace
- private boolean optimizerTrace;
- private boolean optimizerTraceHtml;
- private String lastOptimizerTraceOutput;
- private String optimizerTraceOutput;
+ private OptTrace optimizerTracer;
//// Support for AUTOINCREMENT
@@ -2994,82 +2992,24 @@ public class GenericLanguageConnectionCo
}
/**
- * @see LanguageConnectionContext#setOptimizerTrace
+ * @see LanguageConnectionContext#setOptimizerTracer
*/
- public boolean setOptimizerTrace(boolean onOrOff)
+ public void setOptimizerTracer( OptTrace tracer )
{
- if (of == null)
- {
- return false;
- }
- if (! of.supportsOptimizerTrace())
- {
- return false;
- }
- optimizerTrace = onOrOff;
- return true;
- }
-
- /**
- * @see LanguageConnectionContext#getOptimizerTrace
- */
- public boolean getOptimizerTrace()
- {
- return optimizerTrace;
- }
-
- /**
- * @see LanguageConnectionContext#setOptimizerTraceHtml
- */
- public boolean setOptimizerTraceHtml(boolean onOrOff)
- {
- if (of == null)
- {
- return false;
- }
- if (! of.supportsOptimizerTrace())
- {
- return false;
- }
- optimizerTraceHtml = onOrOff;
- return true;
- }
-
- /**
- * @see LanguageConnectionContext#getOptimizerTraceHtml
- */
- public boolean getOptimizerTraceHtml()
- {
- return optimizerTraceHtml;
+ optimizerTracer = tracer;
}
/**
- * @see LanguageConnectionContext#setOptimizerTraceOutput
+ * @see LanguageConnectionContext#getOptimizerTracer
*/
- public void setOptimizerTraceOutput(String startingText)
- {
- if (optimizerTrace)
- {
- lastOptimizerTraceOutput = optimizerTraceOutput;
- optimizerTraceOutput = startingText;
- }
- }
-
- /**
- * @see LanguageConnectionContext#appendOptimizerTraceOutput
- */
- public void appendOptimizerTraceOutput(String output)
- {
- optimizerTraceOutput =
- (optimizerTraceOutput == null) ? output : optimizerTraceOutput + output;
- }
-
+ public OptTrace getOptimizerTracer() { return optimizerTracer; }
+
/**
- * @see LanguageConnectionContext#getOptimizerTraceOutput
+ * @see LanguageConnectionContext#optimizerTracingIsOn
*/
- public String getOptimizerTraceOutput()
+ public boolean optimizerTracingIsOn()
{
- return lastOptimizerTraceOutput;
+ return (optimizerTracer != null);
}
/**
Modified: db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/optional/OptimizerTracer.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/optional/OptimizerTracer.java?rev=1478932&r1=1478931&r2=1478932&view=diff
==============================================================================
--- db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/optional/OptimizerTracer.java (original)
+++ db/derby/code/trunk/java/tools/org/apache/derby/impl/tools/optional/OptimizerTracer.java Fri May 3 19:16:33 2013
@@ -21,10 +21,11 @@
package org.apache.derby.impl.tools.optional;
-import java.io.FileWriter;
+import java.io.PrintWriter;
import java.sql.SQLException;
import org.apache.derby.iapi.db.OptimizerTrace;
+import org.apache.derby.iapi.sql.compile.OptTrace;
import org.apache.derby.iapi.sql.dictionary.OptionalTool;
/**
@@ -75,7 +76,7 @@ public class OptimizerTracer implemen
/**
* <p>
- * Dump the optimizer trace and turn off tracing. Takes optional parameters:
+ * Print the optimizer trace and turn off tracing. Takes optional parameters:
* </p>
*
* <ul>
@@ -85,30 +86,34 @@ public class OptimizerTracer implemen
public void unloadTool( String... configurationParameters )
throws SQLException
{
- String trace = OptimizerTrace.getOptimizerTraceOutput();
- if ( trace == null ) { trace = ""; }
-
- OptimizerTrace.nullifyTrace();
+ try {
+ OptTrace tracer = OptimizerTrace.getOptimizerTracer();
+ boolean needsClosing = false;
+
+ PrintWriter pw;
+ if (
+ (configurationParameters != null) &&
+ (configurationParameters.length > 0)
+ )
+ {
+ pw = new PrintWriter( configurationParameters[ 0 ] );
+ needsClosing = true;
+ }
+ else { pw = new PrintWriter( System.out ); }
- if (
- (configurationParameters != null) &&
- (configurationParameters.length > 0)
- )
- {
- try {
- FileWriter writer = new FileWriter( configurationParameters[ 0 ] );
+ if ( tracer != null )
+ {
+ tracer.printToWriter( pw );
+ pw.flush();
+ }
- writer.write( trace );
- writer.flush();
- writer.close();
- } catch (Exception e) { throw wrap( e ); }
+ if ( needsClosing ) { pw.close(); }
}
- else
+ catch (Exception e) { throw wrap( e ); }
+ finally
{
- System.out.println( trace );
+ OptimizerTrace.setOptimizerTracer( null );
}
-
- OptimizerTrace.setOptimizerTrace( false );
}
////////////////////////////////////////////////////////////////////////