]> granicus.if.org Git - postgresql/commitdiff
Clarify pg_upgrade's creation of the map file structure. Also clean
authorBruce Momjian <bruce@momjian.us>
Wed, 5 Jan 2011 16:37:08 +0000 (11:37 -0500)
committerBruce Momjian <bruce@momjian.us>
Wed, 5 Jan 2011 16:37:08 +0000 (11:37 -0500)
up pg_dump's calling of pg_upgrade_support functions.

contrib/pg_upgrade/info.c
contrib/pg_upgrade/pg_upgrade.h
contrib/pg_upgrade/version_old_8_3.c
src/bin/pg_dump/pg_dump.c

index 8d566c0b2d689405c53dcf3b9b7d1e9815aac64e..83afb92688749fe6d695f162caa833ee285fa396 100644 (file)
@@ -33,8 +33,6 @@ static RelInfo *relarr_lookup_rel_oid(ClusterInfo *cluster, RelInfoArr *rel_arr,
  * generates database mappings for "old_db" and "new_db". Returns a malloc'ed
  * array of mappings. nmaps is a return parameter which refers to the number
  * mappings.
- *
- * NOTE: Its the Caller's responsibility to free the returned array.
  */
 FileNameMap *
 gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
@@ -45,19 +43,19 @@ gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
        int                     num_maps = 0;
 
        maps = (FileNameMap *) pg_malloc(sizeof(FileNameMap) *
-                                                                        new_db->rel_arr.nrels);
+                                                                        old_db->rel_arr.nrels);
 
