diff options
Diffstat (limited to 'src/backend/commands/tablecmds.c')
-rw-r--r-- | src/backend/commands/tablecmds.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 7b241fd15da..f82157b62c6 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -6520,13 +6520,6 @@ createForeignKeyTriggers(Relation rel, Constraint *fkconstraint, CommandCounterIncrement(); /* - * Build and execute a CREATE CONSTRAINT TRIGGER statement for the CHECK - * action for both INSERTs and UPDATEs on the referencing table. - */ - CreateFKCheckTrigger(myRel, fkconstraint, constraintOid, indexOid, true); - CreateFKCheckTrigger(myRel, fkconstraint, constraintOid, indexOid, false); - - /* * Build and execute a CREATE CONSTRAINT TRIGGER statement for the ON * DELETE action on the referenced table. */ @@ -6628,6 +6621,27 @@ createForeignKeyTriggers(Relation rel, Constraint *fkconstraint, fk_trigger->args = NIL; (void) CreateTrigger(fk_trigger, NULL, constraintOid, indexOid, true); + + /* Make changes-so-far visible */ + CommandCounterIncrement(); + + /* + * Build and execute CREATE CONSTRAINT TRIGGER statements for the CHECK + * action for both INSERTs and UPDATEs on the referencing table. + * + * Note: for a self-referential FK (referencing and referenced tables are + * the same), it is important that the ON UPDATE action fires before the + * CHECK action, since both triggers will fire on the same row during an + * UPDATE event; otherwise the CHECK trigger will be checking a non-final + * state of the row. Because triggers fire in name order, we are + * effectively relying on the OIDs of the triggers to sort correctly as + * text. This will work except when the OID counter wraps around or adds + * a digit, eg "99999" sorts after "100000". That is infrequent enough, + * and the use of self-referential FKs is rare enough, that we live with + * it for now. There will be a real fix in PG 9.2. + */ + CreateFKCheckTrigger(myRel, fkconstraint, constraintOid, indexOid, true); + CreateFKCheckTrigger(myRel, fkconstraint, constraintOid, indexOid, false); } /* |