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

Commitb1e4b56

Browse files
Jan WieckJan Wieck
Jan Wieck
authored and
Jan Wieck
committed
Changed execution time of ON <event> RESTRICT referential
integrity triggers to after statement allways. Ignoresdeferred state now, closer to SQL3 semantics.Jan
1 parentf55624a commitb1e4b56

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
caseFKCONSTR_ON_KEY_NOACTION:
10681080
fk_trigger->funcname="RI_FKey_noaction_del";
10691081
break;
10701082
caseFKCONSTR_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
caseFKCONSTR_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
caseFKCONSTR_ON_KEY_NOACTION:
11361150
fk_trigger->funcname="RI_FKey_noaction_upd";
11371151
break;
11381152
caseFKCONSTR_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
caseFKCONSTR_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)

[8]ページ先頭

©2009-2025 Movatter.jp