summaryrefslogtreecommitdiff
path: root/src/backend/executor/execMain.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/executor/execMain.c')
-rw-r--r--src/backend/executor/execMain.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index f87b674b074..3ba9b9136f5 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -27,7 +27,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.141 2001/05/27 09:59:29 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.142 2001/05/27 20:48:51 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -598,12 +598,19 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
}
/*
- * initialize the executor "tuple" table.
+ * initialize the executor "tuple" table. We need slots for all the
+ * plan nodes, plus possibly output slots for the junkfilter(s).
+ * At this point we aren't sure if we need junkfilters, so just add
+ * slots for them unconditionally.
*/
{
int nSlots = ExecCountSlotsNode(plan);
- estate->es_tupleTable = ExecCreateTupleTable(nSlots + 10); /* why add ten? - jolly */
+ if (parseTree->resultRelations != NIL)
+ nSlots += length(parseTree->resultRelations);
+ else
+ nSlots += 1;
+ estate->es_tupleTable = ExecCreateTupleTable(nSlots);
}
/* mark EvalPlanQual not active */
@@ -686,7 +693,8 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
JunkFilter *j;
j = ExecInitJunkFilter(subplan->targetlist,
- ExecGetTupType(subplan));
+ ExecGetTupType(subplan),
+ ExecAllocTableSlot(estate->es_tupleTable));
resultRelInfo->ri_junkFilter = j;
resultRelInfo++;
subplans = lnext(subplans);
@@ -702,9 +710,11 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
else
{
/* Normal case with just one JunkFilter */
- JunkFilter *j = ExecInitJunkFilter(plan->targetlist,
- tupType);
+ JunkFilter *j;
+ j = ExecInitJunkFilter(plan->targetlist,
+ tupType,
+ ExecAllocTableSlot(estate->es_tupleTable));
estate->es_junkFilter = j;
if (estate->es_result_relation_info)
estate->es_result_relation_info->ri_junkFilter = j;
@@ -986,7 +996,9 @@ lnext: ;
* if we have a junk filter, then project a new tuple with the
* junk removed.
*
- * Store this new "clean" tuple in the place of the original tuple.
+ * Store this new "clean" tuple in the junkfilter's resultSlot.
+ * (Formerly, we stored it back over the "dirty" tuple, which is
+ * WRONG because that tuple slot has the wrong descriptor.)
*
* Also, extract all the junk information we need.
*/
@@ -1088,7 +1100,7 @@ lnext: ;
newTuple = ExecRemoveJunk(junkfilter, slot);
slot = ExecStoreTuple(newTuple, /* tuple to store */
- slot, /* destination slot */
+ junkfilter->jf_resultSlot, /* dest slot */
InvalidBuffer, /* this tuple has no
* buffer */
true); /* tuple should be pfreed */
@@ -1467,7 +1479,9 @@ lreplace:;
{
*tupleid = ctid;
tuple = ExecRemoveJunk(estate->es_junkFilter, epqslot);
- slot = ExecStoreTuple(tuple, slot, InvalidBuffer, true);
+ slot = ExecStoreTuple(tuple,
+ estate->es_junkFilter->jf_resultSlot,
+ InvalidBuffer, true);
goto lreplace;
}
}