-       for (relnum = 0; relnum < new_db->rel_arr.nrels; relnum++)
+       for (relnum = 0; relnum < old_db->rel_arr.nrels; relnum++)
        {
-               RelInfo    *newrel = &new_db->rel_arr.rels[relnum];
-               RelInfo    *oldrel;
+               RelInfo    *oldrel = &old_db->rel_arr.rels[relnum];
+               RelInfo    *newrel;
 
-               /* toast tables are handled by their parent */
-               if (strcmp(newrel->nspname, "pg_toast") == 0)
+               /* toast tables are handled by their parents */
+               if (strcmp(oldrel->nspname, "pg_toast") == 0)
                        continue;
 
-               oldrel = relarr_lookup_rel_name(&old_cluster, &old_db->rel_arr,
-                                                                  newrel->nspname, newrel->relname);
+               newrel = relarr_lookup_rel_name(&old_cluster, &old_db->rel_arr,
+                                                                  oldrel->nspname, oldrel->relname);
 
                create_rel_filename_map(old_pgdata, new_pgdata, old_db, new_db,
                                oldrel, newrel, maps + num_maps);
@@ -65,52 +63,36 @@ gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
 
                /*
                 * So much for mapping this relation;  now we need a mapping
-                * for its corresponding toast relation, if any.
+                * for its corresponding toast relation and toast index, if any.
                 */
                if (oldrel->toastrelid > 0)
                {
-                       RelInfo    *new_toast;
-                       RelInfo    *old_toast;
-                       char            new_name[MAXPGPATH];
-                       char            old_name[MAXPGPATH];
-
-                       /* construct the new and old relnames for the toast relation */
-                       snprintf(old_name, sizeof(old_name), "pg_toast_%u", oldrel->reloid);
-                       snprintf(new_name, sizeof(new_name), "pg_toast_%u", newrel->reloid);
+                       char            old_name[MAXPGPATH], new_name[MAXPGPATH];
+                       RelInfo    *old_toast, *new_toast;
 
-                       /* look them up in their respective arrays */
                        old_toast = relarr_lookup_rel_oid(&old_cluster, &old_db->rel_arr,
-                                                                                        oldrel->toastrelid);
-                       new_toast = relarr_lookup_rel_name(&new_cluster, &new_db->rel_arr,
-                                                                                 "pg_toast", new_name);
+                                                                                         oldrel->toastrelid);
+                       new_toast = relarr_lookup_rel_oid(&new_cluster, &new_db->rel_arr,
+                                                                                         newrel->toastrelid);
 
-                       /* finally create a mapping for them */
                        create_rel_filename_map(old_pgdata, new_pgdata, old_db, new_db,
                                        old_toast, new_toast, maps + num_maps);
                        num_maps++;
 
                        /*
-                        * also need to provide a mapping for the index of this toast
+                        * We also need to provide a mapping for the index of this toast
                         * relation. The procedure is similar to what we did above for
                         * toast relation itself, the only difference being that the
                         * relnames need to be appended with _index.
                         */
-
-                       /*
-                        * construct the new and old relnames for the toast index
-                        * relations
-                        */
                        snprintf(old_name, sizeof(old_name), "%s_index", old_toast->relname);
-                       snprintf(new_name, sizeof(new_name), "pg_toast_%u_index",
-                                        newrel->reloid);
+                       snprintf(new_name, sizeof(new_name), "%s_index", new_toast->relname);
 
-                       /* look them up in their respective arrays */
                        old_toast = relarr_lookup_rel_name(&old_cluster, &old_db->rel_arr,
                                                                                  "pg_toast", old_name);
                        new_toast = relarr_lookup_rel_name(&new_cluster, &new_db->rel_arr,
                                                                                  "pg_toast", new_name);
 
-                       /* finally create a mapping for them */
                        create_rel_filename_map(old_pgdata, new_pgdata, old_db,
                                        new_db, old_toast, new_toast, maps + num_maps);
                        num_maps++;
@@ -133,15 +115,6 @@ create_rel_filename_map(const char *old_data, const char *new_data,
                          const RelInfo *old_rel, const RelInfo *new_rel,
                          FileNameMap *map)
 {
-       map->old_relfilenode = old_rel->relfilenode;
-       map->new_relfilenode = new_rel->relfilenode;
-
-       snprintf(map->old_nspname, sizeof(map->old_nspname), "%s", old_rel->nspname);
-       snprintf(map->new_nspname, sizeof(map->new_nspname), "%s", new_rel->nspname);
-
-       snprintf(map->old_relname, sizeof(map->old_relname), "%s", old_rel->relname);
-       snprintf(map->new_relname, sizeof(map->new_relname), "%s", new_rel->relname);
-
        if (strlen(old_rel->tablespace) == 0)
        {
                /*
@@ -155,14 +128,21 @@ create_rel_filename_map(const char *old_data, const char *new_data,
        }
        else
        {
-               /*
-                * relation belongs to some tablespace, so use the tablespace location
-                */
+               /* relation belongs to a tablespace, so use the tablespace location */
                snprintf(map->old_dir, sizeof(map->old_dir), "%s%s/%u", old_rel->tablespace,
                                 old_cluster.tablespace_suffix, old_db->db_oid);
                snprintf(map->new_dir, sizeof(map->new_dir), "%s%s/%u", new_rel->tablespace,
                                 new_cluster.tablespace_suffix, new_db->db_oid);
        }
+
+       map->old_relfilenode = old_rel->relfilenode;
+       map->new_relfilenode = new_rel->relfilenode;
+
+       /* used only for logging and error reporing */
+       snprintf(map->old_nspname, sizeof(map->old_nspname), "%s", old_rel->nspname);
+       snprintf(map->new_nspname, sizeof(map->new_nspname), "%s", new_rel->nspname);
+       snprintf(map->old_relname, sizeof(map->old_relname), "%s", old_rel->relname);
+       snprintf(map->new_relname, sizeof(map->new_relname), "%s", new_rel->relname);
 }
 
 
index 3bbddee824e5de5b68722d82547e2c80bfa476cc..d863155b9b2cd6f028f02c0d71137abdf13c6075 100644 (file)
@@ -87,12 +87,18 @@ typedef struct
 {
        char            old_dir[MAXPGPATH];
        char            new_dir[MAXPGPATH];
-       Oid                     old_relfilenode;        /* Relfilenode of the old relation */
-       Oid                     new_relfilenode;        /* Relfilenode of the new relation */
-       char            old_nspname[NAMEDATALEN];               /* old name of the namespace */
-       char            old_relname[NAMEDATALEN];               /* old name of the relation */
-       char            new_nspname[NAMEDATALEN];               /* new name of the namespace */
-       char            new_relname[NAMEDATALEN];               /* new name of the relation */
+       /*
+        * old/new relfilenodes might differ for pg_largeobject(_metadata) indexes
+        * due to VACUUM FULL or REINDEX.  Other relfilenodes are preserved.
+        */
+       Oid                     old_relfilenode;
+       Oid                     new_relfilenode;
+       /* the rest are used only for logging and error reporting */
+       char            old_nspname[NAMEDATALEN];               /* namespaces */
+       char            new_nspname[NAMEDATALEN];
+       /* old/new relnames differ for toast tables and toast indexes */
+       char            old_relname[NAMEDATALEN];
+       char            new_relname[NAMEDATALEN];
 } FileNameMap;
 
 /*
index 664380b47bcb8f074bbfe3e352bcdb3e4b7d9f89..5b226b218df1d3efc12dc0c22b434f0ad58c9f22 100644 (file)
@@ -222,8 +222,8 @@ old_8_3_rebuild_tsvector_tables(ClusterInfo *cluster, bool check_mode)
        {
                PGresult   *res;
                bool            db_used = false;
-               char            old_nspname[NAMEDATALEN] = "",
-                                       old_relname[NAMEDATALEN] = "";
+               char            nspname[NAMEDATALEN] = "",
+                                       relname[NAMEDATALEN] = "";
                int                     ntups;
                int                     rowno;
                int                     i_nspname,
@@ -283,10 +283,10 @@ old_8_3_rebuild_tsvector_tables(ClusterInfo *cluster, bool check_mode)
                                }
 
                                /* Rebuild all tsvector collumns with one ALTER TABLE command */
-                               if (strcmp(PQgetvalue(res, rowno, i_nspname), old_nspname) != 0 ||
-                                strcmp(PQgetvalue(res, rowno, i_relname), old_relname) != 0)
+                               if (strcmp(PQgetvalue(res, rowno, i_nspname), nspname) != 0 ||
+                                strcmp(PQgetvalue(res, rowno, i_relname), relname) != 0)
                                {
-                                       if (strlen(old_nspname) != 0 || strlen(old_relname) != 0)
+                                       if (strlen(nspname) != 0 || strlen(relname) != 0)
                                                fprintf(script, ";\n\n");
                                        fprintf(script, "ALTER TABLE %s.%s\n",
                                                 quote_identifier(PQgetvalue(res, rowno, i_nspname)),
@@ -294,8 +294,8 @@ old_8_3_rebuild_tsvector_tables(ClusterInfo *cluster, bool check_mode)
                                }
                                else
                                        fprintf(script, ",\n");
-                               strlcpy(old_nspname, PQgetvalue(res, rowno, i_nspname), sizeof(old_nspname));
-                               strlcpy(old_relname, PQgetvalue(res, rowno, i_relname), sizeof(old_relname));
+                               strlcpy(nspname, PQgetvalue(res, rowno, i_nspname), sizeof(nspname));
+                               strlcpy(relname, PQgetvalue(res, rowno, i_relname), sizeof(relname));
 
                                fprintf(script, "ALTER COLUMN %s "
                                /* This could have been a custom conversion function call. */
@@ -304,7 +304,7 @@ old_8_3_rebuild_tsvector_tables(ClusterInfo *cluster, bool check_mode)
                                                quote_identifier(PQgetvalue(res, rowno, i_attname)));
                        }
                }
