Refactor postgresImportForeignSchema to avoid code duplication.
authorTom Lane
Wed, 1 Sep 2021 20:21:13 +0000 (16:21 -0400)
committerTom Lane
Wed, 1 Sep 2021 20:21:13 +0000 (16:21 -0400)
Avoid repeating fragments of the query we're building, along the
same lines as recent cleanup in pg_dump.  I got annoyed about this
because aa769f80e broke my pending patch to change postgres_fdw's
collation handling, due to each of us having incompletely done
this same refactoring.  Let's finish that job in hopes of having
a more stable base.

contrib/postgres_fdw/postgres_fdw.c

index 9d443baf02acb1bdab04b5f285906351754adafd..4bdab30a7346eef79658fc1c3bfb3df54cff5aea 100644 (file)
@@ -5287,45 +5287,41 @@ postgresImportForeignSchema(ImportForeignSchemaStmt *stmt, Oid serverOid)
                               "SELECT relname, "
                               "  attname, "
                               "  format_type(atttypid, atttypmod), "
-                              "  attnotnull, ");
+                              "  attnotnull, "
+                              "  pg_get_expr(adbin, adrelid), ");
 
        /* Generated columns are supported since Postgres 12 */
        if (PQserverVersion(conn) >= 120000)
            appendStringInfoString(&buf,
-                                  "  attgenerated, "
-                                  "  pg_get_expr(adbin, adrelid), ");
+                                  "  attgenerated, ");
        else
            appendStringInfoString(&buf,
-                                  "  NULL, "
-                                  "  pg_get_expr(adbin, adrelid), ");
+                                  "  NULL, ");
 
        if (import_collate)
            appendStringInfoString(&buf,
                                   "  collname, "
-                                  "  collnsp.nspname "
-                                  "FROM pg_class c "
-                                  "  JOIN pg_namespace n ON "
-                                  "    relnamespace = n.oid "
-                                  "  LEFT JOIN pg_attribute a ON "
-                                  "    attrelid = c.oid AND attnum > 0 "
-                                  "      AND NOT attisdropped "
-                                  "  LEFT JOIN pg_attrdef ad ON "
-                                  "    adrelid = c.oid AND adnum = attnum "
+                                  "  collnsp.nspname ");
+       else
+           appendStringInfoString(&buf,
+                                  "  NULL, NULL ");
+
+       appendStringInfoString(&buf,
+                              "FROM pg_class c "
+                              "  JOIN pg_namespace n ON "
+                              "    relnamespace = n.oid "
+                              "  LEFT JOIN pg_attribute a ON "
+                              "    attrelid = c.oid AND attnum > 0 "
+                              "      AND NOT attisdropped "
+                              "  LEFT JOIN pg_attrdef ad ON "
+                              "    adrelid = c.oid AND adnum = attnum ");
+
+       if (import_collate)
+           appendStringInfoString(&buf,
                                   "  LEFT JOIN pg_collation coll ON "
                                   "    coll.oid = attcollation "
                                   "  LEFT JOIN pg_namespace collnsp ON "
                                   "    collnsp.oid = collnamespace ");
-       else
-           appendStringInfoString(&buf,
-                                  "  NULL, NULL "
-                                  "FROM pg_class c "
-                                  "  JOIN pg_namespace n ON "
-                                  "    relnamespace = n.oid "
-                                  "  LEFT JOIN pg_attribute a ON "
-                                  "    attrelid = c.oid AND attnum > 0 "
-                                  "      AND NOT attisdropped "
-                                  "  LEFT JOIN pg_attrdef ad ON "
-                                  "    adrelid = c.oid AND adnum = attnum ");
 
        appendStringInfoString(&buf,
                               "WHERE c.relkind IN ("
@@ -5405,9 +5401,9 @@ postgresImportForeignSchema(ImportForeignSchemaStmt *stmt, Oid serverOid)
                attname = PQgetvalue(res, i, 1);
                typename = PQgetvalue(res, i, 2);
                attnotnull = PQgetvalue(res, i, 3);
-               attgenerated = PQgetisnull(res, i, 4) ? (char *) NULL :
+               attdefault = PQgetisnull(res, i, 4) ? (char *) NULL :
                    PQgetvalue(res, i, 4);
-               attdefault = PQgetisnull(res, i, 5) ? (char *) NULL :
+               attgenerated = PQgetisnull(res, i, 5) ? (char *) NULL :
                    PQgetvalue(res, i, 5);
                collname = PQgetisnull(res, i, 6) ? (char *) NULL :
                    PQgetvalue(res, i, 6);