mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Changed execution time of ON <event> RESTRICT referential
integrity triggers to after statement allways. Ignores deferred state now, closer to SQL3 semantics. Jan
This commit is contained in:
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.61 2000/02/18 09:29:37 inoue Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.62 2000/02/29 12:28:24 wieck Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -1643,10 +1643,14 @@ DeferredTriggerSetState(ConstraintsSetStmt *stmt)
|
|||||||
|
|
||||||
/* ----------
|
/* ----------
|
||||||
* If we found some, check that they fit the deferrability
|
* If we found some, check that they fit the deferrability
|
||||||
|
* but skip ON <event> RESTRICT ones, since they are silently
|
||||||
|
* never deferrable.
|
||||||
* ----------
|
* ----------
|
||||||
*/
|
*/
|
||||||
pg_trigger = (Form_pg_trigger) GETSTRUCT(htup);
|
pg_trigger = (Form_pg_trigger) GETSTRUCT(htup);
|
||||||
if (stmt->deferred & !pg_trigger->tgdeferrable)
|
if (stmt->deferred && !pg_trigger->tgdeferrable &&
|
||||||
|
pg_trigger->tgfoid != F_RI_FKEY_RESTRICT_UPD &&
|
||||||
|
pg_trigger->tgfoid != F_RI_FKEY_RESTRICT_DEL)
|
||||||
elog(ERROR, "Constraint '%s' is not deferrable",
|
elog(ERROR, "Constraint '%s' is not deferrable",
|
||||||
(char *)lfirst(l));
|
(char *)lfirst(l));
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: analyze.c,v 1.137 2000/02/15 03:37:47 thomas Exp $
|
* $Id: analyze.c,v 1.138 2000/02/29 12:28:25 wieck Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -1061,6 +1061,18 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
|
|||||||
fk_trigger = (CreateTrigStmt *)makeNode(CreateTrigStmt);
|
fk_trigger = (CreateTrigStmt *)makeNode(CreateTrigStmt);
|
||||||
fk_trigger->trigname = fkconstraint->constr_name;
|
fk_trigger->trigname = fkconstraint->constr_name;
|
||||||
fk_trigger->relname = fkconstraint->pktable_name;
|
fk_trigger->relname = fkconstraint->pktable_name;
|
||||||
|
fk_trigger->before = false;
|
||||||
|
fk_trigger->row = true;
|
||||||
|
fk_trigger->actions[0] = 'd';
|
||||||
|
fk_trigger->actions[1] = '\0';
|
||||||
|
fk_trigger->lang = NULL;
|
||||||
|
fk_trigger->text = NULL;
|
||||||
|
fk_trigger->attr = NIL;
|
||||||
|
fk_trigger->when = NULL;
|
||||||
|
fk_trigger->isconstraint = true;
|
||||||
|
fk_trigger->deferrable = fkconstraint->deferrable;
|
||||||
|
fk_trigger->initdeferred = fkconstraint->initdeferred;
|
||||||
|
fk_trigger->constrrelname = stmt->relname;
|
||||||
switch ((fkconstraint->actions & FKCONSTR_ON_DELETE_MASK)
|
switch ((fkconstraint->actions & FKCONSTR_ON_DELETE_MASK)
|
||||||
>> FKCONSTR_ON_DELETE_SHIFT)
|
>> FKCONSTR_ON_DELETE_SHIFT)
|
||||||
{
|
{
|
||||||
@ -1068,7 +1080,9 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
|
|||||||
fk_trigger->funcname = "RI_FKey_noaction_del";
|
fk_trigger->funcname = "RI_FKey_noaction_del";
|
||||||
break;
|
break;
|
||||||
case FKCONSTR_ON_KEY_RESTRICT:
|
case FKCONSTR_ON_KEY_RESTRICT:
|
||||||
fk_trigger->funcname = "RI_FKey_restrict_del";
|
fk_trigger->deferrable = false;
|
||||||
|
fk_trigger->initdeferred = false;
|
||||||
|
fk_trigger->funcname = "RI_FKey_restrict_del";
|
||||||
break;
|
break;
|
||||||
case FKCONSTR_ON_KEY_CASCADE:
|
case FKCONSTR_ON_KEY_CASCADE:
|
||||||
fk_trigger->funcname = "RI_FKey_cascade_del";
|
fk_trigger->funcname = "RI_FKey_cascade_del";
|
||||||
@ -1083,18 +1097,6 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
|
|||||||
elog(ERROR, "Only one ON DELETE action can be specified for FOREIGN KEY constraint");
|
elog(ERROR, "Only one ON DELETE action can be specified for FOREIGN KEY constraint");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fk_trigger->before = false;
|
|
||||||
fk_trigger->row = true;
|
|
||||||
fk_trigger->actions[0] = 'd';
|
|
||||||
fk_trigger->actions[1] = '\0';
|
|
||||||
fk_trigger->lang = NULL;
|
|
||||||
fk_trigger->text = NULL;
|
|
||||||
fk_trigger->attr = NIL;
|
|
||||||
fk_trigger->when = NULL;
|
|
||||||
fk_trigger->isconstraint = true;
|
|
||||||
fk_trigger->deferrable = fkconstraint->deferrable;
|
|
||||||
fk_trigger->initdeferred = fkconstraint->initdeferred;
|
|
||||||
fk_trigger->constrrelname = stmt->relname;
|
|
||||||
|
|
||||||
fk_trigger->args = NIL;
|
fk_trigger->args = NIL;
|
||||||
fk_trigger->args = lappend(fk_trigger->args,
|
fk_trigger->args = lappend(fk_trigger->args,
|
||||||
@ -1129,6 +1131,18 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
|
|||||||
fk_trigger = (CreateTrigStmt *)makeNode(CreateTrigStmt);
|
fk_trigger = (CreateTrigStmt *)makeNode(CreateTrigStmt);
|
||||||
fk_trigger->trigname = fkconstraint->constr_name;
|
fk_trigger->trigname = fkconstraint->constr_name;
|
||||||
fk_trigger->relname = fkconstraint->pktable_name;
|
fk_trigger->relname = fkconstraint->pktable_name;
|
||||||
|
fk_trigger->before = false;
|
||||||
|
fk_trigger->row = true;
|
||||||
|
fk_trigger->actions[0] = 'u';
|
||||||
|
fk_trigger->actions[1] = '\0';
|
||||||
|
fk_trigger->lang = NULL;
|
||||||
|
fk_trigger->text = NULL;
|
||||||
|
fk_trigger->attr = NIL;
|
||||||
|
fk_trigger->when = NULL;
|
||||||
|
fk_trigger->isconstraint = true;
|
||||||
|
fk_trigger->deferrable = fkconstraint->deferrable;
|
||||||
|
fk_trigger->initdeferred = fkconstraint->initdeferred;
|
||||||
|
fk_trigger->constrrelname = stmt->relname;
|
||||||
switch ((fkconstraint->actions & FKCONSTR_ON_UPDATE_MASK)
|
switch ((fkconstraint->actions & FKCONSTR_ON_UPDATE_MASK)
|
||||||
>> FKCONSTR_ON_UPDATE_SHIFT)
|
>> FKCONSTR_ON_UPDATE_SHIFT)
|
||||||
{
|
{
|
||||||
@ -1136,7 +1150,9 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
|
|||||||
fk_trigger->funcname = "RI_FKey_noaction_upd";
|
fk_trigger->funcname = "RI_FKey_noaction_upd";
|
||||||
break;
|
break;
|
||||||
case FKCONSTR_ON_KEY_RESTRICT:
|
case FKCONSTR_ON_KEY_RESTRICT:
|
||||||
fk_trigger->funcname = "RI_FKey_restrict_upd";
|
fk_trigger->deferrable = false;
|
||||||
|
fk_trigger->initdeferred = false;
|
||||||
|
fk_trigger->funcname = "RI_FKey_restrict_upd";
|
||||||
break;
|
break;
|
||||||
case FKCONSTR_ON_KEY_CASCADE:
|
case FKCONSTR_ON_KEY_CASCADE:
|
||||||
fk_trigger->funcname = "RI_FKey_cascade_upd";
|
fk_trigger->funcname = "RI_FKey_cascade_upd";
|
||||||
@ -1151,18 +1167,6 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
|
|||||||
elog(ERROR, "Only one ON UPDATE action can be specified for FOREIGN KEY constraint");
|
elog(ERROR, "Only one ON UPDATE action can be specified for FOREIGN KEY constraint");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fk_trigger->before = false;
|
|
||||||
fk_trigger->row = true;
|
|
||||||
fk_trigger->actions[0] = 'u';
|
|
||||||
fk_trigger->actions[1] = '\0';
|
|
||||||
fk_trigger->lang = NULL;
|
|
||||||
fk_trigger->text = NULL;
|
|
||||||
fk_trigger->attr = NIL;
|
|
||||||
fk_trigger->when = NULL;
|
|
||||||
fk_trigger->isconstraint = true;
|
|
||||||
fk_trigger->deferrable = fkconstraint->deferrable;
|
|
||||||
fk_trigger->initdeferred = fkconstraint->initdeferred;
|
|
||||||
fk_trigger->constrrelname = stmt->relname;
|
|
||||||
|
|
||||||
fk_trigger->args = NIL;
|
fk_trigger->args = NIL;
|
||||||
fk_trigger->args = lappend(fk_trigger->args,
|
fk_trigger->args = lappend(fk_trigger->args,
|
||||||
|
Reference in New Issue
Block a user