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

Commitc77bc13

Browse files
committed
This trivial patch implements disabled, deferred triggers, per my
proposal on -hackers a couple days ago. The 'tgenabled' status of thetrigger is consulted when the trigger is added to the deferred queue(i.e. when the event occurs that fires the trigger), not when thedeferred event is executed.No regression tests, as another bug prevents them (the pg_trigger rowfor a trigger is only loaded once per session, so any changes to it arenot noticed unless the client disconnects and reconnects).Neil Conway
1 parentc9967a4 commitc77bc13

File tree

1 file changed

+31
-4
lines changed

1 file changed

+31
-4
lines changed

‎src/backend/commands/trigger.c

Lines changed: 31 additions & 4 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.142 2002/12/15 21:01:34 tgl Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.143 2003/01/08 22:28:32 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -1456,7 +1456,9 @@ ExecBRUpdateTriggers(EState *estate, ResultRelInfo *relinfo,
14561456
palloc0(trigdesc->numtriggers*sizeof(FmgrInfo));
14571457

14581458
LocTriggerData.type=T_TriggerData;
1459-
LocTriggerData.tg_event=TRIGGER_EVENT_UPDATE |TRIGGER_EVENT_ROW |TRIGGER_EVENT_BEFORE;
1459+
LocTriggerData.tg_event=TRIGGER_EVENT_UPDATE |
1460+
TRIGGER_EVENT_ROW |
1461+
TRIGGER_EVENT_BEFORE;
14601462
LocTriggerData.tg_relation=relinfo->ri_RelationDesc;
14611463
for (i=0;i<ntrigs;i++)
14621464
{
@@ -2323,6 +2325,7 @@ DeferredTriggerSaveEvent(ResultRelInfo *relinfo, int event, bool row_trigger,
23232325
intnew_size;
23242326
inti;
23252327
intntriggers;
2328+
intn_enabled_triggers=0;
23262329
int*tgindx;
23272330
ItemPointerDataoldctid;
23282331
ItemPointerDatanewctid;
@@ -2359,8 +2362,28 @@ DeferredTriggerSaveEvent(ResultRelInfo *relinfo, int event, bool row_trigger,
23592362
tgindx=trigdesc->tg_after_statement[event];
23602363
}
23612364

2365+
/*
2366+
* Count the number of triggers that are actually enabled. Since we
2367+
* only add enabled triggers to the queue, we only need allocate
2368+
* enough space to hold them (and not any disabled triggers that may
2369+
* be associated with the relation).
2370+
*/
2371+
for (i=0;i<ntriggers;i++)
2372+
{
2373+
Trigger*trigger=&trigdesc->triggers[tgindx[i]];
2374+
2375+
if (trigger->tgenabled)
2376+
n_enabled_triggers++;
2377+
}
2378+
2379+
/*
2380+
* If all the triggers on this relation are disabled, we're done.
2381+
*/
2382+
if (n_enabled_triggers==0)
2383+
return;
2384+
23622385
new_size= offsetof(DeferredTriggerEventData,dte_item[0])+
2363-
ntriggers*sizeof(DeferredTriggerEventItem);
2386+
n_enabled_triggers*sizeof(DeferredTriggerEventItem);
23642387

23652388
new_event= (DeferredTriggerEvent)palloc(new_size);
23662389
new_event->dte_next=NULL;
@@ -2373,9 +2396,13 @@ DeferredTriggerSaveEvent(ResultRelInfo *relinfo, int event, bool row_trigger,
23732396
new_event->dte_n_items=ntriggers;
23742397
for (i=0;i<ntriggers;i++)
23752398
{
2399+
DeferredTriggerEventItem*ev_item;
23762400
Trigger*trigger=&trigdesc->triggers[tgindx[i]];
2377-
DeferredTriggerEventItem*ev_item=&(new_event->dte_item[i]);
23782401

2402+
if (!trigger->tgenabled)
2403+
continue;
2404+
2405+
ev_item=&(new_event->dte_item[i]);
23792406
ev_item->dti_tgoid=trigger->tgoid;
23802407
ev_item->dti_state=
23812408
((trigger->tgdeferrable) ?

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp