diff options
Diffstat (limited to 'src/backend/executor/nodeGather.c')
-rw-r--r-- | src/backend/executor/nodeGather.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/backend/executor/nodeGather.c b/src/backend/executor/nodeGather.c index e45e07f0a1a..c979a557749 100644 --- a/src/backend/executor/nodeGather.c +++ b/src/backend/executor/nodeGather.c @@ -91,10 +91,14 @@ ExecInitGather(Gather *node, EState *estate, int eflags) outerPlanState(gatherstate) = ExecInitNode(outerNode, estate, eflags); tupDesc = ExecGetResultType(outerPlanState(gatherstate)); - /* this node uses tuples from the tuple queue as scan slot */ - gatherstate->ps.scanops = &TTSOpsHeapTuple; - gatherstate->ps.scanopsfixed = true; - gatherstate->ps.scanopsset = true; + /* + * Leader may access ExecProcNode result directly (if + * need_to_scan_locally), or from workers via tuple queue. So we can't + * trivially rely on the slot type being fixed for expressions evaluated + * within this node. + */ + gatherstate->ps.outeropsset = true; + gatherstate->ps.outeropsfixed = false; /* * Initialize result type and projection. @@ -103,6 +107,16 @@ ExecInitGather(Gather *node, EState *estate, int eflags) ExecConditionalAssignProjectionInfo(&gatherstate->ps, tupDesc, OUTER_VAR); /* + * Without projections result slot type is not trivially known, see + * comment above. + */ + if (gatherstate->ps.ps_ProjInfo == NULL) + { + gatherstate->ps.resultopsset = true; + gatherstate->ps.resultopsfixed = false; + } + + /* * Initialize funnel slot to same tuple descriptor as outer plan. */ gatherstate->funnel_slot = ExecInitExtraTupleSlot(estate, tupDesc, |