From bf576cc01482ffcdd7c22cf7502e6568076d49a5 Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> Date: Thu, 27 Mar 2003 14:33:11 +0000 Subject: [PATCH] GetTupleForTrigger must use outer transaction's command counter for time qual checking, not GetCurrentCommandId. Per test case from Steve Wolfe. --- src/backend/commands/trigger.c | 33 ++++++++++++++++++++------------- src/backend/executor/execMain.c | 8 +++++--- src/include/commands/trigger.h | 14 ++++++++------ 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 613dfbcb724..d1aa51df424 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.145 2003/02/09 06:56:26 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.146 2003/03/27 14:33:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -40,9 +40,10 @@ static void InsertTrigger(TriggerDesc *trigdesc, Trigger *trigger, int indx); static HeapTuple GetTupleForTrigger(EState *estate, - ResultRelInfo *relinfo, - ItemPointer tid, - TupleTableSlot **newSlot); + ResultRelInfo *relinfo, + ItemPointer tid, + CommandId cid, + TupleTableSlot **newSlot); static HeapTuple ExecCallTriggerFunc(TriggerData *trigdata, FmgrInfo *finfo, MemoryContext per_tuple_context); @@ -1303,7 +1304,8 @@ ExecASDeleteTriggers(EState *estate, ResultRelInfo *relinfo) bool ExecBRDeleteTriggers(EState *estate, ResultRelInfo *relinfo, - ItemPointer tupleid) + ItemPointer tupleid, + CommandId cid) { TriggerDesc *trigdesc = relinfo->ri_TrigDesc; int ntrigs = trigdesc->n_before_row[TRIGGER_EVENT_DELETE]; @@ -1314,7 +1316,7 @@ ExecBRDeleteTriggers(EState *estate, ResultRelInfo *relinfo, TupleTableSlot *newSlot; int i; - trigtuple = GetTupleForTrigger(estate, relinfo, tupleid, &newSlot); + trigtuple = GetTupleForTrigger(estate, relinfo, tupleid, cid, &newSlot); if (trigtuple == NULL) return false; @@ -1359,7 +1361,9 @@ ExecARDeleteTriggers(EState *estate, ResultRelInfo *relinfo, if (trigdesc && trigdesc->n_after_row[TRIGGER_EVENT_DELETE] > 0) { HeapTuple trigtuple = GetTupleForTrigger(estate, relinfo, - tupleid, NULL); + tupleid, + (CommandId) 0, + NULL); DeferredTriggerSaveEvent(relinfo, TRIGGER_EVENT_DELETE, true, trigtuple, NULL); @@ -1427,7 +1431,8 @@ ExecASUpdateTriggers(EState *estate, ResultRelInfo *relinfo) HeapTuple ExecBRUpdateTriggers(EState *estate, ResultRelInfo *relinfo, - ItemPointer tupleid, HeapTuple newtuple) + ItemPointer tupleid, HeapTuple newtuple, + CommandId cid) { TriggerDesc *trigdesc = relinfo->ri_TrigDesc; int ntrigs = trigdesc->n_before_row[TRIGGER_EVENT_UPDATE]; @@ -1439,7 +1444,7 @@ ExecBRUpdateTriggers(EState *estate, ResultRelInfo *relinfo, TupleTableSlot *newSlot; int i; - trigtuple = GetTupleForTrigger(estate, relinfo, tupleid, &newSlot); + trigtuple = GetTupleForTrigger(estate, relinfo, tupleid, cid, &newSlot); if (trigtuple == NULL) return NULL; @@ -1490,7 +1495,9 @@ ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo, if (trigdesc && trigdesc->n_after_row[TRIGGER_EVENT_UPDATE] > 0) { HeapTuple trigtuple = GetTupleForTrigger(estate, relinfo, - tupleid, NULL); + tupleid, + (CommandId) 0, + NULL); DeferredTriggerSaveEvent(relinfo, TRIGGER_EVENT_UPDATE, true, trigtuple, newtuple); @@ -1501,7 +1508,8 @@ ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo, static HeapTuple GetTupleForTrigger(EState *estate, ResultRelInfo *relinfo, - ItemPointer tid, TupleTableSlot **newSlot) + ItemPointer tid, CommandId cid, + TupleTableSlot **newSlot) { Relation relation = relinfo->ri_RelationDesc; HeapTupleData tuple; @@ -1518,8 +1526,7 @@ GetTupleForTrigger(EState *estate, ResultRelInfo *relinfo, *newSlot = NULL; tuple.t_self = *tid; ltrmark:; - test = heap_mark4update(relation, &tuple, &buffer, - GetCurrentCommandId()); + test = heap_mark4update(relation, &tuple, &buffer, cid); switch (test) { case HeapTupleSelfUpdated: diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index e9cbd734b30..1266895a5f6 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -26,7 +26,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.203 2003/03/20 03:34:55 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.204 2003/03/27 14:33:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1385,7 +1385,8 @@ ExecDelete(TupleTableSlot *slot, { bool dodelete; - dodelete = ExecBRDeleteTriggers(estate, resultRelInfo, tupleid); + dodelete = ExecBRDeleteTriggers(estate, resultRelInfo, tupleid, + estate->es_snapshot->curcid); if (!dodelete) /* "do nothing" */ return; @@ -1495,7 +1496,8 @@ ExecUpdate(TupleTableSlot *slot, HeapTuple newtuple; newtuple = ExecBRUpdateTriggers(estate, resultRelInfo, - tupleid, tuple); + tupleid, tuple, + estate->es_snapshot->curcid); if (newtuple == NULL) /* "do nothing" */ return; diff --git a/src/include/commands/trigger.h b/src/include/commands/trigger.h index 497a3622bf7..e2aa280a2e0 100644 --- a/src/include/commands/trigger.h +++ b/src/include/commands/trigger.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: trigger.h,v 1.40 2002/11/23 03:59:09 momjian Exp $ + * $Id: trigger.h,v 1.41 2003/03/27 14:33:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -131,8 +131,9 @@ extern void ExecBSDeleteTriggers(EState *estate, extern void ExecASDeleteTriggers(EState *estate, ResultRelInfo *relinfo); extern bool ExecBRDeleteTriggers(EState *estate, - ResultRelInfo *relinfo, - ItemPointer tupleid); + ResultRelInfo *relinfo, + ItemPointer tupleid, + CommandId cid); extern void ExecARDeleteTriggers(EState *estate, ResultRelInfo *relinfo, ItemPointer tupleid); @@ -141,9 +142,10 @@ extern void ExecBSUpdateTriggers(EState *estate, extern void ExecASUpdateTriggers(EState *estate, ResultRelInfo *relinfo); extern HeapTuple ExecBRUpdateTriggers(EState *estate, - ResultRelInfo *relinfo, - ItemPointer tupleid, - HeapTuple newtuple); + ResultRelInfo *relinfo, + ItemPointer tupleid, + HeapTuple newtuple, + CommandId cid); extern void ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo, ItemPointer tupleid, -- GitLab