From a061bdd232ee96302c0af4d4a7f4c0f901262ca9 Mon Sep 17 00:00:00 2001 From: Yasuo Honda Date: Fri, 27 Feb 2026 17:30:04 +0900 Subject: [PATCH] Restore tgdeferrable and tginitdeferred after NOT ENFORCED then ENFORCED --- src/backend/commands/tablecmds.c | 2 ++ src/test/regress/expected/foreign_key.out | 18 ++++++++++++++++++ src/test/regress/sql/foreign_key.sql | 10 ++++++++++ 3 files changed, 30 insertions(+) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index b04b0dbd2a0..bc07dfe2ce8 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -12501,6 +12501,8 @@ ATExecAlterConstrEnforceability(List **wqueue, ATAlterConstraint *cmdcon, fkconstraint->fk_matchtype = currcon->confmatchtype; fkconstraint->fk_upd_action = currcon->confupdtype; fkconstraint->fk_del_action = currcon->confdeltype; + fkconstraint->deferrable = currcon->condeferrable; + fkconstraint->initdeferred = currcon->condeferred; /* Create referenced triggers */ if (currcon->conrelid == fkrelid) diff --git a/src/test/regress/expected/foreign_key.out b/src/test/regress/expected/foreign_key.out index 9ae4dbf1b0a..d061e51da6b 100644 --- a/src/test/regress/expected/foreign_key.out +++ b/src/test/regress/expected/foreign_key.out @@ -1349,6 +1349,24 @@ UPDATE pktable SET id = 10 WHERE id = 5; -- doesn't match PK, but no error. INSERT INTO fktable VALUES (0, 20); ROLLBACK; +-- verify that tgdeferrable/tginitdeferred are preserved after NOT ENFORCED -> ENFORCED +ALTER TABLE FKTABLE ALTER CONSTRAINT fktable_fk_fkey DEFERRABLE INITIALLY DEFERRED; +ALTER TABLE FKTABLE ALTER CONSTRAINT fktable_fk_fkey NOT ENFORCED; +ALTER TABLE FKTABLE ALTER CONSTRAINT fktable_fk_fkey ENFORCED; +SELECT tgdeferrable, tginitdeferred FROM pg_trigger +WHERE tgconstraint = (SELECT oid FROM pg_constraint + WHERE conrelid = 'fktable'::regclass + AND conname = 'fktable_fk_fkey'); + tgdeferrable | tginitdeferred +--------------+---------------- + t | t + t | t + t | t + t | t +(4 rows) + +-- reset +ALTER TABLE FKTABLE ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE; -- try additional syntax ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE; -- illegal options diff --git a/src/test/regress/sql/foreign_key.sql b/src/test/regress/sql/foreign_key.sql index 3b8c95bf893..0afed60f688 100644 --- a/src/test/regress/sql/foreign_key.sql +++ b/src/test/regress/sql/foreign_key.sql @@ -1023,6 +1023,16 @@ UPDATE pktable SET id = 10 WHERE id = 5; INSERT INTO fktable VALUES (0, 20); ROLLBACK; +-- verify that tgdeferrable/tginitdeferred are preserved after NOT ENFORCED -> ENFORCED +ALTER TABLE FKTABLE ALTER CONSTRAINT fktable_fk_fkey DEFERRABLE INITIALLY DEFERRED; +ALTER TABLE FKTABLE ALTER CONSTRAINT fktable_fk_fkey NOT ENFORCED; +ALTER TABLE FKTABLE ALTER CONSTRAINT fktable_fk_fkey ENFORCED; +SELECT tgdeferrable, tginitdeferred FROM pg_trigger +WHERE tgconstraint = (SELECT oid FROM pg_constraint + WHERE conrelid = 'fktable'::regclass + AND conname = 'fktable_fk_fkey'); +-- reset +ALTER TABLE FKTABLE ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE; -- try additional syntax ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE; -- 2.53.0