From 63fcd4a505b9f48694e472d00f6b5b64ff05714e 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;