pg_dump: Add FOREIGN to ALTER statements, if appropriate
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 20 Mar 2020 20:21:00 +0000 (17:21 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 20 Mar 2020 20:33:18 +0000 (17:33 -0300)
Author: Luis Carril
Reviewed-by: Tomas Vondra, Daniel Gustafsson, Álvaro Herrera
Discussion: https://postgr.es/m/LEJPR01MB0185A19B2E7C98E5E2A031F5E7F20@LEJPR01MB0185.DEUPRD01.PROD.OUTLOOK.DE

src/bin/pg_dump/pg_dump.c

index ced0681ec3768ee579d5959781941517f0ec0c24..812907b88a81e92ef0c110c45c7a28492b1af76e 100644 (file)
@@ -15655,6 +15655,7 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
        {
                char       *ftoptions = NULL;
                char       *srvname = NULL;
+               char       *foreign = "";
 
                switch (tbinfo->relkind)
                {
@@ -15688,6 +15689,8 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
                                        ftoptions = pg_strdup(PQgetvalue(res, 0, i_ftoptions));
                                        PQclear(res);
                                        destroyPQExpBuffer(query);
+
+                                       foreign = "FOREIGN ";
                                        break;
                                }
                        case RELKIND_MATVIEW:
@@ -16037,11 +16040,10 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
                                        continue;
 
                                appendPQExpBufferStr(q, "\n-- For binary upgrade, set up inherited constraint.\n");
-                               appendPQExpBuffer(q, "ALTER TABLE ONLY %s ",
-                                                                 qualrelname);
-                               appendPQExpBuffer(q, " ADD CONSTRAINT %s ",
-                                                                 fmtId(constr->dobj.name));
-                               appendPQExpBuffer(q, "%s;\n", constr->condef);
+                               appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s ADD CONSTRAINT %s %s;\n",
+                                                                 foreign, qualrelname,
+                                                                 fmtId(constr->dobj.name),
+                                                                 constr->condef);
                                appendPQExpBufferStr(q, "UPDATE pg_catalog.pg_constraint\n"
                                                                         "SET conislocal = false\n"
                                                                         "WHERE contype = 'c' AND conname = ");
@@ -16058,7 +16060,7 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
                                {
                                        TableInfo  *parentRel = parents[k];
 
-                                       appendPQExpBuffer(q, "ALTER TABLE ONLY %s INHERIT %s;\n",
+                                       appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s INHERIT %s;\n", foreign,
                                                                          qualrelname,
                                                                          fmtQualifiedDumpable(parentRel));
                                }
@@ -16163,12 +16165,10 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
                         */
                        if (!shouldPrintColumn(dopt, tbinfo, j) &&
                                tbinfo->notnull[j] && !tbinfo->inhNotNull[j])
-                       {
-                               appendPQExpBuffer(q, "ALTER TABLE ONLY %s ",
-                                                                 qualrelname);
-                               appendPQExpBuffer(q, "ALTER COLUMN %s SET NOT NULL;\n",
+                               appendPQExpBuffer(q,
+                                                                 "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET NOT NULL;\n",
+                                                                 foreign, qualrelname,
                                                                  fmtId(tbinfo->attnames[j]));
-                       }
 
                        /*
                         * Dump per-column statistics information. We only issue an ALTER
@@ -16176,14 +16176,10 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
                         * non-negative (i.e. it's not the default value)
                         */
                        if (tbinfo->attstattarget[j] >= 0)
-                       {
-                               appendPQExpBuffer(q, "ALTER TABLE ONLY %s ",
-                                                                 qualrelname);
-                               appendPQExpBuffer(q, "ALTER COLUMN %s ",
-                                                                 fmtId(tbinfo->attnames[j]));
-                               appendPQExpBuffer(q, "SET STATISTICS %d;\n",
+                               appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET STATISTICS %d;\n",
+                                                                 foreign, qualrelname,
+                                                                 fmtId(tbinfo->attnames[j]),
                                                                  tbinfo->attstattarget[j]);
-                       }
 
                        /*
                         * Dump per-column storage information.  The statement is only
@@ -16213,42 +16209,33 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
                                 * Only dump the statement if it's a storage type we recognize
                                 */
                                if (storage != NULL)
-                               {
-                                       appendPQExpBuffer(q, "ALTER TABLE ONLY %s ",
-                                                                         qualrelname);
-                                       appendPQExpBuffer(q, "ALTER COLUMN %s ",
-                                                                         fmtId(tbinfo->attnames[j]));
-                                       appendPQExpBuffer(q, "SET STORAGE %s;\n",
+                                       appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET STORAGE %s;\n",
+                                                                         foreign, qualrelname,
+                                                                         fmtId(tbinfo->attnames[j]),
                                                                          storage);
-                               }
                        }
 
                        /*
                         * Dump per-column attributes.
                         */
                        if (tbinfo->attoptions[j][0] != '\0')
-                       {
-                               appendPQExpBuffer(q, "ALTER TABLE ONLY %s ",
-                                                                 qualrelname);
-                               appendPQExpBuffer(q, "ALTER COLUMN %s ",
-                                                                 fmtId(tbinfo->attnames[j]));
-                               appendPQExpBuffer(q, "SET (%s);\n",
+                               appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET (%s);\n",
+                                                                 foreign, qualrelname,
+                                                                 fmtId(tbinfo->attnames[j]),
                                                                  tbinfo->attoptions[j]);
-                       }
 
                        /*
                         * Dump per-column fdw options.
                         */
                        if (tbinfo->relkind == RELKIND_FOREIGN_TABLE &&
                                tbinfo->attfdwoptions[j][0] != '\0')
-                       {
-                               appendPQExpBuffer(q, "ALTER FOREIGN TABLE %s ",
-                                                                 qualrelname);
-                               appendPQExpBuffer(q, "ALTER COLUMN %s ",
-                                                                 fmtId(tbinfo->attnames[j]));
-                               appendPQExpBuffer(q, "OPTIONS (\n    %s\n);\n",
+                               appendPQExpBuffer(q,
+                                                                 "ALTER FOREIGN TABLE %s ALTER COLUMN %s OPTIONS (\n"
+                                                                 "       %s\n"
+                                                                 ");\n",
+                                                                 qualrelname,
+                                                                 fmtId(tbinfo->attnames[j]),
                                                                  tbinfo->attfdwoptions[j]);
-                       }
                }
 
                if (ftoptions)
@@ -16351,6 +16338,7 @@ dumpAttrDef(Archive *fout, AttrDefInfo *adinfo)
        PQExpBuffer delq;
        char       *qualrelname;
        char       *tag;
+       char       *foreign;
 
        /* Skip if table definition not to be dumped */
        if (!tbinfo->dobj.dump || dopt->dataOnly)
@@ -16365,15 +16353,15 @@ dumpAttrDef(Archive *fout, AttrDefInfo *adinfo)
 
        qualrelname = pg_strdup(fmtQualifiedDumpable(tbinfo));
 
-       appendPQExpBuffer(q, "ALTER TABLE ONLY %s ",
-                                         qualrelname);
-       appendPQExpBuffer(q, "ALTER COLUMN %s SET DEFAULT %s;\n",
-                                         fmtId(tbinfo->attnames[adnum - 1]),
+       foreign = tbinfo->relkind == RELKIND_FOREIGN_TABLE ? "FOREIGN " : "";
+
+       appendPQExpBuffer(q,
+                                         "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET DEFAULT %s;\n",
+                                         foreign, qualrelname, fmtId(tbinfo->attnames[adnum - 1]),
                                          adinfo->adef_expr);
 
-       appendPQExpBuffer(delq, "ALTER TABLE %s ",
-                                         qualrelname);
-       appendPQExpBuffer(delq, "ALTER COLUMN %s DROP DEFAULT;\n",
+       appendPQExpBuffer(delq, "ALTER %sTABLE %s ALTER COLUMN %s DROP DEFAULT;\n",
+                                         foreign, qualrelname,
                                          fmtId(tbinfo->attnames[adnum - 1]));
 
        tag = psprintf("%s %s", tbinfo->dobj.name, tbinfo->attnames[adnum - 1]);
@@ -16683,6 +16671,7 @@ dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
        PQExpBuffer q;
        PQExpBuffer delq;
        char       *tag = NULL;
+       char       *foreign;
 
        /* Skip if not to be dumped */
        if (!coninfo->dobj.dump || dopt->dataOnly)
@@ -16691,6 +16680,9 @@ dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
        q = createPQExpBuffer();
        delq = createPQExpBuffer();
 
+       foreign = tbinfo &&
+               tbinfo->relkind == RELKIND_FOREIGN_TABLE ?  "FOREIGN " : "";
+
        if (coninfo->contype == 'p' ||
                coninfo->contype == 'u' ||
                coninfo->contype == 'x')
@@ -16709,7 +16701,7 @@ dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
                        binary_upgrade_set_pg_class_oids(fout, q,
                                                                                         indxinfo->dobj.catId.oid, true);
 
-               appendPQExpBuffer(q, "ALTER TABLE ONLY %s\n",
+               appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s\n", foreign,
                                                  fmtQualifiedDumpable(tbinfo));
                appendPQExpBuffer(q, "    ADD CONSTRAINT %s ",
                                                  fmtId(coninfo->dobj.name));
@@ -16804,7 +16796,7 @@ dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
                                                                        "pg_catalog.pg_class", "INDEX",
                                                                        fmtQualifiedDumpable(indxinfo));
 
-               appendPQExpBuffer(delq, "ALTER TABLE ONLY %s ",
+               appendPQExpBuffer(delq, "ALTER %sTABLE ONLY %s ", foreign,
                                                  fmtQualifiedDumpable(tbinfo));
                appendPQExpBuffer(delq, "DROP CONSTRAINT %s;\n",
                                                  fmtId(coninfo->dobj.name));
@@ -16838,13 +16830,13 @@ dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
                 * XXX Potentially wrap in a 'SET CONSTRAINTS OFF' block so that the
                 * current table data is not processed
                 */
-               appendPQExpBuffer(q, "ALTER TABLE %s%s\n",
+               appendPQExpBuffer(q, "ALTER %sTABLE %s%s\n", foreign,
                                                  only, fmtQualifiedDumpable(tbinfo));
                appendPQExpBuffer(q, "    ADD CONSTRAINT %s %s;\n",
                                                  fmtId(coninfo->dobj.name),
                                                  coninfo->condef);
 
-               appendPQExpBuffer(delq, "ALTER TABLE %s%s ",
+               appendPQExpBuffer(delq, "ALTER %sTABLE %s%s ", foreign,
                                                  only, fmtQualifiedDumpable(tbinfo));
                appendPQExpBuffer(delq, "DROP CONSTRAINT %s;\n",
                                                  fmtId(coninfo->dobj.name));
@@ -16869,13 +16861,13 @@ dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
                if (coninfo->separate && coninfo->conislocal)
                {
                        /* not ONLY since we want it to propagate to children */
-                       appendPQExpBuffer(q, "ALTER TABLE %s\n",
+                       appendPQExpBuffer(q, "ALTER %sTABLE %s\n", foreign,
                                                          fmtQualifiedDumpable(tbinfo));
                        appendPQExpBuffer(q, "    ADD CONSTRAINT %s %s;\n",
                                                          fmtId(coninfo->dobj.name),
                                                          coninfo->condef);
 
-                       appendPQExpBuffer(delq, "ALTER TABLE %s ",
+                       appendPQExpBuffer(delq, "ALTER %sTABLE %s ", foreign,
                                                          fmtQualifiedDumpable(tbinfo));
                        appendPQExpBuffer(delq, "DROP CONSTRAINT %s;\n",
                                                          fmtId(coninfo->dobj.name));
@@ -17474,7 +17466,8 @@ dumpTrigger(Archive *fout, TriggerInfo *tginfo)
 
        if (tginfo->tgenabled != 't' && tginfo->tgenabled != 'O')
        {
-               appendPQExpBuffer(query, "\nALTER TABLE %s ",
+               appendPQExpBuffer(query, "\nALTER %sTABLE %s ", foreign,
+                                                 tbinfo->relkind == RELKIND_FOREIGN_TABLE ? "FOREIGN " : "",
                                                  fmtQualifiedDumpable(tbinfo));
                switch (tginfo->tgenabled)
                {