Re: NOT ENFORCED constraint feature

From: Amul Sul <sulamul(at)gmail(dot)com>
To: jian he <jian(dot)universality(at)gmail(dot)com>
Cc: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, Peter Eisentraut <peter(at)eisentraut(dot)org>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Joel Jacobson <joel(at)compiler(dot)org>
Subject: Re: NOT ENFORCED constraint feature
Date: 2024-12-10 11:47:25
Message-ID: CAAJ_b96VxkJNb-5j+tHd0w3RqBzOER5hsB6frYPHs1-szxG0UA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Tue, Dec 10, 2024 at 1:21 PM jian he <jian(dot)universality(at)gmail(dot)com> wrote:
>
> hi. some minor issue about v7-0001.
>
> there are 5 appearances of "sizeof(CookedConstraint)"
> to make it safe, it would be nice to manual do
> `
> cooked->is_enforced = true;
> `
> for other kinds of constraints.
>

I am not sure if it's necessary, but it doesn't seem like a bad idea,
did the same in the attached version.

>
> static bool
> MergeWithExistingConstraint(Relation rel, const char *ccname, Node *expr,
> bool allow_merge, bool is_local,
> + bool is_enforced,
> bool is_initially_valid,
> bool is_no_inherit)
> {
> @@ -2729,12 +2738,24 @@ MergeWithExistingConstraint(Relation rel,
> const char *ccname, Node *expr,
> * If the child constraint is "not valid" then cannot merge with a
> * valid parent constraint.
> */
> - if (is_initially_valid && !con->convalidated)
> + if (is_initially_valid && con->conenforced && !con->convalidated)
> ereport(ERROR,
> (errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
> errmsg("constraint \"%s\" conflicts with NOT VALID constraint on
> relation \"%s\"",
> ccname, RelationGetRelationName(rel))));
>
> There are no tests for this change. I think this change is not necessary.
>

It is necessary; otherwise, it would raise an error for a NOT ENFORCED
constraint, which is NOT VALID by default.

>
> - a/src/test/regress/expected/alter_table.out
> +++ b/src/test/regress/expected/alter_table.out
> ...
> +ALTER TABLE attmp3 VALIDATE CONSTRAINT b_greater_than_ten_not_enforced; -- fail
> +ERROR: cannot validated NOT ENFORCED constraint
>
> there should be
> ERROR: cannot validate NOT ENFORCED constraint
> ?
>

Are you sure you're looking at the latest patch? The error string is
already the same as you suggested.

> Do we need to update create_foreign_table.sgml
> and alter_foreign_table.sgml?

Yes, I think we just need to add the syntax; a description isn't
necessary, imo, since constraints on foreign constraints are never
enforced.

Regards,
Amul

Attachment Content-Type Size
v8-0001-Add-support-for-NOT-ENFORCED-in-CHECK-constraints.patch application/octet-stream 76.4 KB
v8-0002-refactor-split-ATExecAlterConstrRecurse.patch application/octet-stream 8.3 KB
v8-0003-refactor-Change-ATExecAlterConstrRecurse-argument.patch application/octet-stream 6.2 KB
v8-0004-Remove-hastriggers-flag-check-before-fetching-FK-.patch application/octet-stream 10.8 KB
v8-0005-WIP-Add-support-for-NOT-ENFORCED-in-foreign-key-c.patch application/octet-stream 58.3 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Shubham Khanna 2024-12-10 11:49:33 Re: Adding a '--two-phase' option to 'pg_createsubscriber' utility.
Previous Message Shubham Khanna 2024-12-10 11:47:06 Re: Adding a '--two-phase' option to 'pg_createsubscriber' utility.