Rely on executor utils to build targetlist for DML RETURNING.
authorAndres Freund
Fri, 29 Dec 2017 20:26:29 +0000 (12:26 -0800)
committerAndres Freund
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[email protected]

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;
    }