Commit e44dd843 authored by Robert Haas's avatar Robert Haas

Avoid listing the same ResultRelInfo in more than one EState list.

Doing so causes EXPLAIN ANALYZE to show trigger statistics multiple
times.  Commit 2f178441 seems to
be to blame for this.

Amit Langote, revieed by Amit Khandekar, Etsuro Fujita, and me.
parent 88fdc700
...@@ -652,15 +652,18 @@ ExplainPrintTriggers(ExplainState *es, QueryDesc *queryDesc) ...@@ -652,15 +652,18 @@ ExplainPrintTriggers(ExplainState *es, QueryDesc *queryDesc)
bool show_relname; bool show_relname;
int numrels = queryDesc->estate->es_num_result_relations; int numrels = queryDesc->estate->es_num_result_relations;
int numrootrels = queryDesc->estate->es_num_root_result_relations; int numrootrels = queryDesc->estate->es_num_root_result_relations;
List *leafrels = queryDesc->estate->es_leaf_result_relations; List *routerels;
List *targrels = queryDesc->estate->es_trig_target_relations; List *targrels;
int nr; int nr;
ListCell *l; ListCell *l;
routerels = queryDesc->estate->es_tuple_routing_result_relations;
targrels = queryDesc->estate->es_trig_target_relations;
ExplainOpenGroup("Triggers", "Triggers", false, es); ExplainOpenGroup("Triggers", "Triggers", false, es);
show_relname = (numrels > 1 || numrootrels > 0 || show_relname = (numrels > 1 || numrootrels > 0 ||
leafrels != NIL || targrels != NIL); routerels != NIL || targrels != NIL);
rInfo = queryDesc->estate->es_result_relations; rInfo = queryDesc->estate->es_result_relations;
for (nr = 0; nr < numrels; rInfo++, nr++) for (nr = 0; nr < numrels; rInfo++, nr++)
report_triggers(rInfo, show_relname, es); report_triggers(rInfo, show_relname, es);
...@@ -669,7 +672,7 @@ ExplainPrintTriggers(ExplainState *es, QueryDesc *queryDesc) ...@@ -669,7 +672,7 @@ ExplainPrintTriggers(ExplainState *es, QueryDesc *queryDesc)
for (nr = 0; nr < numrootrels; rInfo++, nr++) for (nr = 0; nr < numrootrels; rInfo++, nr++)
report_triggers(rInfo, show_relname, es); report_triggers(rInfo, show_relname, es);
foreach(l, leafrels) foreach(l, routerels)
{ {
rInfo = (ResultRelInfo *) lfirst(l); rInfo = (ResultRelInfo *) lfirst(l);
report_triggers(rInfo, show_relname, es); report_triggers(rInfo, show_relname, es);
......
...@@ -1413,8 +1413,11 @@ ExecGetTriggerResultRel(EState *estate, Oid relid) ...@@ -1413,8 +1413,11 @@ ExecGetTriggerResultRel(EState *estate, Oid relid)
rInfo++; rInfo++;
nr--; nr--;
} }
/* Third, search through the leaf result relations, if any */ /*
foreach(l, estate->es_leaf_result_relations) * Third, search through the result relations that were created during
* tuple routing, if any.
*/
foreach(l, estate->es_tuple_routing_result_relations)
{ {
rInfo = (ResultRelInfo *) lfirst(l); rInfo = (ResultRelInfo *) lfirst(l);
if (RelationGetRelid(rInfo->ri_RelationDesc) == relid) if (RelationGetRelid(rInfo->ri_RelationDesc) == relid)
......
...@@ -178,6 +178,15 @@ ExecSetupPartitionTupleRouting(ModifyTableState *mtstate, ...@@ -178,6 +178,15 @@ ExecSetupPartitionTupleRouting(ModifyTableState *mtstate,
resultRTindex, resultRTindex,
rel, rel,
estate->es_instrument); estate->es_instrument);
/*
* Since we've just initialized this ResultRelInfo, it's not in
* any list attached to the estate as yet. Add it, so that it can
* be found later.
*/
estate->es_tuple_routing_result_relations =
lappend(estate->es_tuple_routing_result_relations,
leaf_part_rri);
} }
part_tupdesc = RelationGetDescr(partrel); part_tupdesc = RelationGetDescr(partrel);
...@@ -210,9 +219,6 @@ ExecSetupPartitionTupleRouting(ModifyTableState *mtstate, ...@@ -210,9 +219,6 @@ ExecSetupPartitionTupleRouting(ModifyTableState *mtstate,
mtstate != NULL && mtstate != NULL &&
mtstate->mt_onconflict != ONCONFLICT_NONE); mtstate->mt_onconflict != ONCONFLICT_NONE);
estate->es_leaf_result_relations =
lappend(estate->es_leaf_result_relations, leaf_part_rri);
proute->partitions[i] = leaf_part_rri; proute->partitions[i] = leaf_part_rri;
i++; i++;
} }
......
...@@ -119,7 +119,7 @@ CreateExecutorState(void) ...@@ -119,7 +119,7 @@ CreateExecutorState(void)
estate->es_root_result_relations = NULL; estate->es_root_result_relations = NULL;
estate->es_num_root_result_relations = 0; estate->es_num_root_result_relations = 0;
estate->es_leaf_result_relations = NIL; estate->es_tuple_routing_result_relations = NIL;
estate->es_trig_target_relations = NIL; estate->es_trig_target_relations = NIL;
estate->es_trig_tuple_slot = NULL; estate->es_trig_tuple_slot = NULL;
......
...@@ -466,8 +466,11 @@ typedef struct EState ...@@ -466,8 +466,11 @@ typedef struct EState
ResultRelInfo *es_root_result_relations; /* array of ResultRelInfos */ ResultRelInfo *es_root_result_relations; /* array of ResultRelInfos */
int es_num_root_result_relations; /* length of the array */ int es_num_root_result_relations; /* length of the array */
/* Info about leaf partitions of partitioned table(s) for insert queries: */ /*
List *es_leaf_result_relations; /* List of ResultRelInfos */ * The following list contains ResultRelInfos created by the tuple
* routing code for partitions that don't already have one.
*/
List *es_tuple_routing_result_relations;
/* Stuff used for firing triggers: */ /* Stuff used for firing triggers: */
List *es_trig_target_relations; /* trigger-only ResultRelInfos */ List *es_trig_target_relations; /* trigger-only ResultRelInfos */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment