diff options
Diffstat (limited to 'src/backend/commands/trigger.c')
-rw-r--r-- | src/backend/commands/trigger.c | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 8d22d43bc3a..faeea16d21a 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -4255,12 +4255,17 @@ AfterTriggerExecute(EState *estate, LocTriggerData.tg_trigtuple = ExecFetchSlotHeapTuple(trig_tuple_slot1, true, &should_free_trig); - LocTriggerData.tg_newslot = trig_tuple_slot2; - LocTriggerData.tg_newtuple = - ((evtshared->ats_event & TRIGGER_EVENT_OPMASK) == - TRIGGER_EVENT_UPDATE) ? - ExecFetchSlotHeapTuple(trig_tuple_slot2, true, &should_free_new) : NULL; - + if ((evtshared->ats_event & TRIGGER_EVENT_OPMASK) == + TRIGGER_EVENT_UPDATE) + { + LocTriggerData.tg_newslot = trig_tuple_slot2; + LocTriggerData.tg_newtuple = + ExecFetchSlotHeapTuple(trig_tuple_slot2, true, &should_free_new); + } + else + { + LocTriggerData.tg_newtuple = NULL; + } break; default: @@ -4355,10 +4360,14 @@ AfterTriggerExecute(EState *estate, if (should_free_new) heap_freetuple(LocTriggerData.tg_newtuple); - if (LocTriggerData.tg_trigslot) - ExecClearTuple(LocTriggerData.tg_trigslot); - if (LocTriggerData.tg_newslot) - ExecClearTuple(LocTriggerData.tg_newslot); + /* don't clear slots' contents if foreign table */ + if (trig_tuple_slot1 == NULL) + { + if (LocTriggerData.tg_trigslot) + ExecClearTuple(LocTriggerData.tg_trigslot); + if (LocTriggerData.tg_newslot) + ExecClearTuple(LocTriggerData.tg_newslot); + } /* * If doing EXPLAIN ANALYZE, stop charging time to this trigger, and count @@ -4512,13 +4521,14 @@ afterTriggerInvokeEvents(AfterTriggerEventList *events, trigdesc = rInfo->ri_TrigDesc; finfo = rInfo->ri_TrigFunctions; instr = rInfo->ri_TrigInstrument; + if (slot1 != NULL) + { + ExecDropSingleTupleTableSlot(slot1); + ExecDropSingleTupleTableSlot(slot2); + slot1 = slot2 = NULL; + } if (rel->rd_rel->relkind == RELKIND_FOREIGN_TABLE) { - if (slot1 != NULL) - { - ExecDropSingleTupleTableSlot(slot1); - ExecDropSingleTupleTableSlot(slot2); - } slot1 = MakeSingleTupleTableSlot(rel->rd_att, &TTSOpsMinimalTuple); slot2 = MakeSingleTupleTableSlot(rel->rd_att, |