@ -372,7 +372,11 @@ ExplainOneQuery(Query *query, int cursorOptions,
PlannedStmt * plan ;
PlannedStmt * plan ;
instr_time planstart ,
instr_time planstart ,
planduration ;
planduration ;
BufferUsage bufusage_start ,
bufusage ;
if ( es - > buffers )
bufusage_start = pgBufferUsage ;
INSTR_TIME_SET_CURRENT ( planstart ) ;
INSTR_TIME_SET_CURRENT ( planstart ) ;
/* plan the query */
/* plan the query */
@ -381,9 +385,16 @@ ExplainOneQuery(Query *query, int cursorOptions,
INSTR_TIME_SET_CURRENT ( planduration ) ;
INSTR_TIME_SET_CURRENT ( planduration ) ;
INSTR_TIME_SUBTRACT ( planduration , planstart ) ;
INSTR_TIME_SUBTRACT ( planduration , planstart ) ;
/* calc differences of buffer counters. */
if ( es - > buffers )
{
memset ( & bufusage , 0 , sizeof ( BufferUsage ) ) ;
BufferUsageAccumDiff ( & bufusage , & pgBufferUsage , & bufusage_start ) ;
}
/* run it (if needed) and produce output */
/* run it (if needed) and produce output */
ExplainOnePlan ( plan , into , es , queryString , params , queryEnv ,
ExplainOnePlan ( plan , into , es , queryString , params , queryEnv ,
& planduration ) ;
& planduration , ( es - > buffers ? & bufusage : NULL ) ) ;
}
}
}
}
@ -476,7 +487,8 @@ ExplainOneUtility(Node *utilityStmt, IntoClause *into, ExplainState *es,
void
void
ExplainOnePlan ( PlannedStmt * plannedstmt , IntoClause * into , ExplainState * es ,
ExplainOnePlan ( PlannedStmt * plannedstmt , IntoClause * into , ExplainState * es ,
const char * queryString , ParamListInfo params ,
const char * queryString , ParamListInfo params ,
QueryEnvironment * queryEnv , const instr_time * planduration )
QueryEnvironment * queryEnv , const instr_time * planduration ,
const BufferUsage * bufusage )
{
{
DestReceiver * dest ;
DestReceiver * dest ;
QueryDesc * queryDesc ;
QueryDesc * queryDesc ;
@ -560,6 +572,9 @@ ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es,
/* Create textual dump of plan tree */
/* Create textual dump of plan tree */
ExplainPrintPlan ( es , queryDesc ) ;
ExplainPrintPlan ( es , queryDesc ) ;
if ( es - > summary & & ( planduration | | bufusage ) )
ExplainOpenGroup ( " Planning " , " Planning " , true , es ) ;
if ( es - > summary & & planduration )
if ( es - > summary & & planduration )
{
{
double plantime = INSTR_TIME_GET_DOUBLE ( * planduration ) ;
double plantime = INSTR_TIME_GET_DOUBLE ( * planduration ) ;
@ -567,6 +582,19 @@ ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es,
ExplainPropertyFloat ( " Planning Time " , " ms " , 1000.0 * plantime , 3 , es ) ;
ExplainPropertyFloat ( " Planning Time " , " ms " , 1000.0 * plantime , 3 , es ) ;
}
}
/* Show buffer usage */
if ( es - > summary & & bufusage )
{
if ( es - > format = = EXPLAIN_FORMAT_TEXT )
es - > indent + + ;
show_buffer_usage ( es , bufusage ) ;
if ( es - > format = = EXPLAIN_FORMAT_TEXT )
es - > indent - - ;
}
if ( es - > summary & & ( planduration | | bufusage ) )
ExplainCloseGroup ( " Planning " , " Planning " , true , es ) ;
/* Print info about runtime of triggers */
/* Print info about runtime of triggers */
if ( es - > analyze )
if ( es - > analyze )
ExplainPrintTriggers ( es , queryDesc ) ;
ExplainPrintTriggers ( es , queryDesc ) ;