aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/trigger.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands/trigger.c')
-rw-r--r--src/backend/commands/trigger.c40
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,