Commit bf576cc0 authored by Tom Lane's avatar Tom Lane

GetTupleForTrigger must use outer transaction's command counter for time

qual checking, not GetCurrentCommandId.  Per test case from Steve Wolfe.
parent 89508a84
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * 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 $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -42,6 +42,7 @@ static void InsertTrigger(TriggerDesc *trigdesc, Trigger *trigger, int indx); ...@@ -42,6 +42,7 @@ static void InsertTrigger(TriggerDesc *trigdesc, Trigger *trigger, int indx);
static HeapTuple GetTupleForTrigger(EState *estate, static HeapTuple GetTupleForTrigger(EState *estate,
ResultRelInfo *relinfo, ResultRelInfo *relinfo,
ItemPointer tid, ItemPointer tid,
CommandId cid,
TupleTableSlot **newSlot); TupleTableSlot **newSlot);
static HeapTuple ExecCallTriggerFunc(TriggerData *trigdata, static HeapTuple ExecCallTriggerFunc(TriggerData *trigdata,
FmgrInfo *finfo, FmgrInfo *finfo,
...@@ -1303,7 +1304,8 @@ ExecASDeleteTriggers(EState *estate, ResultRelInfo *relinfo) ...@@ -1303,7 +1304,8 @@ ExecASDeleteTriggers(EState *estate, ResultRelInfo *relinfo)
bool bool
ExecBRDeleteTriggers(EState *estate, ResultRelInfo *relinfo, ExecBRDeleteTriggers(EState *estate, ResultRelInfo *relinfo,
ItemPointer tupleid) ItemPointer tupleid,
CommandId cid)
{ {
TriggerDesc *trigdesc = relinfo->ri_TrigDesc; TriggerDesc *trigdesc = relinfo->ri_TrigDesc;
int ntrigs = trigdesc->n_before_row[TRIGGER_EVENT_DELETE]; int ntrigs = trigdesc->n_before_row[TRIGGER_EVENT_DELETE];
...@@ -1314,7 +1316,7 @@ ExecBRDeleteTriggers(EState *estate, ResultRelInfo *relinfo, ...@@ -1314,7 +1316,7 @@ ExecBRDeleteTriggers(EState *estate, ResultRelInfo *relinfo,
TupleTableSlot *newSlot; TupleTableSlot *newSlot;
int i; int i;
trigtuple = GetTupleForTrigger(estate, relinfo, tupleid, &newSlot); trigtuple = GetTupleForTrigger(estate, relinfo, tupleid, cid, &newSlot);
if (trigtuple == NULL) if (trigtuple == NULL)
return false; return false;
...@@ -1359,7 +1361,9 @@ ExecARDeleteTriggers(EState *estate, ResultRelInfo *relinfo, ...@@ -1359,7 +1361,9 @@ ExecARDeleteTriggers(EState *estate, ResultRelInfo *relinfo,
if (trigdesc && trigdesc->n_after_row[TRIGGER_EVENT_DELETE] > 0) if (trigdesc && trigdesc->n_after_row[TRIGGER_EVENT_DELETE] > 0)
{ {
HeapTuple trigtuple = GetTupleForTrigger(estate, relinfo, HeapTuple trigtuple = GetTupleForTrigger(estate, relinfo,
tupleid, NULL); tupleid,
(CommandId) 0,
NULL);
DeferredTriggerSaveEvent(relinfo, TRIGGER_EVENT_DELETE, DeferredTriggerSaveEvent(relinfo, TRIGGER_EVENT_DELETE,
true, trigtuple, NULL); true, trigtuple, NULL);
...@@ -1427,7 +1431,8 @@ ExecASUpdateTriggers(EState *estate, ResultRelInfo *relinfo) ...@@ -1427,7 +1431,8 @@ ExecASUpdateTriggers(EState *estate, ResultRelInfo *relinfo)
HeapTuple HeapTuple
ExecBRUpdateTriggers(EState *estate, ResultRelInfo *relinfo, ExecBRUpdateTriggers(EState *estate, ResultRelInfo *relinfo,
ItemPointer tupleid, HeapTuple newtuple) ItemPointer tupleid, HeapTuple newtuple,
CommandId cid)
{ {
TriggerDesc *trigdesc = relinfo->ri_TrigDesc; TriggerDesc *trigdesc = relinfo->ri_TrigDesc;
int ntrigs = trigdesc->n_before_row[TRIGGER_EVENT_UPDATE]; int ntrigs = trigdesc->n_before_row[TRIGGER_EVENT_UPDATE];
...@@ -1439,7 +1444,7 @@ ExecBRUpdateTriggers(EState *estate, ResultRelInfo *relinfo, ...@@ -1439,7 +1444,7 @@ ExecBRUpdateTriggers(EState *estate, ResultRelInfo *relinfo,
TupleTableSlot *newSlot; TupleTableSlot *newSlot;
int i; int i;
trigtuple = GetTupleForTrigger(estate, relinfo, tupleid, &newSlot); trigtuple = GetTupleForTrigger(estate, relinfo, tupleid, cid, &newSlot);
if (trigtuple == NULL) if (trigtuple == NULL)
return NULL; return NULL;
...@@ -1490,7 +1495,9 @@ ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo, ...@@ -1490,7 +1495,9 @@ ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo,
if (trigdesc && trigdesc->n_after_row[TRIGGER_EVENT_UPDATE] > 0) if (trigdesc && trigdesc->n_after_row[TRIGGER_EVENT_UPDATE] > 0)
{ {
HeapTuple trigtuple = GetTupleForTrigger(estate, relinfo, HeapTuple trigtuple = GetTupleForTrigger(estate, relinfo,
tupleid, NULL); tupleid,
(CommandId) 0,
NULL);
DeferredTriggerSaveEvent(relinfo, TRIGGER_EVENT_UPDATE, DeferredTriggerSaveEvent(relinfo, TRIGGER_EVENT_UPDATE,
true, trigtuple, newtuple); true, trigtuple, newtuple);
...@@ -1501,7 +1508,8 @@ ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo, ...@@ -1501,7 +1508,8 @@ ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo,
static HeapTuple static HeapTuple
GetTupleForTrigger(EState *estate, ResultRelInfo *relinfo, GetTupleForTrigger(EState *estate, ResultRelInfo *relinfo,
ItemPointer tid, TupleTableSlot **newSlot) ItemPointer tid, CommandId cid,
TupleTableSlot **newSlot)
{ {
Relation relation = relinfo->ri_RelationDesc; Relation relation = relinfo->ri_RelationDesc;
HeapTupleData tuple; HeapTupleData tuple;
...@@ -1518,8 +1526,7 @@ GetTupleForTrigger(EState *estate, ResultRelInfo *relinfo, ...@@ -1518,8 +1526,7 @@ GetTupleForTrigger(EState *estate, ResultRelInfo *relinfo,
*newSlot = NULL; *newSlot = NULL;
tuple.t_self = *tid; tuple.t_self = *tid;
ltrmark:; ltrmark:;
test = heap_mark4update(relation, &tuple, &buffer, test = heap_mark4update(relation, &tuple, &buffer, cid);
GetCurrentCommandId());
switch (test) switch (test)
{ {
case HeapTupleSelfUpdated: case HeapTupleSelfUpdated:
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
* *
* *
* IDENTIFICATION * 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, ...@@ -1385,7 +1385,8 @@ ExecDelete(TupleTableSlot *slot,
{ {
bool dodelete; bool dodelete;
dodelete = ExecBRDeleteTriggers(estate, resultRelInfo, tupleid); dodelete = ExecBRDeleteTriggers(estate, resultRelInfo, tupleid,
estate->es_snapshot->curcid);
if (!dodelete) /* "do nothing" */ if (!dodelete) /* "do nothing" */
return; return;
...@@ -1495,7 +1496,8 @@ ExecUpdate(TupleTableSlot *slot, ...@@ -1495,7 +1496,8 @@ ExecUpdate(TupleTableSlot *slot,
HeapTuple newtuple; HeapTuple newtuple;
newtuple = ExecBRUpdateTriggers(estate, resultRelInfo, newtuple = ExecBRUpdateTriggers(estate, resultRelInfo,
tupleid, tuple); tupleid, tuple,
estate->es_snapshot->curcid);
if (newtuple == NULL) /* "do nothing" */ if (newtuple == NULL) /* "do nothing" */
return; return;
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * 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 $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -132,7 +132,8 @@ extern void ExecASDeleteTriggers(EState *estate, ...@@ -132,7 +132,8 @@ extern void ExecASDeleteTriggers(EState *estate,
ResultRelInfo *relinfo); ResultRelInfo *relinfo);
extern bool ExecBRDeleteTriggers(EState *estate, extern bool ExecBRDeleteTriggers(EState *estate,
ResultRelInfo *relinfo, ResultRelInfo *relinfo,
ItemPointer tupleid); ItemPointer tupleid,
CommandId cid);
extern void ExecARDeleteTriggers(EState *estate, extern void ExecARDeleteTriggers(EState *estate,
ResultRelInfo *relinfo, ResultRelInfo *relinfo,
ItemPointer tupleid); ItemPointer tupleid);
...@@ -143,7 +144,8 @@ extern void ExecASUpdateTriggers(EState *estate, ...@@ -143,7 +144,8 @@ extern void ExecASUpdateTriggers(EState *estate,
extern HeapTuple ExecBRUpdateTriggers(EState *estate, extern HeapTuple ExecBRUpdateTriggers(EState *estate,
ResultRelInfo *relinfo, ResultRelInfo *relinfo,
ItemPointer tupleid, ItemPointer tupleid,
HeapTuple newtuple); HeapTuple newtuple,
CommandId cid);
extern void ExecARUpdateTriggers(EState *estate, extern void ExecARUpdateTriggers(EState *estate,
ResultRelInfo *relinfo, ResultRelInfo *relinfo,
ItemPointer tupleid, ItemPointer tupleid,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment