Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita6f0adb

Browse files
committed
Looks like I broke cases involving combinations of deferred update/delete
triggers ... oops ... but the regress tests should have covered this ...
1 parent76beb79 commita6f0adb

File tree

2 files changed

+54
-38
lines changed

2 files changed

+54
-38
lines changed

‎src/backend/commands/trigger.c

Lines changed: 50 additions & 31 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.85 2001/01/24 19:42:53 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.86 2001/01/27 05:16:58 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -911,7 +911,13 @@ ExecBRInsertTriggers(EState *estate, Relation rel, HeapTuple trigtuple)
911911
void
912912
ExecARInsertTriggers(EState*estate,Relationrel,HeapTupletrigtuple)
913913
{
914-
DeferredTriggerSaveEvent(rel,TRIGGER_EVENT_INSERT,NULL,trigtuple);
914+
/* Must save info if there are any deferred triggers on this rel */
915+
if (rel->trigdesc->n_after_row[TRIGGER_EVENT_INSERT]>0||
916+
rel->trigdesc->n_after_row[TRIGGER_EVENT_UPDATE]>0||
917+
rel->trigdesc->n_after_row[TRIGGER_EVENT_DELETE]>0)
918+
{
919+
DeferredTriggerSaveEvent(rel,TRIGGER_EVENT_INSERT,NULL,trigtuple);
920+
}
915921
}
916922

917923
bool
@@ -956,10 +962,16 @@ void
956962
ExecARDeleteTriggers(EState*estate,ItemPointertupleid)
957963
{
958964
Relationrel=estate->es_result_relation_info->ri_RelationDesc;
959-
HeapTupletrigtuple=GetTupleForTrigger(estate,tupleid,NULL);
960965

961-
DeferredTriggerSaveEvent(rel,TRIGGER_EVENT_DELETE,trigtuple,NULL);
962-
heap_freetuple(trigtuple);
966+
/* Must save info if there are upd/del deferred triggers on this rel */
967+
if (rel->trigdesc->n_after_row[TRIGGER_EVENT_UPDATE]>0||
968+
rel->trigdesc->n_after_row[TRIGGER_EVENT_DELETE]>0)
969+
{
970+
HeapTupletrigtuple=GetTupleForTrigger(estate,tupleid,NULL);
971+
972+
DeferredTriggerSaveEvent(rel,TRIGGER_EVENT_DELETE,trigtuple,NULL);
973+
heap_freetuple(trigtuple);
974+
}
963975
}
964976

965977
HeapTuple
@@ -1011,10 +1023,16 @@ void
10111023
ExecARUpdateTriggers(EState*estate,ItemPointertupleid,HeapTuplenewtuple)
10121024
{
10131025
Relationrel=estate->es_result_relation_info->ri_RelationDesc;
1014-
HeapTupletrigtuple=GetTupleForTrigger(estate,tupleid,NULL);
10151026

1016-
DeferredTriggerSaveEvent(rel,TRIGGER_EVENT_UPDATE,trigtuple,newtuple);
1017-
heap_freetuple(trigtuple);
1027+
/* Must save info if there are upd/del deferred triggers on this rel */
1028+
if (rel->trigdesc->n_after_row[TRIGGER_EVENT_UPDATE]>0||
1029+
rel->trigdesc->n_after_row[TRIGGER_EVENT_DELETE]>0)
1030+
{
1031+
HeapTupletrigtuple=GetTupleForTrigger(estate,tupleid,NULL);
1032+
1033+
DeferredTriggerSaveEvent(rel,TRIGGER_EVENT_UPDATE,trigtuple,newtuple);
1034+
heap_freetuple(trigtuple);
1035+
}
10181036
}
10191037

10201038

@@ -1225,36 +1243,39 @@ deferredTriggerAddEvent(DeferredTriggerEvent event)
12251243
/* ----------
12261244
* deferredTriggerGetPreviousEvent()
12271245
*
1228-
*Backward scan the eventlist to find the event a given OLD tuple
1246+
*Scan the eventlist to find the event a given OLD tuple
12291247
*resulted from in the same transaction.
12301248
* ----------
12311249
*/
12321250
staticDeferredTriggerEvent
12331251
deferredTriggerGetPreviousEvent(Oidrelid,ItemPointerctid)
12341252
{
1235-
DeferredTriggerEventprevious;
1236-
intn;
1253+
DeferredTriggerEventprevious=NULL;
1254+
List*dtev;
12371255

1238-
for (n=deftrig_n_events-1;n >=0;n--)
1256+
/* Search the list to find the last event affecting this tuple */
1257+
foreach(dtev,deftrig_events)
12391258
{
1240-
previous= (DeferredTriggerEvent)nth(n,deftrig_events);
1259+
DeferredTriggerEventprev= (DeferredTriggerEvent)lfirst(dtev);
12411260

1242-
if (previous->dte_relid!=relid)
1261+
if (prev->dte_relid!=relid)
12431262
continue;
1244-
if (previous->dte_event&TRIGGER_DEFERRED_CANCELED)
1263+
if (prev->dte_event&TRIGGER_DEFERRED_CANCELED)
12451264
continue;
12461265

12471266
if (ItemPointerGetBlockNumber(ctid)==
1248-
ItemPointerGetBlockNumber(&(previous->dte_newctid))&&
1267+
ItemPointerGetBlockNumber(&(prev->dte_newctid))&&
12491268
ItemPointerGetOffsetNumber(ctid)==
1250-
ItemPointerGetOffsetNumber(&(previous->dte_newctid)))
1251-
returnprevious;
1269+
ItemPointerGetOffsetNumber(&(prev->dte_newctid)))
1270+
previous=prev;
12521271
}
12531272

1254-
elog(ERROR,
1255-
"deferredTriggerGetPreviousEvent: event for tuple %s not found",
1256-
DatumGetCString(DirectFunctionCall1(tidout,PointerGetDatum(ctid))));
1257-
returnNULL;
1273+
if (previous==NULL)
1274+
elog(ERROR,
1275+
"deferredTriggerGetPreviousEvent: event for tuple %s not found",
1276+
DatumGetCString(DirectFunctionCall1(tidout,
1277+
PointerGetDatum(ctid))));
1278+
returnprevious;
12581279
}
12591280

12601281

@@ -1874,6 +1895,11 @@ DeferredTriggerSetState(ConstraintsSetStmt *stmt)
18741895
* DeferredTriggerSaveEvent()
18751896
*
18761897
*Called by ExecAR...Triggers() to add the event to the queue.
1898+
*
1899+
*NOTE: should be called only if we've determined that an event must
1900+
*be added to the queue. We must save *all* events if there is either
1901+
*an UPDATE or a DELETE deferred trigger; see uses of
1902+
*deferredTriggerGetPreviousEvent.
18771903
* ----------
18781904
*/
18791905
staticvoid
@@ -1895,15 +1921,6 @@ DeferredTriggerSaveEvent(Relation rel, int event,
18951921
elog(ERROR,
18961922
"DeferredTriggerSaveEvent() called outside of transaction");
18971923

1898-
/* ----------
1899-
* Check if we're interested in this row at all
1900-
* ----------
1901-
*/
1902-
ntriggers=rel->trigdesc->n_after_row[event];
1903-
if (ntriggers <=0)
1904-
return;
1905-
triggers=rel->trigdesc->tg_after_row[event];
1906-
19071924
/* ----------
19081925
* Get the CTID's of OLD and NEW
19091926
* ----------
@@ -1923,6 +1940,8 @@ DeferredTriggerSaveEvent(Relation rel, int event,
19231940
*/
19241941
oldcxt=MemoryContextSwitchTo(deftrig_cxt);
19251942

1943+
ntriggers=rel->trigdesc->n_after_row[event];
1944+
triggers=rel->trigdesc->tg_after_row[event];
19261945
new_size=sizeof(DeferredTriggerEventData)+
19271946
ntriggers*sizeof(DeferredTriggerEventItem);
19281947

‎src/backend/executor/execMain.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
*
2828
*
2929
* IDENTIFICATION
30-
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.136 2001/01/24 19:42:53 momjian Exp $
30+
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.137 2001/01/27 05:16:58 tgl Exp $
3131
*
3232
*-------------------------------------------------------------------------
3333
*/
@@ -1264,8 +1264,7 @@ ExecAppend(TupleTableSlot *slot,
12641264
ExecInsertIndexTuples(slot,&(tuple->t_self),estate, false);
12651265

12661266
/* AFTER ROW INSERT Triggers */
1267-
if (resultRelationDesc->trigdesc&&
1268-
resultRelationDesc->trigdesc->n_after_row[TRIGGER_EVENT_INSERT]>0)
1267+
if (resultRelationDesc->trigdesc)
12691268
ExecARInsertTriggers(estate,resultRelationDesc,tuple);
12701269
}
12711270

@@ -1351,8 +1350,7 @@ ldelete:;
13511350
*/
13521351

13531352
/* AFTER ROW DELETE Triggers */
1354-
if (resultRelationDesc->trigdesc&&
1355-
resultRelationDesc->trigdesc->n_after_row[TRIGGER_EVENT_DELETE]>0)
1353+
if (resultRelationDesc->trigdesc)
13561354
ExecARDeleteTriggers(estate,tupleid);
13571355
}
13581356

@@ -1491,8 +1489,7 @@ lreplace:;
14911489
ExecInsertIndexTuples(slot,&(tuple->t_self),estate, true);
14921490

14931491
/* AFTER ROW UPDATE Triggers */
1494-
if (resultRelationDesc->trigdesc&&
1495-
resultRelationDesc->trigdesc->n_after_row[TRIGGER_EVENT_UPDATE]>0)
1492+
if (resultRelationDesc->trigdesc)
14961493
ExecARUpdateTriggers(estate,tupleid,tuple);
14971494
}
14981495

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp