]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
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: https://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 ea5b020325b33277d05ccf729f0f3a6037814e13..4b13669f4506f66f79ff7e0ff3a924b1a89d101e 100644 (file)
@@ -11467,8 +11467,13 @@ dumpDomain(Archive *fout, 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));
 
@@ -17435,6 +17440,22 @@ dumpConstraint(Archive *fout, 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 05185c00afbf453a702d4d23c8c0c3648ca87afb..b41fe20b573a537c4cbcaad0d45bd8298539a161 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 1d5eb5c724e89addb081ca8fdd9be9a6edf730e4..c6fd3e83fbd55f783deb047539b9f00347a10202 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';