-               if (strlen(old_nspname) != 0 || strlen(old_relname) != 0)
+               if (strlen(nspname) != 0 || strlen(relname) != 0)
                        fprintf(script, ";\n\n");
 
                PQclear(res);
index b0a0dc56072c6b676e87b4395981b6b670c41f33..95218ee83175d5ae9b3b525ad8fd99a4983de488 100644 (file)
@@ -2354,34 +2354,37 @@ binary_upgrade_set_relfilenodes(PQExpBuffer upgrade_buffer, Oid pg_class_oid,
                                        "\n-- For binary upgrade, must preserve relfilenodes\n");
 
        if (!is_index)
+       {
                appendPQExpBuffer(upgrade_buffer,
                                                  "SELECT binary_upgrade.set_next_heap_relfilenode('%u'::pg_catalog.oid);\n",
                                                  pg_class_relfilenode);
+               /* only tables have toast tables, not indexes */
+               if (OidIsValid(pg_class_reltoastrelid))
+               {
+                       /*
+                        * One complexity is that the table definition might not require the
+                        * creation of a TOAST table, and the TOAST table might have been
+                        * created long after table creation, when the table was loaded with
+                        * wide data.  By setting the TOAST relfilenode we force creation of
+                        * the TOAST heap and TOAST index by the backend so we can cleanly
+                        * migrate the files during binary migration.
+                        */
+       
+                       appendPQExpBuffer(upgrade_buffer,
+                                                         "SELECT binary_upgrade.set_next_toast_relfilenode('%u'::pg_catalog.oid);\n",
+                                                         pg_class_reltoastrelid);
+       
+                       /* every toast table has an index */
+                       appendPQExpBuffer(upgrade_buffer,
+                                                         "SELECT binary_upgrade.set_next_index_relfilenode('%u'::pg_catalog.oid);\n",
+                                                         pg_class_reltoastidxid);
+               }
+       }
        else
                appendPQExpBuffer(upgrade_buffer,
                                                  "SELECT binary_upgrade.set_next_index_relfilenode('%u'::pg_catalog.oid);\n",
                                                  pg_class_relfilenode);
 
-       if (OidIsValid(pg_class_reltoastrelid))
-       {
-               /*
-                * One complexity is that the table definition might not require the
-                * creation of a TOAST table, and the TOAST table might have been
-                * created long after table creation, when the table was loaded with
-                * wide data.  By setting the TOAST relfilenode we force creation of
-                * the TOAST heap and TOAST index by the backend so we can cleanly
-                * migrate the files during binary migration.
-                */
-
-               appendPQExpBuffer(upgrade_buffer,
-                                                 "SELECT binary_upgrade.set_next_toast_relfilenode('%u'::pg_catalog.oid);\n",
-                                                 pg_class_reltoastrelid);
-
-               /* every toast table has an index */
-               appendPQExpBuffer(upgrade_buffer,
-                                                 "SELECT binary_upgrade.set_next_index_relfilenode('%u'::pg_catalog.oid);\n",
-                                                 pg_class_reltoastidxid);
-       }
        appendPQExpBuffer(upgrade_buffer, "\n");
 
        PQclear(upgrade_res);