diff options
Diffstat (limited to 'src/backend/executor')
-rw-r--r-- | src/backend/executor/execMain.c | 38 | ||||
-rw-r--r-- | src/backend/executor/execUtils.c | 4 |
2 files changed, 33 insertions, 9 deletions
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 2a96a161c81..c379802cafd 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -26,7 +26,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.256 2005/10/15 02:49:16 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.257 2005/11/14 17:42:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -582,7 +582,8 @@ InitPlan(QueryDesc *queryDesc, bool explainOnly) * 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. + * unconditionally. Also, if it's not a SELECT, set up a slot for use + * for trigger output tuples. */ { int nSlots = ExecCountSlotsNode(plan); @@ -591,7 +592,14 @@ InitPlan(QueryDesc *queryDesc, bool explainOnly) nSlots += list_length(parseTree->resultRelations); else nSlots += 1; + if (operation != CMD_SELECT) + nSlots++; + estate->es_tupleTable = ExecCreateTupleTable(nSlots); + + if (operation != CMD_SELECT) + estate->es_trig_tuple_slot = + ExecAllocTableSlot(estate->es_tupleTable); } /* mark EvalPlanQual not active */ @@ -1399,12 +1407,19 @@ ExecInsert(TupleTableSlot *slot, if (newtuple != tuple) /* modified by Trigger(s) */ { /* - * Insert modified tuple into tuple table slot, replacing the - * original. We assume that it was allocated in per-tuple memory + * Put the modified tuple into a slot for convenience of routines + * below. We assume the tuple was allocated in per-tuple memory * context, and therefore will go away by itself. The tuple table * slot should not try to clear it. */ - ExecStoreTuple(newtuple, slot, InvalidBuffer, false); + TupleTableSlot *newslot = estate->es_trig_tuple_slot; + + if (newslot->tts_tupleDescriptor != slot->tts_tupleDescriptor) + ExecSetSlotDescriptor(newslot, + slot->tts_tupleDescriptor, + false); + ExecStoreTuple(newtuple, newslot, InvalidBuffer, false); + slot = newslot; tuple = newtuple; } } @@ -1600,12 +1615,19 @@ ExecUpdate(TupleTableSlot *slot, if (newtuple != tuple) /* modified by Trigger(s) */ { /* - * Insert modified tuple into tuple table slot, replacing the - * original. We assume that it was allocated in per-tuple memory + * Put the modified tuple into a slot for convenience of routines + * below. We assume the tuple was allocated in per-tuple memory * context, and therefore will go away by itself. The tuple table * slot should not try to clear it. */ - ExecStoreTuple(newtuple, slot, InvalidBuffer, false); + TupleTableSlot *newslot = estate->es_trig_tuple_slot; + + if (newslot->tts_tupleDescriptor != slot->tts_tupleDescriptor) + ExecSetSlotDescriptor(newslot, + slot->tts_tupleDescriptor, + false); + ExecStoreTuple(newtuple, newslot, InvalidBuffer, false); + slot = newslot; tuple = newtuple; } } diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c index 05bfc08dc7d..d9bcd1cf6fe 100644 --- a/src/backend/executor/execUtils.c +++ b/src/backend/executor/execUtils.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/execUtils.c,v 1.126 2005/10/15 02:49:16 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/execUtils.c,v 1.127 2005/11/14 17:42:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -187,6 +187,8 @@ CreateExecutorState(void) estate->es_junkFilter = NULL; + estate->es_trig_tuple_slot = NULL; + estate->es_into_relation_descriptor = NULL; estate->es_into_relation_use_wal = false; |