From d2458e3b20f744ef88a8d3afaab91caa17508370 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Mon, 20 Jan 2014 17:12:50 -0300 Subject: [PATCH] Expose a routine to print triggers during EXPLAIN ANALYZE This is so that auto_explain can use it. Kyotaro HORIGUCHI --- src/backend/commands/explain.c | 60 +++++++++++++++++++++------------- src/include/commands/explain.h | 1 + 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index e604be31f9..0dba9283f1 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -486,29 +486,7 @@ ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es, /* Print info about runtime of triggers */ if (es->analyze) - { - 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; - - ExplainOpenGroup("Triggers", "Triggers", false, es); - - show_relname = (numrels > 1 || targrels != NIL); - rInfo = queryDesc->estate->es_result_relations; - for (nr = 0; nr < numrels; rInfo++, nr++) - report_triggers(rInfo, show_relname, es); - - foreach(l, targrels) - { - rInfo = (ResultRelInfo *) lfirst(l); - report_triggers(rInfo, show_relname, es); - } - - ExplainCloseGroup("Triggers", "Triggers", false, es); - } + ExplainPrintTriggers(es, queryDesc); /* * Close down the query and free resources. Include time for this in the @@ -564,6 +542,42 @@ ExplainPrintPlan(ExplainState *es, QueryDesc *queryDesc) ExplainNode(queryDesc->planstate, NIL, NULL, NULL, es); } +/* + * ExplainPrintTriggers - + + * convert a QueryDesc's trigger statistics to text and append it to + * es->str + * + * The caller should have set up the options fields of *es, as well as + * initializing the output buffer es->str. Other fields in *es are + * initialized here. + */ +void +ExplainPrintTriggers(ExplainState *es, QueryDesc *queryDesc) +{ + 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; + + ExplainOpenGroup("Triggers", "Triggers", false, es); + + show_relname = (numrels > 1 || targrels != NIL); + rInfo = queryDesc->estate->es_result_relations; + for (nr = 0; nr < numrels; rInfo++, nr++) + report_triggers(rInfo, show_relname, es); + + foreach(l, targrels) + { + rInfo = (ResultRelInfo *) lfirst(l); + report_triggers(rInfo, show_relname, es); + } + + ExplainCloseGroup("Triggers", "Triggers", false, es); +} + /* * ExplainQueryText - * add a "Query Text" node that contains the actual text of the query diff --git a/src/include/commands/explain.h b/src/include/commands/explain.h index 9e71206b50..e097710ddd 100644 --- a/src/include/commands/explain.h +++ b/src/include/commands/explain.h @@ -71,6 +71,7 @@ extern void ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, const char *queryString, ParamListInfo params); extern void ExplainPrintPlan(ExplainState *es, QueryDesc *queryDesc); +extern void ExplainPrintTriggers(ExplainState *es, QueryDesc *queryDesc); extern void ExplainQueryText(ExplainState *es, QueryDesc *queryDesc);