Thanks to visit codestin.com
Credit goes to github.com

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)