Fix dumping of comments on invalid constraints on domains
authorÁlvaro Herrera <alvherre@kurilemu.de>
Wed, 16 Jul 2025 17:22:53 +0000 (19:22 +0200)
committerÁlvaro Herrera <alvherre@kurilemu.de>
Wed, 16 Jul 2025 17:22:53 +0000 (19:22 +0200)
We skip dumping constraints together with domains if they are invalid
('separate') so that they appear after data -- but their comments were
dumped together with the domain definition, which in effect leads to the
comment being dumped when the constraint does not yet exist.  Delay
them in the same way.

Oversight in 7eca575d1c28; backpatch all the way back.

Author: jian he <jian.universality@gmail.com>
Discussion: http://postgr.es/m/CACJufxF_C2pe6J_+nPr6C5jf5rQnbYP8XOKr4HM8yHZtp2aQqQ@mail.gmail.com

src/bin/pg_dump/pg_dump.c
src/test/regress/expected/constraints.out
src/test/regress/sql/constraints.sql

index 2c587b8f756f4f40a97d7a1dbfb4696272c2219b..e85f2200b2743b9d15e0e110d02f26330120f451 100644 (file)
@@ -11168,8 +11168,13 @@ dumpDomain(Archive *fout, const TypeInfo *tyinfo)
    for (i = 0; i < tyinfo->nDomChecks; i++)
    {
        ConstraintInfo *domcheck = &(tyinfo->domChecks[i]);
-       PQExpBuffer conprefix = createPQExpBuffer();
+       PQExpBuffer conprefix;
 
+       /* but only if the constraint itself was dumped here */
+       if (domcheck->separate)
+           continue;
+
+       conprefix = createPQExpBuffer();
        appendPQExpBuffer(conprefix, "CONSTRAINT %s ON DOMAIN",
                          fmtId(domcheck->dobj.name));
 
@@ -16805,6 +16810,22 @@ dumpConstraint(Archive *fout, const ConstraintInfo *coninfo)
                                          .section = SECTION_POST_DATA,
                                          .createStmt = q->data,
                                          .dropStmt = delq->data));
+
+           if (coninfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+           {
+               PQExpBuffer conprefix = createPQExpBuffer();
+               char       *qtypname = pg_strdup(fmtId(tyinfo->dobj.name));
+
+               appendPQExpBuffer(conprefix, "CONSTRAINT %s ON DOMAIN",
+                                 fmtId(coninfo->dobj.name));
+
+               dumpComment(fout, conprefix->data, qtypname,
+                           tyinfo->dobj.namespace->dobj.name,
+                           tyinfo->rolname,
+                           coninfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+               destroyPQExpBuffer(conprefix);
+               free(qtypname);
+           }
        }
    }
    else
index cf0b80d61696540a05a614cd73dd0650f6c19d7b..a5b5795e587360915eb8b9e3bc9309b769700704 100644 (file)
@@ -830,3 +830,7 @@ DROP TABLE constraint_comments_tbl;
 DROP DOMAIN constraint_comments_dom;
 DROP ROLE regress_constraint_comments;
 DROP ROLE regress_constraint_comments_noaccess;
+-- Leave some constraints for the pg_upgrade test to pick up
+CREATE DOMAIN constraint_comments_dom AS int;
+ALTER DOMAIN constraint_comments_dom ADD CONSTRAINT inv_ck CHECK (value > 0) NOT VALID;
+COMMENT ON CONSTRAINT inv_ck ON DOMAIN constraint_comments_dom IS 'comment on invalid constraint';
index e3e3bea70911ba2574df414c4ca0bea06072cf63..c47db9469f5dc92f455d320bce8ea0044e503642 100644 (file)
@@ -632,3 +632,9 @@ DROP DOMAIN constraint_comments_dom;
 
 DROP ROLE regress_constraint_comments;
 DROP ROLE regress_constraint_comments_noaccess;
+
+-- Leave some constraints for the pg_upgrade test to pick up
+CREATE DOMAIN constraint_comments_dom AS int;
+
+ALTER DOMAIN constraint_comments_dom ADD CONSTRAINT inv_ck CHECK (value > 0) NOT VALID;
+COMMENT ON CONSTRAINT inv_ck ON DOMAIN constraint_comments_dom IS 'comment on invalid constraint';