]> granicus.if.org Git - postgresql/commitdiff
Mark index-constraint comments with correct dependency in pg_dump.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 27 Jun 2013 17:54:59 +0000 (13:54 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 27 Jun 2013 17:54:59 +0000 (13:54 -0400)
When there's a comment on an index that was created with UNIQUE or PRIMARY
KEY constraint syntax, we need to label the comment as depending on the
constraint not the index, since only the constraint object actually appears
in the dump.  This incorrect dependency can lead to parallel pg_restore
trying to restore the comment before the index has been created, per bug
#8257 from Lloyd Albin.

This patch fixes pg_dump to produce the right dependency in dumps made
in the future.  Usually we also try to hack pg_restore to work around
bogus dependencies, so that existing (wrong) dumps can still be restored in
parallel mode; but that doesn't seem practical here since there's no easy
way to relate the constraint dump entry to the comment after the fact.

Andres Freund

src/bin/pg_dump/pg_dump.c

index 72f172bf1f3987467d9ceb66db0743b002a01660..47f781905e84fe5173aa32a1b363aba1e13e4b5e 100644 (file)
@@ -12942,6 +12942,7 @@ static void
 dumpIndex(Archive *fout, IndxInfo *indxinfo)
 {
        TableInfo  *tbinfo = indxinfo->indextable;
+       bool            is_constraint = (indxinfo->indexconstraint != 0);
        PQExpBuffer q;
        PQExpBuffer delq;
        PQExpBuffer labelq;
@@ -12959,9 +12960,11 @@ dumpIndex(Archive *fout, IndxInfo *indxinfo)
        /*
         * If there's an associated constraint, don't dump the index per se, but
         * do dump any comment for it.  (This is safe because dependency ordering
-        * will have ensured the constraint is emitted first.)
+        * will have ensured the constraint is emitted first.)  Note that the
+        * emitted comment has to be shown as depending on the constraint, not
+        * the index, in such cases.
         */
-       if (indxinfo->indexconstraint == 0)
+       if (!is_constraint)
        {
                if (binary_upgrade)
                        binary_upgrade_set_pg_class_oids(fout, q,
@@ -13003,7 +13006,9 @@ dumpIndex(Archive *fout, IndxInfo *indxinfo)
        dumpComment(fout, labelq->data,
                                tbinfo->dobj.namespace->dobj.name,
                                tbinfo->rolname,
-                               indxinfo->dobj.catId, 0, indxinfo->dobj.dumpId);
+                               indxinfo->dobj.catId, 0,
+                               is_constraint ? indxinfo->indexconstraint :
+                               indxinfo->dobj.dumpId);
 
        destroyPQExpBuffer(q);
        destroyPQExpBuffer(delq);