77 * Portions Copyright (c) 1994, Regents of the University of California
88 *
99 * IDENTIFICATION
10- * $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.170 2004/09/07 21:48:30 tgl Exp $
10+ * $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.171 2004/09/08 23:47:58 tgl Exp $
1111 *
1212 *-------------------------------------------------------------------------
1313 */
@@ -1772,7 +1772,7 @@ static DeferredTriggerState DeferredTriggerStateAddItem(DeferredTriggerState sta
17721772static bool
17731773deferredTriggerCheckState (Oid tgoid , int32 itemstate )
17741774{
1775- bool tgisdeferred ;
1775+ DeferredTriggerState state = deferredTriggers -> state ;
17761776 int i ;
17771777
17781778 /*
@@ -1783,32 +1783,24 @@ deferredTriggerCheckState(Oid tgoid, int32 itemstate)
17831783 return false;
17841784
17851785 /*
1786- * Lookup if we know an individual state for this trigger
1786+ * Check if SET CONSTRAINTS has been executed for this specific trigger.
17871787 */
1788- for (i = 0 ; i < deferredTriggers -> state -> numstates ; i ++ )
1788+ for (i = 0 ; i < state -> numstates ; i ++ )
17891789 {
1790- if (deferredTriggers -> state -> trigstates [i ].dts_tgoid == tgoid )
1791- return deferredTriggers -> state -> trigstates [i ].dts_tgisdeferred ;
1790+ if (state -> trigstates [i ].dts_tgoid == tgoid )
1791+ return state -> trigstates [i ].dts_tgisdeferred ;
17921792 }
17931793
17941794 /*
1795- * No individual state known - so if the user issued a SET CONSTRAINT
1796- * ALL ..., we return that instead of the triggers default state.
1795+ * Check if SET CONSTRAINTS ALL has been executed; if so use that.
17971796 */
1798- if (deferredTriggers -> state -> all_isset )
1799- return deferredTriggers -> state -> all_isdeferred ;
1797+ if (state -> all_isset )
1798+ return state -> all_isdeferred ;
18001799
18011800 /*
1802- * No ALL state known either, remember the default state as the
1803- * current and return that. (XXX why do we bother making a state
1804- * entry?)
1801+ * Otherwise return the default state for the trigger.
18051802 */
1806- tgisdeferred = ((itemstate & TRIGGER_DEFERRED_INITDEFERRED ) != 0 );
1807- deferredTriggers -> state =
1808- DeferredTriggerStateAddItem (deferredTriggers -> state ,
1809- tgoid , tgisdeferred );
1810-
1811- return tgisdeferred ;
1803+ return ((itemstate & TRIGGER_DEFERRED_INITDEFERRED ) != 0 );
18121804}
18131805
18141806
@@ -2486,8 +2478,7 @@ DeferredTriggerSetState(ConstraintsSetStmt *stmt)
24862478 if (stmt -> constraints == NIL )
24872479 {
24882480 /*
2489- * Drop all per-transaction information about individual trigger
2490- * states.
2481+ * Forget any previous SET CONSTRAINTS commands in this transaction.
24912482 */
24922483 deferredTriggers -> state -> numstates = 0 ;
24932484
@@ -2545,23 +2536,22 @@ DeferredTriggerSetState(ConstraintsSetStmt *stmt)
25452536 while (HeapTupleIsValid (htup = systable_getnext (tgscan )))
25462537 {
25472538 Form_pg_trigger pg_trigger = (Form_pg_trigger ) GETSTRUCT (htup );
2548- Oid constr_oid ;
25492539
25502540 /*
25512541 * If we found some, check that they fit the deferrability
25522542 * but skip ON <event> RESTRICT ones, since they are
25532543 * silently never deferrable.
25542544 */
2555- if (stmt -> deferred && !pg_trigger -> tgdeferrable &&
2556- pg_trigger -> tgfoid != F_RI_FKEY_RESTRICT_UPD &&
2545+ if (pg_trigger -> tgfoid != F_RI_FKEY_RESTRICT_UPD &&
25572546 pg_trigger -> tgfoid != F_RI_FKEY_RESTRICT_DEL )
2558- ereport (ERROR ,
2559- (errcode (ERRCODE_WRONG_OBJECT_TYPE ),
2560- errmsg ("constraint \"%s\" is not deferrable" ,
2561- cname )));
2562-
2563- constr_oid = HeapTupleGetOid (htup );
2564- oidlist = lappend_oid (oidlist , constr_oid );
2547+ {
2548+ if (stmt -> deferred && !pg_trigger -> tgdeferrable )
2549+ ereport (ERROR ,
2550+ (errcode (ERRCODE_WRONG_OBJECT_TYPE ),
2551+ errmsg ("constraint \"%s\" is not deferrable" ,
2552+ cname )));
2553+ oidlist = lappend_oid (oidlist , HeapTupleGetOid (htup ));
2554+ }
25652555 found = true;
25662556 }
25672557
@@ -2573,7 +2563,8 @@ DeferredTriggerSetState(ConstraintsSetStmt *stmt)
25732563 if (!found )
25742564 ereport (ERROR ,
25752565 (errcode (ERRCODE_UNDEFINED_OBJECT ),
2576- errmsg ("constraint \"%s\" does not exist" , cname )));
2566+ errmsg ("constraint \"%s\" does not exist" ,
2567+ cname )));
25772568 }
25782569 heap_close (tgrel , AccessShareLock );
25792570
@@ -2584,23 +2575,23 @@ DeferredTriggerSetState(ConstraintsSetStmt *stmt)
25842575 foreach (l , oidlist )
25852576 {
25862577 Oid tgoid = lfirst_oid (l );
2578+ DeferredTriggerState state = deferredTriggers -> state ;
25872579 bool found = false;
25882580 int i ;
25892581
2590- for (i = 0 ; i < deferredTriggers -> state -> numstates ; i ++ )
2582+ for (i = 0 ; i < state -> numstates ; i ++ )
25912583 {
2592- if (deferredTriggers -> state -> trigstates [i ].dts_tgoid == tgoid )
2584+ if (state -> trigstates [i ].dts_tgoid == tgoid )
25932585 {
2594- deferredTriggers -> state -> trigstates [i ].dts_tgisdeferred = stmt -> deferred ;
2586+ state -> trigstates [i ].dts_tgisdeferred = stmt -> deferred ;
25952587 found = true;
25962588 break ;
25972589 }
25982590 }
25992591 if (!found )
26002592 {
26012593 deferredTriggers -> state =
2602- DeferredTriggerStateAddItem (deferredTriggers -> state ,
2603- tgoid , stmt -> deferred );
2594+ DeferredTriggerStateAddItem (state , tgoid , stmt -> deferred );
26042595 }
26052596 }
26062597 }
0 commit comments