By the way, the v3  failed applying on Head(d35e293878)
git am v3-0001-Catalog-not-null-constraints.patch
Applying: Catalog not-null constraints
error: patch failed: doc/src/sgml/ref/create_table.sgml:77
error: doc/src/sgml/ref/create_table.sgml: patch does not apply
error: patch failed: src/backend/commands/tablecmds.c:4834
error: src/backend/commands/tablecmds.c: patch does not apply
error: patch failed: src/backend/parser/gram.y:4141
error: src/backend/parser/gram.y: patch does not apply
error: patch failed: src/backend/parser/parse_utilcmd.c:2385
error: src/backend/parser/parse_utilcmd.c: patch does not apply
Patch failed at 0001 Catalog not-null constraints

Alvaro Herrera <alvhe...@alvh.no-ip.org> 于2024年9月17日周二 01:47写道:

> Sadly, there were some other time-wasting events that I failed to
> consider, but here's now v3 which has fixed (AFAICS) all the problems
> you reported.
>
> On 2024-Sep-11, jian he wrote:
>
> > after applying your changes.
> >
> > in ATExecAddConstraint, ATAddCheckNNConstraint.
> > ATAddCheckNNConstraint(wqueue, tab, rel,
> >             newConstraint, recurse, false, is_readd,
> >             lockmode);
> > if passed to ATAddCheckNNConstraint rel is a partitioned table.
> > ATAddCheckNNConstraint itself can recurse to create not-null
> pg_constraint
> > for itself and it's partitions (children table).
> > This is fine as long as we only call ATExecAddConstraint once.
> >
> > but ATExecAddConstraint itself will recurse, it will call
> > the partitioned table and each of the partitions.
>
> Yeah, this is because ATPrepAddPrimaryKey was queueing SetNotNull nodes
> for each column on each children, which is repetitive and causes the
> problem you see.  That was a leftover from the previous way we handled
> PKs; we no longer need it to work that way.  I have changed it so that
> it queues one constraint addition per column, on the same table that
> receives the PK.  It now works correctly as far as I can tell.
>
> Sadly, there's one more pg_dump issue, which causes the pg_upgrade tests
> to fail.  The problem is that if you have this sequence (taken from
> constraints.sql):
>
> CREATE TABLE notnull_tbl4 (a INTEGER PRIMARY KEY INITIALLY DEFERRED);
> CREATE TABLE notnull_tbl4_cld2 (PRIMARY KEY (a) DEFERRABLE) INHERITS
> (notnull_tbl4);
>
> this is dumped by pg_dump in this other way:
>
> CREATE TABLE public.notnull_tbl4 (a integer NOT NULL);
> CREATE TABLE public.notnull_tbl4_cld2 () INHERITS (public.notnull_tbl4);
> ALTER TABLE ONLY public.notnull_tbl4_cld2 ADD CONSTRAINT
> notnull_tbl4_cld2_pkey PRIMARY KEY (a) DEFERRABLE;
> ALTER TABLE ONLY public.notnull_tbl4 ADD CONSTRAINT notnull_tbl4_pkey
> PRIMARY KEY (a) DEFERRABLE INITIALLY DEFERRED;
>
> This is almost exactly the same, except that the PK for
> notnull_tbl4_cld2 is created in a separate command ... and IIUC this
> causes the not-null constraint to obtain a different name, or a
> different inheritance characteristic, and then from the
> restored-by-pg_upgrade database, it's dumped by pg_dump separately.
> This is what causes the pg_upgrade test to fail.
>
> Anyway, this made me realize that there is a more general problem, to
> wit, that pg_dump is not dumping not-null constraint names correctly --
> sometimes they just not dumped, which is Not Good.  I'll have to look
> into that once more.
>
>
> (Also: there are still a few additional test stanzas in regress/ that
> ought to be removed; also, I haven't re-tested sepgsql, so it's probably
> broken ATM.)
>
> --
> Álvaro Herrera         PostgreSQL Developer  —
> https://www.EnterpriseDB.com/
>


-- 
Thanks,
Tender Wang

Reply via email to