From 38c9eb8fee298a9242bb2049c4fdf94407187d0c Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 21 Aug 2011 18:16:02 -0400 Subject: Fix trigger WHEN conditions when both BEFORE and AFTER triggers exist. Due to tuple-slot mismanagement, evaluation of WHEN conditions for AFTER ROW UPDATE triggers could crash if there had been a BEFORE ROW trigger fired for the same update. Fix by not trying to overload the use of estate->es_trig_tuple_slot. Per report from Yoran Heling. Back-patch to 9.0, when trigger WHEN conditions were introduced. --- src/backend/commands/trigger.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/backend/commands') diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 0b3f93faca7..f4352aef4eb 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -2755,13 +2755,13 @@ TriggerEnabled(EState *estate, ResultRelInfo *relinfo, } if (HeapTupleIsValid(newtup)) { - if (estate->es_trig_tuple_slot == NULL) + if (estate->es_trig_newtup_slot == NULL) { oldContext = MemoryContextSwitchTo(estate->es_query_cxt); - estate->es_trig_tuple_slot = ExecInitExtraTupleSlot(estate); + estate->es_trig_newtup_slot = ExecInitExtraTupleSlot(estate); MemoryContextSwitchTo(oldContext); } - newslot = estate->es_trig_tuple_slot; + newslot = estate->es_trig_newtup_slot; if (newslot->tts_tupleDescriptor != tupdesc) ExecSetSlotDescriptor(newslot, tupdesc); ExecStoreTuple(newtup, newslot, InvalidBuffer, false); -- cgit v1.2.3