diff options
Diffstat (limited to 'src/backend/commands/explain.c')
-rw-r--r-- | src/backend/commands/explain.c | 96 |
1 files changed, 57 insertions, 39 deletions
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 39e8073f55b..c9d454bc497 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994-5, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.164 2007/05/25 17:54:24 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.165 2007/08/15 21:39:50 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -52,6 +52,8 @@ typedef struct ExplainState static void ExplainOneQuery(Query *query, ExplainStmt *stmt, const char *queryString, ParamListInfo params, TupOutputState *tstate); +static void report_triggers(ResultRelInfo *rInfo, bool show_relname, + StringInfo buf); static double elapsed_time(instr_time *starttime); static void explain_outNode(StringInfo str, Plan *plan, PlanState *planstate, @@ -310,50 +312,21 @@ ExplainOnePlan(PlannedStmt *plannedstmt, ParamListInfo params, if (es->printAnalyze) { ResultRelInfo *rInfo; + bool show_relname; int numrels = queryDesc->estate->es_num_result_relations; + List *targrels = queryDesc->estate->es_trig_target_relations; int nr; + ListCell *l; + show_relname = (numrels > 1 || targrels != NIL); rInfo = queryDesc->estate->es_result_relations; for (nr = 0; nr < numrels; rInfo++, nr++) - { - int nt; - - if (!rInfo->ri_TrigDesc || !rInfo->ri_TrigInstrument) - continue; - for (nt = 0; nt < rInfo->ri_TrigDesc->numtriggers; nt++) - { - Trigger *trig = rInfo->ri_TrigDesc->triggers + nt; - Instrumentation *instr = rInfo->ri_TrigInstrument + nt; - char *conname; + report_triggers(rInfo, show_relname, &buf); - /* Must clean up instrumentation state */ - InstrEndLoop(instr); - - /* - * We ignore triggers that were never invoked; they likely - * aren't relevant to the current query type. - */ - if (instr->ntuples == 0) - continue; - - if (OidIsValid(trig->tgconstraint) && - (conname = get_constraint_name(trig->tgconstraint)) != NULL) - { - appendStringInfo(&buf, "Trigger for constraint %s", - conname); - pfree(conname); - } - else - appendStringInfo(&buf, "Trigger %s", trig->tgname); - - if (numrels > 1) - appendStringInfo(&buf, " on %s", - RelationGetRelationName(rInfo->ri_RelationDesc)); - - appendStringInfo(&buf, ": time=%.3f calls=%.0f\n", - 1000.0 * instr->total, - instr->ntuples); - } + foreach(l, targrels) + { + rInfo = (ResultRelInfo *) lfirst(l); + report_triggers(rInfo, show_relname, &buf); } } @@ -382,6 +355,51 @@ ExplainOnePlan(PlannedStmt *plannedstmt, ParamListInfo params, pfree(es); } +/* + * report_triggers - + * report execution stats for a single relation's triggers + */ +static void +report_triggers(ResultRelInfo *rInfo, bool show_relname, StringInfo buf) +{ + int nt; + + if (!rInfo->ri_TrigDesc || !rInfo->ri_TrigInstrument) + return; + for (nt = 0; nt < rInfo->ri_TrigDesc->numtriggers; nt++) + { + Trigger *trig = rInfo->ri_TrigDesc->triggers + nt; + Instrumentation *instr = rInfo->ri_TrigInstrument + nt; + char *conname; + + /* Must clean up instrumentation state */ + InstrEndLoop(instr); + + /* + * We ignore triggers that were never invoked; they likely + * aren't relevant to the current query type. + */ + if (instr->ntuples == 0) + continue; + + if (OidIsValid(trig->tgconstraint) && + (conname = get_constraint_name(trig->tgconstraint)) != NULL) + { + appendStringInfo(buf, "Trigger for constraint %s", conname); + pfree(conname); + } + else + appendStringInfo(buf, "Trigger %s", trig->tgname); + + if (show_relname) + appendStringInfo(buf, " on %s", + RelationGetRelationName(rInfo->ri_RelationDesc)); + + appendStringInfo(buf, ": time=%.3f calls=%.0f\n", + 1000.0 * instr->total, instr->ntuples); + } +} + /* Compute elapsed time in seconds since given timestamp */ static double elapsed_time(instr_time *starttime) |