From f78c135e638bc8c619c905a782858d1e4d93b541 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 22 Jun 2016 14:36:36 -0700 Subject: [PATCH] Fix definition of faux targetlist element inserted to prevent backward scans. The targetlist contains TargetEntrys containing expressions, not expressions directly. That didn't matter so far, but with the upcoming RETURNING support, the targetlist is inspected to build a TupleDesc. ExecCleanTypeFromTL hits an assert when looking at something that's not a TargetEntry. Mark the entry as resjunk, so it's not actually used. --- src/backend/distributed/planner/multi_planner.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/backend/distributed/planner/multi_planner.c b/src/backend/distributed/planner/multi_planner.c index 511c6dc8d..e3c899d37 100644 --- a/src/backend/distributed/planner/multi_planner.c +++ b/src/backend/distributed/planner/multi_planner.c @@ -25,6 +25,8 @@ #include "executor/executor.h" +#include "nodes/makefuncs.h" + #include "optimizer/planner.h" #include "utils/memutils.h" @@ -196,11 +198,17 @@ MultiQueryContainerNode(PlannedStmt *result, MultiPlan *multiPlan) if (!ExecSupportsBackwardScan(result->planTree)) { FuncExpr *funcExpr = makeNode(FuncExpr); + TargetEntry *targetEntry = NULL; + bool resjunkAttribute = true; + funcExpr->funcretset = true; + targetEntry = makeTargetEntry((Expr *) funcExpr, InvalidAttrNumber, NULL, + resjunkAttribute); + fauxFunctionScan->scan.plan.targetlist = lappend(fauxFunctionScan->scan.plan.targetlist, - funcExpr); + targetEntry); } result->planTree = (Plan *) fauxFunctionScan;