Re: Support NOT VALID / VALIDATE constraint options for named NOT NULL constraints

From: Rushabh Lathia <rushabh(dot)lathia(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Support NOT VALID / VALIDATE constraint options for named NOT NULL constraints
Date: 2025-02-09 12:25:23
Message-ID: CAGPqQf0S3BS+pRuw-3_6Ucwo+1qMFg3iRQ-ZcSFeVi2fB6TBPQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Thanks Alvaro.

On Thu, Feb 6, 2025 at 9:58 PM Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
wrote:

> Hello Rushabh,
>
> On 2025-Feb-06, Rushabh Lathia wrote:
>
> > Commit 14e87ffa5c543b5f30ead7413084c25f7735039f
> > <
> https://github.com/postgres/postgres/commit/14e87ffa5c543b5f30ead7413084c25f7735039f
> >
> > added the support for named NOT NULL constraints. We can now support
> > the NOT VALID/VALID named NOT NULL constraints.
> >
> > This patch supports the NOT VALID and VALIDATE CONSTRAINT for name NOT
> > NULL constraints. In order to achieve this patch,
>
> Thank you very much for working on this.
>
> > 1) Converted the pg_attribute.attnotnull to CHAR type, so that it can
> > hold the INVALID flag for the constraint.
>
> This looks good to me. It'll have implications for client-side queries,
> but I think they will need to adapt. One school of thought says we
> should rename the column, so that every tool is forced to think about
> the issue and adapt accordingly, instead of only realizing the problem
> the first time they break.
>

I am open to suggestions here.

>
> > 4) Added related testcases.
>
> Please remember to add test cases for tables with not-valid constraint
> that are not dropped at the end. That way, the pg_upgrade test will try
> to process that table and we'll know if the roundtrip via pg_dump works
> correctly.
>

Sure, will cover this.

>
> I haven't looked at 0002 too closely, but I think it has the right
> shape.
>
> > 3) Support for pg_dump, where we now dumping the INVALID NOT NULL as
> > separate from table schemes, just like CHECK Constraints.
>
> I think you copied a little bit too much of the code for check
> constraints. If a constraint is accumulated in invalidnotnulloids, you
> already know that it's not validated and needs to be dumped separately.
> So your new query doesn't need to bring convalidated (we know it's
> false). This would simplify a few lines in this new code. Also, the
> pg_log_info() line is mistaken about what this block is doing.
>

Even though we are accumulating invalidnotnulloids, we need the condition
for the invalid not null constraint, as there can me multiple not null
constraint
on the table - mix of valid and invalid.

Initially, I tried re-using the code but it was not very clear, so thought
of
making at separate code for check and not null constraint. That way it's
very clear.

>
> I think it'd be good to have NOT VALID NO INHERIT constraints in the
> tests as well.

Sure, will take care in the new version of the patch.

> Also consider the case where the child table is created
> first with a valid constraint, then the parent table is created later
> with a not valid constraint -- if the pg_dump table scans find the child
> first, does pg_dump do the right thing or does it try to create the
> parent constraint first?

yes, I tested this with the patch and pg_dump doing the right this
for that scenario.

> Also, what if the constraint in the child has
> a different name from the constraint in the parent? This should be
> pg_dump round-tripped as well. (I bet there are tons of other corner
> cases here that should be verified.) Please add something to
> pg_dump/t/002_pg_dump.pl.
>

Okay, I will add tests to pg_dump/t/002_pg_dump.pl.

regards.
Rushabh Lathia
www.EnterpriseDB.com

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Peter Eisentraut 2025-02-09 12:26:13 Re: Remove useless casts to (char *)
Previous Message Jelte Fennema-Nio 2025-02-09 12:05:32 Re: Proposals for EXPLAIN: rename ANALYZE to EXECUTE and extend VERBOSE