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/input/constraints.source
src/test/regress/output/constraints.source

index 774e138c0a1e46efca1482073690ef304d83139a..f5a65786372aa0405c8b0f809e2313fcddf47193 100644 (file)
@@ -11638,8 +11638,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));
 
@@ -17495,6 +17500,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 6acac568461f61e2cbb6963d80f2479bb5a9262d..9948d723b74dd61261e196248ad4a319c47976b7 100644 (file)
@@ -612,3 +612,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';
index 6429c103e241c321225f554b93ba50a683036aad..1de98a1776958670bc1c2191b14107e5028f6a43 100644 (file)
@@ -802,3 +802,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';