]> granicus.if.org Git - postgresql/commitdiff
Rely on executor utils to build targetlist for DML RETURNING.
authorAndres Freund <andres@anarazel.de>
Fri, 29 Dec 2017 20:26:29 +0000 (12:26 -0800)
committerAndres Freund <andres@anarazel.de>
Fri, 29 Dec 2017 20:26:29 +0000 (12:26 -0800)
This is useful because it gets rid of the sole direct user of
ExecAssignResultType(). A future commit will likely make use of that
and combine creating the targetlist with the initialization of the
result slot. But it seems like good code hygiene anyway.

Author: Andres Freund
Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de

src/backend/executor/nodeModifyTable.c

index afb83ed3ae1d6c1b75cf73d06f9dd5fdab7118c2..82cd4462a3e48e4316e84cce2a3cfef7b173f7e9 100644 (file)
@@ -1828,7 +1828,6 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
        int                     nplans = list_length(node->plans);
        ResultRelInfo *saved_resultRelInfo;
        ResultRelInfo *resultRelInfo;
-       TupleDesc       tupDesc;
        Plan       *subplan;
        ListCell   *l;
        int                     i;
@@ -2068,12 +2067,11 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
                 * Initialize result tuple slot and assign its rowtype using the first
                 * RETURNING list.  We assume the rest will look the same.
                 */
-               tupDesc = ExecTypeFromTL((List *) linitial(node->returningLists),
-                                                                false);
+               mtstate->ps.plan->targetlist = (List *) linitial(node->returningLists);
 
                /* Set up a slot for the output of the RETURNING projection(s) */
                ExecInitResultTupleSlot(estate, &mtstate->ps);
-               ExecAssignResultType(&mtstate->ps, tupDesc);
+               ExecAssignResultTypeFromTL(&mtstate->ps);
                slot = mtstate->ps.ps_ResultTupleSlot;
 
                /* Need an econtext too */
@@ -2126,9 +2124,9 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
                 * We still must construct a dummy result tuple type, because InitPlan
                 * expects one (maybe should change that?).
                 */
-               tupDesc = ExecTypeFromTL(NIL, false);
+               mtstate->ps.plan->targetlist = NIL;
                ExecInitResultTupleSlot(estate, &mtstate->ps);
-               ExecAssignResultType(&mtstate->ps, tupDesc);
+               ExecAssignResultTypeFromTL(&mtstate->ps);
 
                mtstate->ps.ps_ExprContext = NULL;
        }