aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/nodeModifyTable.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/executor/nodeModifyTable.c')
-rw-r--r--src/backend/executor/nodeModifyTable.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index cf32dc56903..f10f70a17d3 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -1147,11 +1147,14 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
* Lastly, if this is not the primary (canSetTag) ModifyTable node, add it
* to estate->es_auxmodifytables so that it will be run to completion by
* ExecPostprocessPlan. (It'd actually work fine to add the primary
- * ModifyTable node too, but there's no need.)
+ * ModifyTable node too, but there's no need.) Note the use of lcons
+ * not lappend: we need later-initialized ModifyTable nodes to be shut
+ * down before earlier ones. This ensures that we don't throw away
+ * RETURNING rows that need to be seen by a later CTE subplan.
*/
if (!mtstate->canSetTag)
- estate->es_auxmodifytables = lappend(estate->es_auxmodifytables,
- mtstate);
+ estate->es_auxmodifytables = lcons(mtstate,
+ estate->es_auxmodifytables);
return mtstate;
}