Fix pg_dump's failure to dump REPLICA IDENTITY for constraint indexes.
authorTom Lane
Mon, 30 Jul 2018 16:35:49 +0000 (12:35 -0400)
committerTom Lane
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 2e6225049c06b6f6bb9c55d44bd19ec19ce6ae65..81e10032d1d4fcf81ad49bb0083ebeda62b90315 100644 (file)
@@ -15902,6 +15902,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)
        {
@@ -16036,6 +16042,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)
        {
@@ -16046,6 +16058,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",