Re: Foreign key validation failure in 18beta1
amul sul <sulamul@gmail.com>
From: Amul Sul <sulamul@gmail.com>
To: Alvaro Herrera <alvherre@alvh.no-ip.org>
Cc: jian he <jian.universality@gmail.com>, Tender Wang <tndrwang@gmail.com>, pgsql-hackers@lists.postgresql.org, Antonin Houska <ah@cybertec.at>
Date: 2025-06-03T04:14:18Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Avoid bogus scans of partitions when marking FKs enforced
- e6f98d8848f1 18.0 landed
-
Avoid bogus scans of partitions when validating FKs to partitioned tables
- cc733ed164c5 18.0 landed
-
Allow NOT VALID foreign key constraints on partitioned tables
- b663b9436e75 18.0 cited
Attachments
- v7-0001-Skip-adding-action-based-foreign-key-constraints-.patch (application/x-patch) patch v7-0001
On Mon, Jun 2, 2025 at 9:56 PM Alvaro Herrera <alvherre@alvh.no-ip.org> wrote: > > Hello > > I find this coding somewhat confusing. Now you have a function > "QueueFkConstraintValidation" which may queue a FK queue constraint > validation, if the flag "queueValidation" is given, but it may also do > something else -- makes no sense IMO. I wouldn’t disagree with that. > I think it's better to split this > function in two; one does indeed validate, the other is a simple helper > that only sets the catalog flag, and does its own recursion. This > causes a bit of duplicate code, but is simpler to follow. (We could > also refactor the duplicate code by adding another helper routine, but > I'm not sure it's worth the trouble.) > > I would propose something like this instead, what do you think? > > I found a third approach that requires only a few changes. The key idea is to determine the root referenced table and pass it to QueueFKConstraintValidation(). We would then enqueue phase 3 validation only if the constraint tuple’s confrelid matches that root table -- similar to what is doing in ATExecAlterConstrEnforceability(). This would also ensure that the logic for adding/skipping phase 3 validation is consistent in both places. Adding an extra parameter (i.e., pkrelid) doesn’t seem out of place, as it aligns with other functions in the same file, such as ATExecAlterConstraintInternal() and ATExecAlterConstrEnforceability(). Kindly take a look at the attached version and share your thoughts. Regards, Amul