]> granicus.if.org Git - postgresql/commitdiff
Adjust pg_upgrade query so toast tables related to system catalog schema
authorBruce Momjian <bruce@momjian.us>
Tue, 2 Oct 2012 15:46:08 +0000 (11:46 -0400)
committerBruce Momjian <bruce@momjian.us>
Tue, 2 Oct 2012 15:46:08 +0000 (11:46 -0400)
entries are not dumped.   This fixes an error caused by
droping/recreating the information_schema, but other failures were also
possible.

Backpatch to 9.2.

contrib/pg_upgrade/info.c

index 74b13e782da28e17788f7b44061269cb6acf17fc..9d08f410c1043408653662a74cbcf4641ab07212 100644 (file)
@@ -269,34 +269,59 @@ get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo)
         */
 
        snprintf(query, sizeof(query),
-                        "SELECT c.oid, n.nspname, c.relname, "
-                        "      c.relfilenode, c.reltablespace, %s "
+                        "CREATE TEMPORARY TABLE info_rels (reloid) AS SELECT c.oid "
                         "FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n "
                         "         ON c.relnamespace = n.oid "
-                        "  LEFT OUTER JOIN pg_catalog.pg_tablespace t "
-                        "         ON c.reltablespace = t.oid "
-                        "WHERE relkind IN ('r','t', 'i'%s) AND "
+                        "WHERE relkind IN ('r', 'i'%s) AND "
        /* exclude possible orphaned temp tables */
                         "  ((n.nspname !~ '^pg_temp_' AND "
                         "    n.nspname !~ '^pg_toast_temp_' AND "
-                        "    n.nspname NOT IN ('pg_catalog', 'information_schema', 'binary_upgrade') AND "
+       /* skip pg_toast because toast index have relkind == 'i', not 't' */
+                        "    n.nspname NOT IN ('pg_catalog', 'information_schema', "
+                        "                                              'binary_upgrade', 'pg_toast') AND "
                         "        c.oid >= %u) "
                         "  OR (n.nspname = 'pg_catalog' AND "
-       "    relname IN ('pg_largeobject', 'pg_largeobject_loid_pn_index'%s) )) "
-       /* we preserve pg_class.oid so we sort by it to match old/new */
-                        "ORDER BY 1;",
-       /* 9.2 removed the spclocation column */
-                        (GET_MAJOR_VERSION(cluster->major_version) <= 901) ?
-                        "t.spclocation" : "pg_catalog.pg_tablespace_location(t.oid) AS spclocation",
+       "    relname IN ('pg_largeobject', 'pg_largeobject_loid_pn_index'%s) ));",
        /* see the comment at the top of old_8_3_create_sequence_script() */
                         (GET_MAJOR_VERSION(old_cluster.major_version) <= 803) ?
                         "" : ", 'S'",
-       /* this oid allows us to skip system toast tables */
                         FirstNormalObjectId,
        /* does pg_largeobject_metadata need to be migrated? */
                         (GET_MAJOR_VERSION(old_cluster.major_version) <= 804) ?
        "" : ", 'pg_largeobject_metadata', 'pg_largeobject_metadata_oid_index'");
 
+       PQclear(executeQueryOrDie(conn, "%s", query));
+
+       /*
+        *      Get TOAST tables and indexes;  we have to gather the TOAST tables in
+        *      later steps because we can't schema-qualify TOAST tables.
+        */
+       PQclear(executeQueryOrDie(conn,
+                                                         "INSERT INTO info_rels "
+                                                         "SELECT reltoastrelid "
+                                                         "FROM info_rels i JOIN pg_catalog.pg_class c "
+                                                         "             ON i.reloid = c.oid"));
+       PQclear(executeQueryOrDie(conn,
+                                                         "INSERT INTO info_rels "
+                                                         "SELECT reltoastidxid "
+                                                         "FROM info_rels i JOIN pg_catalog.pg_class c "
+                                                         "             ON i.reloid = c.oid"));
+
+       snprintf(query, sizeof(query),
+                        "SELECT c.oid, n.nspname, c.relname, "
+                        "      c.relfilenode, c.reltablespace, %s "
+                        "FROM info_rels i JOIN pg_catalog.pg_class c "
+                        "              ON i.reloid = c.oid "
+                        "  JOIN pg_catalog.pg_namespace n "
+                        "         ON c.relnamespace = n.oid "
+                        "  LEFT OUTER JOIN pg_catalog.pg_tablespace t "
+                        "         ON c.reltablespace = t.oid "
+       /* we preserve pg_class.oid so we sort by it to match old/new */
+                        "ORDER BY 1;",
+       /* 9.2 removed the spclocation column */
+                  (GET_MAJOR_VERSION(cluster->major_version) <= 901) ?
+                  "t.spclocation" : "pg_catalog.pg_tablespace_location(t.oid) AS spclocation");
+
        res = executeQueryOrDie(conn, "%s", query);
 
        ntups = PQntuples(res);