Re: Violation of principle that plan trees are read-only - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Violation of principle that plan trees are read-only
Date
Msg-id 866734.1747760686@sss.pgh.pa.us
Whole thread Raw
In response to Violation of principle that plan trees are read-only  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: Violation of principle that plan trees are read-only
List pgsql-hackers
I wrote:
> I think we can just delete this assignment (and fix these comments).

As attached.  I'm tempted to back-patch this: the plan tree damage
seems harmless at present, but maybe it'd become less harmless with
future fixes.

            regards, tom lane

diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 46d533b7288..71bc174cfc9 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -4830,12 +4830,11 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
         ExprContext *econtext;

         /*
-         * Initialize result tuple slot and assign its rowtype using the first
-         * RETURNING list.  We assume the rest will look the same.
+         * Initialize result tuple slot and assign its rowtype using the plan
+         * node's declared targetlist, which the planner set up to be the same
+         * as the first RETURNING list.  We assume the rest will produce
+         * compatible output.
          */
-        mtstate->ps.plan->targetlist = (List *) linitial(returningLists);
-
-        /* Set up a slot for the output of the RETURNING projection(s) */
         ExecInitResultTupleSlotTL(&mtstate->ps, &TTSOpsVirtual);
         slot = mtstate->ps.ps_ResultTupleSlot;

diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c
index 150e9f060ee..8e1eb77dd49 100644
--- a/src/backend/optimizer/plan/setrefs.c
+++ b/src/backend/optimizer/plan/setrefs.c
@@ -1097,9 +1097,10 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset)

                     /*
                      * Set up the visible plan targetlist as being the same as
-                     * the first RETURNING list. This is for the use of
-                     * EXPLAIN; the executor won't pay any attention to the
-                     * targetlist.  We postpone this step until here so that
+                     * the first RETURNING list.  This is mostly for the use
+                     * of EXPLAIN; the executor won't execute that targetlist,
+                     * although it does use it to prepare the node's result
+                     * tuple slot.  We postpone this step until here so that
                      * we don't have to do set_returning_clause_references()
                      * twice on identical targetlists.
                      */

pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: Re: proposal: schema variables
Next
From: Andres Freund
Date:
Subject: Re: Violation of principle that plan trees are read-only