]> granicus.if.org Git - postgresql/commitdiff
Fix pg_dump's failure to dump REPLICA IDENTITY for constraint indexes.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 30 Jul 2018 16:35:49 +0000 (12:35 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 30 Jul 2018 16:35:49 +0000 (12:35 -0400)
pg_dump knew about printing ALTER TABLE ... REPLICA IDENTITY USING INDEX
for indexes declared as indexes, but it failed to print that for indexes
declared as unique or primary-key constraints.  Per report from Achilleas
Mantzios.

This has been broken since the feature was introduced, AFAICS.
Back-patch to 9.4.

Discussion: https://postgr.es/m/1e6cc5ad-b84a-7c07-8c08-a4d0c3cdc938@matrix.gatewaynet.com

src/bin/pg_dump/pg_dump.c

index 74a1270169dd380e2f61ca1b301473254ffab8ea..131d8685b730ba8b5c23c6eab5796c93ad155bcc 100644 (file)
@@ -7132,8 +7132,8 @@ getConstraints(Archive *fout, TableInfo tblinfo[], int numTables)
                TableInfo  *tbinfo = &tblinfo[i];
 
                /*
-                * For partitioned tables, foreign keys have no triggers so they
-                * must be included anyway in case some foreign keys are defined.
+                * For partitioned tables, foreign keys have no triggers so they must
+                * be included anyway in case some foreign keys are defined.
                 */
                if ((!tbinfo->hastriggers &&
                         tbinfo->relkind != RELKIND_PARTITIONED_TABLE) ||
@@ -16211,6 +16211,12 @@ dumpIndex(Archive *fout, IndxInfo *indxinfo)
                /* Plain secondary index */
                appendPQExpBuffer(q, "%s;\n", indxinfo->indexdef);
 
+               /*
+                * Append ALTER TABLE commands as needed to set properties that we
+                * only have ALTER TABLE syntax for.  Keep this in sync with the
+                * similar code in dumpConstraint!
+                */
+
                /* If the index is clustered, we need to record that. */
                if (indxinfo->indisclustered)
                {
@@ -16460,6 +16466,12 @@ dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
                        appendPQExpBufferStr(q, ";\n");
                }
 
+               /*
+                * Append ALTER TABLE commands as needed to set properties that we
+                * only have ALTER TABLE syntax for.  Keep this in sync with the
+                * similar code in dumpIndex!
+                */
+
                /* If the index is clustered, we need to record that. */
                if (indxinfo->indisclustered)
                {
@@ -16470,6 +16482,16 @@ dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
                                                          fmtId(indxinfo->dobj.name));
                }
 
+               /* If the index defines identity, we need to record that. */
+               if (indxinfo->indisreplident)
+               {
+                       appendPQExpBuffer(q, "\nALTER TABLE ONLY %s REPLICA IDENTITY USING",
+                                                         fmtQualifiedDumpable(tbinfo));
+                       /* index name is not qualified in this syntax */
+                       appendPQExpBuffer(q, " INDEX %s;\n",
+                                                         fmtId(indxinfo->dobj.name));
+               }
+
                appendPQExpBuffer(delq, "ALTER TABLE ONLY %s ",
                                                  fmtQualifiedDumpable(tbinfo));
                appendPQExpBuffer(delq, "DROP CONSTRAINT %s;\n",