pg_upgrade: Ignore TOAST for partitioned tables
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Sun, 10 Mar 2019 16:20:58 +0000 (13:20 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Sun, 10 Mar 2019 16:20:58 +0000 (13:20 -0300)
Since partitioned tables in pg12 do not have toast tables, trying to set
the toast OID confuses pg_upgrade.  Have pg_dump omit those values to
avoid the problem.

Per Andres Freund and buildfarm members crake and snapper
Discussion: https://postgr.es/m/20190306204104.yle5jfbnqkcwykni@alap3.anarazel.de

src/bin/pg_dump/pg_dump.c

index e962ae7e913e6bd7fc42ee7d4cf999b193cbb089..4c98ae4d7f4848084febb27907d31b0d68b0bcca 100644 (file)
@@ -4354,14 +4354,20 @@ binary_upgrade_set_type_oids_by_rel_oid(Archive *fout,
        Oid                     pg_type_oid;
        bool            toast_set = false;
 
-       /* we only support old >= 8.3 for binary upgrades */
+       /*
+        * We only support old >= 8.3 for binary upgrades.
+        *
+        * We purposefully ignore toast OIDs for partitioned tables; the reason is
+        * that versions 10 and 11 have them, but 12 does not, so emitting them
+        * causes the upgrade to fail.
+        */
        appendPQExpBuffer(upgrade_query,
                                          "SELECT c.reltype AS crel, t.reltype AS trel "
                                          "FROM pg_catalog.pg_class c "
                                          "LEFT JOIN pg_catalog.pg_class t ON "
-                                         "  (c.reltoastrelid = t.oid) "
+                                         "  (c.reltoastrelid = t.oid AND c.relkind <> '%c') "
                                          "WHERE c.oid = '%u'::pg_catalog.oid;",
-                                         pg_rel_oid);
+                                         RELKIND_PARTITIONED_TABLE, pg_rel_oid);
 
        upgrade_res = ExecuteSqlQueryForSingleRow(fout, upgrade_query->data);
 
@@ -5953,6 +5959,10 @@ getTables(Archive *fout, int *numTables)
         * information about each table, basically just enough to decide if it is
         * interesting. We must fetch all tables in this phase because otherwise
         * we cannot correctly identify inherited columns, owned sequences, etc.
+        *
+        * We purposefully ignore toast OIDs for partitioned tables; the reason is
+        * that versions 10 and 11 have them, but 12 does not, so emitting them
+        * causes the upgrade to fail.
         */
 
        if (fout->remoteVersion >= 90600)
@@ -6049,7 +6059,7 @@ getTables(Archive *fout, int *numTables)
                                                  "d.classid = c.tableoid AND d.objid = c.oid AND "
                                                  "d.objsubid = 0 AND "
                                                  "d.refclassid = c.tableoid AND d.deptype IN ('a', 'i')) "
-                                                 "LEFT JOIN pg_class tc ON (c.reltoastrelid = tc.oid) "
+                                                 "LEFT JOIN pg_class tc ON (c.reltoastrelid = tc.oid AND c.relkind <> '%c') "
                                                  "LEFT JOIN pg_am am ON (c.relam = am.oid) "
                                                  "LEFT JOIN pg_init_privs pip ON "
                                                  "(c.oid = pip.objoid "
@@ -6072,6 +6082,7 @@ getTables(Archive *fout, int *numTables)
                                                  ispartition,
                                                  partbound,
                                                  RELKIND_SEQUENCE,
+                                                 RELKIND_PARTITIONED_TABLE,
                                                  RELKIND_RELATION, RELKIND_SEQUENCE,
                                                  RELKIND_VIEW, RELKIND_COMPOSITE_TYPE,
                                                  RELKIND_MATVIEW, RELKIND_FOREIGN_TABLE,