Re: alter check constraint enforceability - Mailing list pgsql-hackers

From Amul Sul
Subject Re: alter check constraint enforceability
Date
Msg-id CAAJ_b975gj8d8djaSxNBcJ+X3Wd_9of-Q3uZm=63SepUiH=2ZQ@mail.gmail.com
Whole thread Raw
In response to Re: alter check constraint enforceability  (jian he <jian.universality@gmail.com>)
List pgsql-hackers
On Thu, Dec 4, 2025 at 12:22 PM jian he <jian.universality@gmail.com> wrote:
>
> On Fri, Nov 7, 2025 at 7:29 AM Robert Treat <rob@xzilla.net> wrote:
> >

The v4 patch is quite good. Here are a few comments/suggestions for
the cosmetic fixes:

+      created. Currently <literal>FOREIGN KEY</literal> and
+      <literal>CHECK</literal> constraints may be altered in this
fashion, but see below.

Although documents may not strictly follow an 80-column length
restriction all the places, it is better to adhere to it as much as possible.
--

+               errhint("Only foreign key and check constraints can
change enforceability"));

Missing a full stop (.) at the end.
--

+   /*
+    * parent relation already locked by called, children will be locked by
+    * find_all_inheritors. So NoLock is fine here.
+    */
+   rel = table_open(currcon->conrelid, NoLock);
+   if (currcon->conenforced != cmdcon->is_enforced)
+   {

Add a newline between these.  Also, start comment with capital letter:
s/parent/Parent
--

-static bool ATExecAlterConstrEnforceability(List **wqueue,
...
+static bool ATExecAlterFKConstrEnforceability(List **wqueue,

I suggest the renaming patch be separated.
--

- * Currently only works for Foreign Key and not null constraints.
+ * Currently works for Foreign Key, CHECK, and not null constraints.

Not consistent naming format, should be: s/CHECK/Check.
--

+   if (cmdcon->alterEnforceability)
+   {
+       if (currcon->contype == CONSTRAINT_FOREIGN)
+       {
+           ATExecAlterFKConstrEnforceability(wqueue, cmdcon, conrel, tgrel,
+                                             currcon->conrelid,
currcon->confrelid,
+                                             contuple, lockmode, InvalidOid,
+                                             InvalidOid, InvalidOid,
InvalidOid);
+           changed = true;
+       }
+       else if (currcon->contype == CONSTRAINT_CHECK)
+       {
+           ATExecAlterCheckConstrEnforceability(wqueue, cmdcon,
conrel, contuple,
+                                                recurse, false, lockmode);
+           changed = true;
+       }
+   }

Don't need inner curly braces; set changed = true; once for both.
--

+ * conrel is the pg_constraint catalog relation.

Not sure why we need to mention conrel here only?
--

+   if (!cmdcon->is_enforced || changed)
+   {

The reason for recursing for the non-enforced constraint (like the FK
constraint) is mentioned in the function prolog. However, since two
conditions are involved here, I was initially confused about the
change. Could you please add a short comment explaining why we enter
for the not-enforced constraint irrespective of whether it was changed
or not, or simply move the relevant note from the prolog here?
--

+static void
+AlterCheckConstrEnforceabilityRecurse(List **wqueue, ATAlterConstraint *cmdcon,
+                                     Relation conrel, Oid conrelid,
+                                     bool recurse, bool recursing,
+                                     LOCKMODE lockmode)
+{

Kindly add a prolog comment.

Regards,
Amul



pgsql-hackers by date:

Previous
From: Jakub Wartak
Date:
Subject: 64-bit wait_event and introduction of 32-bit wait_event_arg
Next
From: Álvaro Herrera
Date:
Subject: Re: Issues with ON CONFLICT UPDATE and REINDEX CONCURRENTLY