Skip to content

Commit bf576cc

Browse files
committed
GetTupleForTrigger must use outer transaction's command counter for time
qual checking, not GetCurrentCommandId. Per test case from Steve Wolfe.
1 parent 89508a8 commit bf576cc

File tree

3 files changed

+33
-22
lines changed

3 files changed

+33
-22
lines changed

src/backend/commands/trigger.c

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.145 2003/02/09 06:56:26 tgl Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.146 2003/03/27 14:33:11 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -40,9 +40,10 @@
4040

4141
static void InsertTrigger(TriggerDesc *trigdesc, Trigger *trigger, int indx);
4242
static HeapTuple GetTupleForTrigger(EState *estate,
43-
ResultRelInfo *relinfo,
44-
ItemPointer tid,
45-
TupleTableSlot **newSlot);
43+
ResultRelInfo *relinfo,
44+
ItemPointer tid,
45+
CommandId cid,
46+
TupleTableSlot **newSlot);
4647
static HeapTuple ExecCallTriggerFunc(TriggerData *trigdata,
4748
FmgrInfo *finfo,
4849
MemoryContext per_tuple_context);
@@ -1303,7 +1304,8 @@ ExecASDeleteTriggers(EState *estate, ResultRelInfo *relinfo)
13031304

13041305
bool
13051306
ExecBRDeleteTriggers(EState *estate, ResultRelInfo *relinfo,
1306-
ItemPointer tupleid)
1307+
ItemPointer tupleid,
1308+
CommandId cid)
13071309
{
13081310
TriggerDesc *trigdesc = relinfo->ri_TrigDesc;
13091311
int ntrigs = trigdesc->n_before_row[TRIGGER_EVENT_DELETE];
@@ -1314,7 +1316,7 @@ ExecBRDeleteTriggers(EState *estate, ResultRelInfo *relinfo,
13141316
TupleTableSlot *newSlot;
13151317
int i;
13161318

1317-
trigtuple = GetTupleForTrigger(estate, relinfo, tupleid, &newSlot);
1319+
trigtuple = GetTupleForTrigger(estate, relinfo, tupleid, cid, &newSlot);
13181320
if (trigtuple == NULL)
13191321
return false;
13201322

@@ -1359,7 +1361,9 @@ ExecARDeleteTriggers(EState *estate, ResultRelInfo *relinfo,
13591361
if (trigdesc && trigdesc->n_after_row[TRIGGER_EVENT_DELETE] > 0)
13601362
{
13611363
HeapTuple trigtuple = GetTupleForTrigger(estate, relinfo,
1362-
tupleid, NULL);
1364+
tupleid,
1365+
(CommandId) 0,
1366+
NULL);
13631367

13641368
DeferredTriggerSaveEvent(relinfo, TRIGGER_EVENT_DELETE,
13651369
true, trigtuple, NULL);
@@ -1427,7 +1431,8 @@ ExecASUpdateTriggers(EState *estate, ResultRelInfo *relinfo)
14271431

14281432
HeapTuple
14291433
ExecBRUpdateTriggers(EState *estate, ResultRelInfo *relinfo,
1430-
ItemPointer tupleid, HeapTuple newtuple)
1434+
ItemPointer tupleid, HeapTuple newtuple,
1435+
CommandId cid)
14311436
{
14321437
TriggerDesc *trigdesc = relinfo->ri_TrigDesc;
14331438
int ntrigs = trigdesc->n_before_row[TRIGGER_EVENT_UPDATE];
@@ -1439,7 +1444,7 @@ ExecBRUpdateTriggers(EState *estate, ResultRelInfo *relinfo,
14391444
TupleTableSlot *newSlot;
14401445
int i;
14411446

1442-
trigtuple = GetTupleForTrigger(estate, relinfo, tupleid, &newSlot);
1447+
trigtuple = GetTupleForTrigger(estate, relinfo, tupleid, cid, &newSlot);
14431448
if (trigtuple == NULL)
14441449
return NULL;
14451450

@@ -1490,7 +1495,9 @@ ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo,
14901495
if (trigdesc && trigdesc->n_after_row[TRIGGER_EVENT_UPDATE] > 0)
14911496
{
14921497
HeapTuple trigtuple = GetTupleForTrigger(estate, relinfo,
1493-
tupleid, NULL);
1498+
tupleid,
1499+
(CommandId) 0,
1500+
NULL);
14941501

14951502
DeferredTriggerSaveEvent(relinfo, TRIGGER_EVENT_UPDATE,
14961503
true, trigtuple, newtuple);
@@ -1501,7 +1508,8 @@ ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo,
15011508

15021509
static HeapTuple
15031510
GetTupleForTrigger(EState *estate, ResultRelInfo *relinfo,
1504-
ItemPointer tid, TupleTableSlot **newSlot)
1511+
ItemPointer tid, CommandId cid,
1512+
TupleTableSlot **newSlot)
15051513
{
15061514
Relation relation = relinfo->ri_RelationDesc;
15071515
HeapTupleData tuple;
@@ -1518,8 +1526,7 @@ GetTupleForTrigger(EState *estate, ResultRelInfo *relinfo,
15181526
*newSlot = NULL;
15191527
tuple.t_self = *tid;
15201528
ltrmark:;
1521-
test = heap_mark4update(relation, &tuple, &buffer,
1522-
GetCurrentCommandId());
1529+
test = heap_mark4update(relation, &tuple, &buffer, cid);
15231530
switch (test)
15241531
{
15251532
case HeapTupleSelfUpdated:

src/backend/executor/execMain.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
*
2727
*
2828
* IDENTIFICATION
29-
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.203 2003/03/20 03:34:55 momjian Exp $
29+
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.204 2003/03/27 14:33:11 tgl Exp $
3030
*
3131
*-------------------------------------------------------------------------
3232
*/
@@ -1385,7 +1385,8 @@ ExecDelete(TupleTableSlot *slot,
13851385
{
13861386
bool dodelete;
13871387

1388-
dodelete = ExecBRDeleteTriggers(estate, resultRelInfo, tupleid);
1388+
dodelete = ExecBRDeleteTriggers(estate, resultRelInfo, tupleid,
1389+
estate->es_snapshot->curcid);
13891390

13901391
if (!dodelete) /* "do nothing" */
13911392
return;
@@ -1495,7 +1496,8 @@ ExecUpdate(TupleTableSlot *slot,
14951496
HeapTuple newtuple;
14961497

14971498
newtuple = ExecBRUpdateTriggers(estate, resultRelInfo,
1498-
tupleid, tuple);
1499+
tupleid, tuple,
1500+
estate->es_snapshot->curcid);
14991501

15001502
if (newtuple == NULL) /* "do nothing" */
15011503
return;

src/include/commands/trigger.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
9-
* $Id: trigger.h,v 1.40 2002/11/23 03:59:09 momjian Exp $
9+
* $Id: trigger.h,v 1.41 2003/03/27 14:33:11 tgl Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -131,8 +131,9 @@ extern void ExecBSDeleteTriggers(EState *estate,
131131
extern void ExecASDeleteTriggers(EState *estate,
132132
ResultRelInfo *relinfo);
133133
extern bool ExecBRDeleteTriggers(EState *estate,
134-
ResultRelInfo *relinfo,
135-
ItemPointer tupleid);
134+
ResultRelInfo *relinfo,
135+
ItemPointer tupleid,
136+
CommandId cid);
136137
extern void ExecARDeleteTriggers(EState *estate,
137138
ResultRelInfo *relinfo,
138139
ItemPointer tupleid);
@@ -141,9 +142,10 @@ extern void ExecBSUpdateTriggers(EState *estate,
141142
extern void ExecASUpdateTriggers(EState *estate,
142143
ResultRelInfo *relinfo);
143144
extern HeapTuple ExecBRUpdateTriggers(EState *estate,
144-
ResultRelInfo *relinfo,
145-
ItemPointer tupleid,
146-
HeapTuple newtuple);
145+
ResultRelInfo *relinfo,
146+
ItemPointer tupleid,
147+
HeapTuple newtuple,
148+
CommandId cid);
147149
extern void ExecARUpdateTriggers(EState *estate,
148150
ResultRelInfo *relinfo,
149151
ItemPointer tupleid,

0 commit comments

Comments
 (0)