Skip to content

Commit b1e4b56

Browse files
Jan WieckJan Wieck
authored andcommitted
Changed execution time of ON <event> RESTRICT referential
integrity triggers to after statement allways. Ignores deferred state now, closer to SQL3 semantics. Jan
1 parent f55624a commit b1e4b56

File tree

2 files changed

+37
-29
lines changed

2 files changed

+37
-29
lines changed

src/backend/commands/trigger.c

Lines changed: 6 additions & 2 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.61 2000/02/18 09:29:37 inoue Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.62 2000/02/29 12:28:24 wieck Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -1643,10 +1643,14 @@ DeferredTriggerSetState(ConstraintsSetStmt *stmt)
16431643

16441644
/* ----------
16451645
* If we found some, check that they fit the deferrability
1646+
* but skip ON <event> RESTRICT ones, since they are silently
1647+
* never deferrable.
16461648
* ----------
16471649
*/
16481650
pg_trigger = (Form_pg_trigger) GETSTRUCT(htup);
1649-
if (stmt->deferred & !pg_trigger->tgdeferrable)
1651+
if (stmt->deferred && !pg_trigger->tgdeferrable &&
1652+
pg_trigger->tgfoid != F_RI_FKEY_RESTRICT_UPD &&
1653+
pg_trigger->tgfoid != F_RI_FKEY_RESTRICT_DEL)
16501654
elog(ERROR, "Constraint '%s' is not deferrable",
16511655
(char *)lfirst(l));
16521656

src/backend/parser/analyze.c

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
9-
* $Id: analyze.c,v 1.137 2000/02/15 03:37:47 thomas Exp $
9+
* $Id: analyze.c,v 1.138 2000/02/29 12:28:25 wieck Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -1061,14 +1061,28 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
10611061
fk_trigger = (CreateTrigStmt *)makeNode(CreateTrigStmt);
10621062
fk_trigger->trigname = fkconstraint->constr_name;
10631063
fk_trigger->relname = fkconstraint->pktable_name;
1064+
fk_trigger->before = false;
1065+
fk_trigger->row = true;
1066+
fk_trigger->actions[0] = 'd';
1067+
fk_trigger->actions[1] = '\0';
1068+
fk_trigger->lang = NULL;
1069+
fk_trigger->text = NULL;
1070+
fk_trigger->attr = NIL;
1071+
fk_trigger->when = NULL;
1072+
fk_trigger->isconstraint = true;
1073+
fk_trigger->deferrable = fkconstraint->deferrable;
1074+
fk_trigger->initdeferred = fkconstraint->initdeferred;
1075+
fk_trigger->constrrelname = stmt->relname;
10641076
switch ((fkconstraint->actions & FKCONSTR_ON_DELETE_MASK)
10651077
>> FKCONSTR_ON_DELETE_SHIFT)
10661078
{
10671079
case FKCONSTR_ON_KEY_NOACTION:
10681080
fk_trigger->funcname = "RI_FKey_noaction_del";
10691081
break;
10701082
case FKCONSTR_ON_KEY_RESTRICT:
1071-
fk_trigger->funcname = "RI_FKey_restrict_del";
1083+
fk_trigger->deferrable = false;
1084+
fk_trigger->initdeferred = false;
1085+
fk_trigger->funcname = "RI_FKey_restrict_del";
10721086
break;
10731087
case FKCONSTR_ON_KEY_CASCADE:
10741088
fk_trigger->funcname = "RI_FKey_cascade_del";
@@ -1083,18 +1097,6 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
10831097
elog(ERROR, "Only one ON DELETE action can be specified for FOREIGN KEY constraint");
10841098
break;
10851099
}
1086-
fk_trigger->before = false;
1087-
fk_trigger->row = true;
1088-
fk_trigger->actions[0] = 'd';
1089-
fk_trigger->actions[1] = '\0';
1090-
fk_trigger->lang = NULL;
1091-
fk_trigger->text = NULL;
1092-
fk_trigger->attr = NIL;
1093-
fk_trigger->when = NULL;
1094-
fk_trigger->isconstraint = true;
1095-
fk_trigger->deferrable = fkconstraint->deferrable;
1096-
fk_trigger->initdeferred = fkconstraint->initdeferred;
1097-
fk_trigger->constrrelname = stmt->relname;
10981100

10991101
fk_trigger->args = NIL;
11001102
fk_trigger->args = lappend(fk_trigger->args,
@@ -1129,14 +1131,28 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
11291131
fk_trigger = (CreateTrigStmt *)makeNode(CreateTrigStmt);
11301132
fk_trigger->trigname = fkconstraint->constr_name;
11311133
fk_trigger->relname = fkconstraint->pktable_name;
1134+
fk_trigger->before = false;
1135+
fk_trigger->row = true;
1136+
fk_trigger->actions[0] = 'u';
1137+
fk_trigger->actions[1] = '\0';
1138+
fk_trigger->lang = NULL;
1139+
fk_trigger->text = NULL;
1140+
fk_trigger->attr = NIL;
1141+
fk_trigger->when = NULL;
1142+
fk_trigger->isconstraint = true;
1143+
fk_trigger->deferrable = fkconstraint->deferrable;
1144+
fk_trigger->initdeferred = fkconstraint->initdeferred;
1145+
fk_trigger->constrrelname = stmt->relname;
11321146
switch ((fkconstraint->actions & FKCONSTR_ON_UPDATE_MASK)
11331147
>> FKCONSTR_ON_UPDATE_SHIFT)
11341148
{
11351149
case FKCONSTR_ON_KEY_NOACTION:
11361150
fk_trigger->funcname = "RI_FKey_noaction_upd";
11371151
break;
11381152
case FKCONSTR_ON_KEY_RESTRICT:
1139-
fk_trigger->funcname = "RI_FKey_restrict_upd";
1153+
fk_trigger->deferrable = false;
1154+
fk_trigger->initdeferred = false;
1155+
fk_trigger->funcname = "RI_FKey_restrict_upd";
11401156
break;
11411157
case FKCONSTR_ON_KEY_CASCADE:
11421158
fk_trigger->funcname = "RI_FKey_cascade_upd";
@@ -1151,18 +1167,6 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
11511167
elog(ERROR, "Only one ON UPDATE action can be specified for FOREIGN KEY constraint");
11521168
break;
11531169
}
1154-
fk_trigger->before = false;
1155-
fk_trigger->row = true;
1156-
fk_trigger->actions[0] = 'u';
1157-
fk_trigger->actions[1] = '\0';
1158-
fk_trigger->lang = NULL;
1159-
fk_trigger->text = NULL;
1160-
fk_trigger->attr = NIL;
1161-
fk_trigger->when = NULL;
1162-
fk_trigger->isconstraint = true;
1163-
fk_trigger->deferrable = fkconstraint->deferrable;
1164-
fk_trigger->initdeferred = fkconstraint->initdeferred;
1165-
fk_trigger->constrrelname = stmt->relname;
11661170

11671171
fk_trigger->args = NIL;
11681172
fk_trigger->args = lappend(fk_trigger->args,

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy