]> granicus.if.org Git - postgresql/blobdiff - contrib/pg_upgrade/version_old_8_3.c
Update copyright for 2014
[postgresql] / contrib / pg_upgrade / version_old_8_3.c
index 824c9680547b09640833c4d982bc714bd2125835..f58f74511f756d5ab2ee86d74765bf19bc744646 100644 (file)
@@ -3,10 +3,12 @@
  *
  *     Postgres-version-specific routines
  *
- *     Copyright (c) 2010, PostgreSQL Global Development Group
- *     $PostgreSQL: pgsql/contrib/pg_upgrade/version_old_8_3.c,v 1.6 2010/07/03 16:33:14 momjian Exp $
+ *     Copyright (c) 2010-2014, PostgreSQL Global Development Group
+ *     contrib/pg_upgrade/version_old_8_3.c
  */
 
+#include "postgres_fe.h"
+
 #include "pg_upgrade.h"
 
 #include "access/transam.h"
  *     checks tables and indexes.
  */
 void
-old_8_3_check_for_name_data_type_usage(migratorContext *ctx, Cluster whichCluster)
+old_8_3_check_for_name_data_type_usage(ClusterInfo *cluster)
 {
-       ClusterInfo *active_cluster = (whichCluster == CLUSTER_OLD) ?
-       &ctx->old : &ctx->new;
        int                     dbnum;
        FILE       *script = NULL;
        bool            found = false;
        char            output_path[MAXPGPATH];
 
-       prep_status(ctx, "Checking for invalid 'name' user columns");
+       prep_status("Checking for invalid \"name\" user columns");
 
-       snprintf(output_path, sizeof(output_path), "%s/tables_using_name.txt",
-                        ctx->cwd);
+       snprintf(output_path, sizeof(output_path), "tables_using_name.txt");
 
-       for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
+       for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
        {
                PGresult   *res;
                bool            db_used = false;
@@ -42,8 +41,8 @@ old_8_3_check_for_name_data_type_usage(migratorContext *ctx, Cluster whichCluste
                int                     i_nspname,
                                        i_relname,
                                        i_attname;
-               DbInfo     *active_db = &active_cluster->dbarr.dbs[dbnum];
-               PGconn     *conn = connectToServer(ctx, active_db->db_name, whichCluster);
+               DbInfo     *active_db = &cluster->dbarr.dbs[dbnum];
+               PGconn     *conn = connectToServer(cluster, active_db->db_name);
 
                /*
                 * With a smaller alignment in 8.4, 'name' cannot be used in a
@@ -51,7 +50,7 @@ old_8_3_check_for_name_data_type_usage(migratorContext *ctx, Cluster whichCluste
                 * that condition with enough analysis, but it seems not worth the
                 * trouble.)
                 */
-               res = executeQueryOrDie(ctx, conn,
+               res = executeQueryOrDie(conn,
                                                                "SELECT n.nspname, c.relname, a.attname "
                                                                "FROM   pg_catalog.pg_class c, "
                                                                "               pg_catalog.pg_namespace n, "
@@ -61,8 +60,10 @@ old_8_3_check_for_name_data_type_usage(migratorContext *ctx, Cluster whichCluste
                                                                "               NOT a.attisdropped AND "
                                                                "               a.atttypid = 'pg_catalog.name'::pg_catalog.regtype AND "
                                                                "               c.relnamespace = n.oid AND "
-                                                         "             n.nspname != 'pg_catalog' AND "
-                                                "              n.nspname != 'information_schema'");
+               /* exclude possible orphaned temp tables */
+                                                               "               n.nspname !~ '^pg_temp_' AND "
+                                                "              n.nspname !~ '^pg_toast_temp_' AND "
+                                                               "               n.nspname NOT IN ('pg_catalog', 'information_schema')");
 
                ntups = PQntuples(res);
                i_nspname = PQfnumber(res, "nspname");
@@ -71,11 +72,11 @@ old_8_3_check_for_name_data_type_usage(migratorContext *ctx, Cluster whichCluste
                for (rowno = 0; rowno < ntups; rowno++)
                {
                        found = true;
-                       if (script == NULL && (script = fopen(output_path, "w")) == NULL)
-                               pg_log(ctx, PG_FATAL, "Could not create necessary file:  %s\n", output_path);
+                       if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+                               pg_fatal("could not open file \"%s\": %s\n", output_path, getErrorText(errno));
                        if (!db_used)
                        {
-                               fprintf(script, "Database:  %s\n", active_db->db_name);
+                               fprintf(script, "Database: %s\n", active_db->db_name);
                                db_used = true;
                        }
                        fprintf(script, "  %s.%s.%s\n",
@@ -89,21 +90,21 @@ old_8_3_check_for_name_data_type_usage(migratorContext *ctx, Cluster whichCluste
                PQfinish(conn);
        }
 
+       if (script)
+               fclose(script);
+
        if (found)
        {
-               fclose(script);
-               pg_log(ctx, PG_REPORT, "fatal\n");
-               pg_log(ctx, PG_FATAL,
-                          "| Your installation uses the \"name\" data type in\n"
-                          "| user tables.  This data type changed its internal\n"
-                          "| alignment between your old and new clusters so this\n"
-                          "| cluster cannot currently be upgraded.  You can\n"
-                          "| remove the problem tables and restart the migration.\n"
-                          "| A list of the problem columns is in the file:\n"
-                          "| \t%s\n\n", output_path);
+               pg_log(PG_REPORT, "fatal\n");
+               pg_fatal("Your installation contains the \"name\" data type in user tables.  This\n"
+               "data type changed its internal alignment between your old and new\n"
+                          "clusters so this cluster cannot currently be upgraded.  You can remove\n"
+               "the problem tables and restart the upgrade.  A list of the problem\n"
+                          "columns is in the file:\n"
+                          "    %s\n\n", output_path);
        }
        else
-               check_ok(ctx);
+               check_ok();
 }
 
 
@@ -111,24 +112,21 @@ old_8_3_check_for_name_data_type_usage(migratorContext *ctx, Cluster whichCluste
  * old_8_3_check_for_tsquery_usage()
  *     8.3 -> 8.4
  *     A new 'prefix' field was added to the 'tsquery' data type in 8.4
- *     so migration of such fields is impossible.
+ *     so upgrading of such fields is impossible.
  */
 void
-old_8_3_check_for_tsquery_usage(migratorContext *ctx, Cluster whichCluster)
+old_8_3_check_for_tsquery_usage(ClusterInfo *cluster)
 {
-       ClusterInfo *active_cluster = (whichCluster == CLUSTER_OLD) ?
-       &ctx->old : &ctx->new;
        int                     dbnum;
        FILE       *script = NULL;
        bool            found = false;
        char            output_path[MAXPGPATH];
 
-       prep_status(ctx, "Checking for tsquery user columns");
+       prep_status("Checking for tsquery user columns");
 
-       snprintf(output_path, sizeof(output_path), "%s/tables_using_tsquery.txt",
-                        ctx->cwd);
+       snprintf(output_path, sizeof(output_path), "tables_using_tsquery.txt");
 
-       for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
+       for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
        {
                PGresult   *res;
                bool            db_used = false;
@@ -137,22 +135,25 @@ old_8_3_check_for_tsquery_usage(migratorContext *ctx, Cluster whichCluster)
                int                     i_nspname,
                                        i_relname,
                                        i_attname;
-               DbInfo     *active_db = &active_cluster->dbarr.dbs[dbnum];
-               PGconn     *conn = connectToServer(ctx, active_db->db_name, whichCluster);
+               DbInfo     *active_db = &cluster->dbarr.dbs[dbnum];
+               PGconn     *conn = connectToServer(cluster, active_db->db_name);
 
                /* Find any user-defined tsquery columns */
-               res = executeQueryOrDie(ctx, conn,
+               res = executeQueryOrDie(conn,
                                                                "SELECT n.nspname, c.relname, a.attname "
                                                                "FROM   pg_catalog.pg_class c, "
                                                                "               pg_catalog.pg_namespace n, "
                                                                "               pg_catalog.pg_attribute a "
+               /* materialized views didn't exist in 8.3, so no need to check 'm' */
                                                                "WHERE  c.relkind = 'r' AND "
                                                                "               c.oid = a.attrelid AND "
                                                                "               NOT a.attisdropped AND "
                                                                "               a.atttypid = 'pg_catalog.tsquery'::pg_catalog.regtype AND "
                                                                "               c.relnamespace = n.oid AND "
-                                                         "             n.nspname != 'pg_catalog' AND "
-                                                "              n.nspname != 'information_schema'");
+               /* exclude possible orphaned temp tables */
+                                                               "               n.nspname !~ '^pg_temp_' AND "
+                                                "              n.nspname !~ '^pg_toast_temp_' AND "
+                                                               "               n.nspname NOT IN ('pg_catalog', 'information_schema')");
 
                ntups = PQntuples(res);
                i_nspname = PQfnumber(res, "nspname");
@@ -161,11 +162,11 @@ old_8_3_check_for_tsquery_usage(migratorContext *ctx, Cluster whichCluster)
                for (rowno = 0; rowno < ntups; rowno++)
                {
                        found = true;
-                       if (script == NULL && (script = fopen(output_path, "w")) == NULL)
-                               pg_log(ctx, PG_FATAL, "Could not create necessary file:  %s\n", output_path);
+                       if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+                               pg_fatal("could not open file \"%s\": %s\n", output_path, getErrorText(errno));
                        if (!db_used)
                        {
-                               fprintf(script, "Database:  %s\n", active_db->db_name);
+                               fprintf(script, "Database: %s\n", active_db->db_name);
                                db_used = true;
                        }
                        fprintf(script, "  %s.%s.%s\n",
@@ -179,55 +180,42 @@ old_8_3_check_for_tsquery_usage(migratorContext *ctx, Cluster whichCluster)
                PQfinish(conn);
        }
 
+       if (script)
+               fclose(script);
+
        if (found)
        {
-               fclose(script);
-               pg_log(ctx, PG_REPORT, "fatal\n");
-               pg_log(ctx, PG_FATAL,
-                          "| Your installation uses the \"tsquery\" data type.\n"
-                          "| This data type added a new internal field between\n"
-                          "| your old and new clusters so this cluster cannot\n"
-                          "| currently be upgraded.  You can remove the problem\n"
-                          "| columns and restart the migration.  A list of the\n"
-                          "| problem columns is in the file:\n"
-                          "| \t%s\n\n", output_path);
+               pg_log(PG_REPORT, "fatal\n");
+               pg_fatal("Your installation contains the \"tsquery\" data type.    This data type\n"
+                          "added a new internal field between your old and new clusters so this\n"
+               "cluster cannot currently be upgraded.  You can remove the problem\n"
+                          "columns and restart the upgrade.  A list of the problem columns is in the\n"
+                          "file:\n"
+                          "    %s\n\n", output_path);
        }
        else
-               check_ok(ctx);
+               check_ok();
 }
 
 
 /*
- * old_8_3_check_for_isn_and_int8_passing_mismatch()
+ *     old_8_3_check_ltree_usage()
  *     8.3 -> 8.4
- *     /contrib/isn relies on data type int8, and in 8.4 int8 is now passed
- *     by value.  The schema dumps the CREATE TYPE PASSEDBYVALUE setting so
- *     it must match for the old and new servers.
+ *     The internal ltree structure was changed in 8.4 so upgrading is impossible.
  */
 void
-old_8_3_check_for_isn_and_int8_passing_mismatch(migratorContext *ctx, Cluster whichCluster)
+old_8_3_check_ltree_usage(ClusterInfo *cluster)
 {
-       ClusterInfo *active_cluster = (whichCluster == CLUSTER_OLD) ?
-       &ctx->old : &ctx->new;
        int                     dbnum;
        FILE       *script = NULL;
        bool            found = false;
        char            output_path[MAXPGPATH];
 
-       prep_status(ctx, "Checking for /contrib/isn with bigint-passing mismatch");
-
-       if (ctx->old.controldata.float8_pass_by_value ==
-               ctx->new.controldata.float8_pass_by_value)
-       {
-               /* no mismatch */
-               check_ok(ctx);
-               return;
-       }
+       prep_status("Checking for contrib/ltree");
 
-       snprintf(output_path, sizeof(output_path), "%s/contrib_isn_and_int8_pass_by_value.txt",
-                        ctx->cwd);
+       snprintf(output_path, sizeof(output_path), "contrib_ltree.txt");
 
-       for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
+       for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
        {
                PGresult   *res;
                bool            db_used = false;
@@ -235,16 +223,16 @@ old_8_3_check_for_isn_and_int8_passing_mismatch(migratorContext *ctx, Cluster wh
                int                     rowno;
                int                     i_nspname,
                                        i_proname;
-               DbInfo     *active_db = &active_cluster->dbarr.dbs[dbnum];
-               PGconn     *conn = connectToServer(ctx, active_db->db_name, whichCluster);
+               DbInfo     *active_db = &cluster->dbarr.dbs[dbnum];
+               PGconn     *conn = connectToServer(cluster, active_db->db_name);
 
-               /* Find any functions coming from contrib/isn */
-               res = executeQueryOrDie(ctx, conn,
+               /* Find any functions coming from contrib/ltree */
+               res = executeQueryOrDie(conn,
                                                                "SELECT n.nspname, p.proname "
                                                                "FROM   pg_catalog.pg_proc p, "
                                                                "               pg_catalog.pg_namespace n "
                                                                "WHERE  p.pronamespace = n.oid AND "
-                                                               "               p.probin = '$libdir/isn'");
+                                                               "               p.probin = '$libdir/ltree'");
 
                ntups = PQntuples(res);
                i_nspname = PQfnumber(res, "nspname");
@@ -252,11 +240,12 @@ old_8_3_check_for_isn_and_int8_passing_mismatch(migratorContext *ctx, Cluster wh
                for (rowno = 0; rowno < ntups; rowno++)
                {
                        found = true;
-                       if (script == NULL && (script = fopen(output_path, "w")) == NULL)
-                               pg_log(ctx, PG_FATAL, "Could not create necessary file:  %s\n", output_path);
+                       if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+                               pg_fatal("Could not open file \"%s\": %s\n",
+                                          output_path, getErrorText(errno));
                        if (!db_used)
                        {
-                               fprintf(script, "Database:  %s\n", active_db->db_name);
+                               fprintf(script, "Database: %s\n", active_db->db_name);
                                db_used = true;
                        }
                        fprintf(script, "  %s.%s\n",
@@ -269,23 +258,22 @@ old_8_3_check_for_isn_and_int8_passing_mismatch(migratorContext *ctx, Cluster wh
                PQfinish(conn);
        }
 
+       if (script)
+               fclose(script);
+
        if (found)
        {
-               fclose(script);
-               pg_log(ctx, PG_REPORT, "fatal\n");
-               pg_log(ctx, PG_FATAL,
-                          "| Your installation uses \"/contrib/isn\" functions\n"
-                          "| which rely on the bigint data type.  Your old and\n"
-                          "| new clusters pass bigint values differently so this\n"
-                          "| cluster cannot currently be upgraded.  You can\n"
-                          "| manually migrate data that use \"/contrib/isn\"\n"
-                          "| facilities and remove \"/contrib/isn\" from the\n"
-                          "| old cluster and restart the migration.  A list\n"
-                          "| of the problem functions is in the file:\n"
-                          "| \t%s\n\n", output_path);
+               pg_log(PG_REPORT, "fatal\n");
+               pg_fatal("Your installation contains the \"ltree\" data type.  This data type\n"
+                          "changed its internal storage format between your old and new clusters so this\n"
+                          "cluster cannot currently be upgraded.  You can manually upgrade databases\n"
+                          "that use \"contrib/ltree\" facilities and remove \"contrib/ltree\" from the old\n"
+                          "cluster and restart the upgrade.  A list of the problem functions is in the\n"
+                          "file:\n"
+                          "    %s\n\n", output_path);
        }
        else
-               check_ok(ctx);
+               check_ok();
 }
 
 
@@ -302,48 +290,49 @@ old_8_3_check_for_isn_and_int8_passing_mismatch(migratorContext *ctx, Cluster wh
  *     'c' 'bb' 'aaa'             -- 8.3
  */
 void
-old_8_3_rebuild_tsvector_tables(migratorContext *ctx, bool check_mode,
-                                                               Cluster whichCluster)
+old_8_3_rebuild_tsvector_tables(ClusterInfo *cluster, bool check_mode)
 {
-       ClusterInfo *active_cluster = (whichCluster == CLUSTER_OLD) ?
-       &ctx->old : &ctx->new;
        int                     dbnum;
        FILE       *script = NULL;
        bool            found = false;
        char            output_path[MAXPGPATH];
 
-       prep_status(ctx, "Checking for tsvector user columns");
+       prep_status("Checking for tsvector user columns");
 
-       snprintf(output_path, sizeof(output_path), "%s/rebuild_tsvector_tables.sql",
-                        ctx->cwd);
+       snprintf(output_path, sizeof(output_path), "rebuild_tsvector_tables.sql");
 
-       for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
+       for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
        {
                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,
                                        i_relname,
                                        i_attname;
-               DbInfo     *active_db = &active_cluster->dbarr.dbs[dbnum];
-               PGconn     *conn = connectToServer(ctx, active_db->db_name, whichCluster);
+               DbInfo     *active_db = &cluster->dbarr.dbs[dbnum];
+               PGconn     *conn = connectToServer(cluster, active_db->db_name);
 
                /* Find any user-defined tsvector columns */
-               res = executeQueryOrDie(ctx, conn,
+               res = executeQueryOrDie(conn,
                                                                "SELECT n.nspname, c.relname, a.attname "
                                                                "FROM   pg_catalog.pg_class c, "
                                                                "               pg_catalog.pg_namespace n, "
                                                                "               pg_catalog.pg_attribute a "
+               /* materialized views didn't exist in 8.3, so no need to check 'm' */
                                                                "WHERE  c.relkind = 'r' AND "
                                                                "               c.oid = a.attrelid AND "
                                                                "               NOT a.attisdropped AND "
+               /* child attribute changes are processed by the parent */
+                                                               "               a.attinhcount = 0 AND "
                                                                "               a.atttypid = 'pg_catalog.tsvector'::pg_catalog.regtype AND "
                                                                "               c.relnamespace = n.oid AND "
-                                                         "             n.nspname != 'pg_catalog' AND "
-                                                "              n.nspname != 'information_schema'");
+               /* exclude possible orphaned temp tables */
+                                                               "               n.nspname !~ '^pg_temp_' AND "
+                                                "              n.nspname !~ '^pg_toast_temp_' AND "
+                                                               "               n.nspname NOT IN ('pg_catalog', 'information_schema')");
 
 /*
  *     This macro is used below to avoid reindexing indexes already rebuilt
@@ -355,12 +344,15 @@ old_8_3_rebuild_tsvector_tables(migratorContext *ctx, bool check_mode,
                                                                "FROM   pg_catalog.pg_class c, "                \
                                                                "               pg_catalog.pg_namespace n, "    \
                                                                "               pg_catalog.pg_attribute a "             \
+               /* materialized views didn't exist in 8.3, so no need to check 'm' */ \
                                                                "WHERE  c.relkind = 'r' AND "                   \
                                                                "               c.oid = a.attrelid AND "                \
                                                                "               NOT a.attisdropped AND "                \
+               /* child attribute changes are processed by the parent */               \
+                                                               "               a.attinhcount = 0 AND "                 \
                                                                "               a.atttypid = 'pg_catalog.tsvector'::pg_catalog.regtype AND " \
                                                                "               c.relnamespace = n.oid AND "    \
-                                                               "               n.nspname != 'pg_catalog' AND " \
+                                                               "       n.nspname !~ '^pg_' AND "               \
                                                                "               n.nspname != 'information_schema') "
 
                ntups = PQntuples(res);
@@ -372,97 +364,91 @@ old_8_3_rebuild_tsvector_tables(migratorContext *ctx, bool check_mode,
                        found = true;
                        if (!check_mode)
                        {
-                               if (script == NULL && (script = fopen(output_path, "w")) == NULL)
-                                       pg_log(ctx, PG_FATAL, "Could not create necessary file:  %s\n", output_path);
+                               if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+                                       pg_fatal("could not open file \"%s\": %s\n", output_path, getErrorText(errno));
                                if (!db_used)
                                {
                                        fprintf(script, "\\connect %s\n\n",
-                                                       quote_identifier(ctx, active_db->db_name));
+                                                       quote_identifier(active_db->db_name));
                                        db_used = true;
                                }
 
                                /* 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(ctx, PQgetvalue(res, rowno, i_nspname)),
-                                       quote_identifier(ctx, PQgetvalue(res, rowno, i_relname)));
+                                                quote_identifier(PQgetvalue(res, rowno, i_nspname)),
+                                               quote_identifier(PQgetvalue(res, rowno, i_relname)));
                                }
                                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. */
                                                "TYPE pg_catalog.tsvector USING %s::pg_catalog.text::pg_catalog.tsvector",
-                                       quote_identifier(ctx, PQgetvalue(res, rowno, i_attname)),
-                                  quote_identifier(ctx, PQgetvalue(res, rowno, i_attname)));
+                                               quote_identifier(PQgetvalue(res, rowno, i_attname)),
+                                               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);
 
-               /* XXX Mark tables as not accessable somehow */
+               /* XXX Mark tables as not accessible somehow */
 
                PQfinish(conn);
        }
 
+       if (script)
+               fclose(script);
+
        if (found)
        {
-               if (!check_mode)
-                       fclose(script);
-               report_status(ctx, PG_WARNING, "warning");
+               report_status(PG_WARNING, "warning");
                if (check_mode)
-                       pg_log(ctx, PG_WARNING, "\n"
-                                  "| Your installation contains tsvector columns.\n"
-                                  "| The tsvector internal storage format changed\n"
-                                  "| between your old and new clusters so the tables\n"
-                                  "| must be rebuilt.  After migration, you will be\n"
-                                  "| given instructions.\n\n");
+                       pg_log(PG_WARNING, "\n"
+                                  "Your installation contains tsvector columns.  The tsvector internal\n"
+                                  "storage format changed between your old and new clusters so the tables\n"
+                                  "must be rebuilt.  After upgrading, you will be given instructions.\n\n");
                else
-                       pg_log(ctx, PG_WARNING, "\n"
-                                  "| Your installation contains tsvector columns.\n"
-                                  "| The tsvector internal storage format changed\n"
-                                  "| between your old and new clusters so the tables\n"
-                                  "| must be rebuilt.  The file:\n"
-                                  "| \t%s\n"
-                                  "| when executed by psql by the database super-user\n"
-                                  "| will rebuild all tables with tsvector columns.\n\n",
+                       pg_log(PG_WARNING, "\n"
+                                  "Your installation contains tsvector columns.  The tsvector internal\n"
+                                  "storage format changed between your old and new clusters so the tables\n"
+                                  "must be rebuilt.  The file:\n"
+                                  "    %s\n"
+                                  "when executed by psql by the database superuser will rebuild all tables\n"
+                                  "with tsvector columns.\n\n",
                                   output_path);
        }
        else
-               check_ok(ctx);
+               check_ok();
 }
 
 
 /*
  * old_8_3_invalidate_hash_gin_indexes()
  *     8.3 -> 8.4
- *     Hash, Gin, and GiST index binary format has changes from 8.3->8.4
+ *     Hash and GIN index binary format changed from 8.3->8.4
  */
 void
-old_8_3_invalidate_hash_gin_indexes(migratorContext *ctx, bool check_mode,
-                                                                       Cluster whichCluster)
+old_8_3_invalidate_hash_gin_indexes(ClusterInfo *cluster, bool check_mode)
 {
-       ClusterInfo *active_cluster = (whichCluster == CLUSTER_OLD) ?
-       &ctx->old : &ctx->new;
        int                     dbnum;
        FILE       *script = NULL;
        bool            found = false;
        char            output_path[MAXPGPATH];
 
-       prep_status(ctx, "Checking for hash and gin indexes");
+       prep_status("Checking for hash and GIN indexes");
 
-       snprintf(output_path, sizeof(output_path), "%s/reindex_hash_and_gin.sql",
-                        ctx->cwd);
+       snprintf(output_path, sizeof(output_path), "reindex_hash_and_gin.sql");
 
-       for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
+       for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
        {
                PGresult   *res;
                bool            db_used = false;
@@ -470,17 +456,17 @@ old_8_3_invalidate_hash_gin_indexes(migratorContext *ctx, bool check_mode,
                int                     rowno;
                int                     i_nspname,
                                        i_relname;
-               DbInfo     *active_db = &active_cluster->dbarr.dbs[dbnum];
-               PGconn     *conn = connectToServer(ctx, active_db->db_name, whichCluster);
+               DbInfo     *active_db = &cluster->dbarr.dbs[dbnum];
+               PGconn     *conn = connectToServer(cluster, active_db->db_name);
 
                /* find hash and gin indexes */
-               res = executeQueryOrDie(ctx, conn,
+               res = executeQueryOrDie(conn,
                                                                "SELECT n.nspname, c.relname "
-                                                               "FROM   pg_catalog.pg_class c, "
+                                                               "FROM   pg_catalog.pg_class c, "
                                                                "               pg_catalog.pg_index i, "
                                                                "               pg_catalog.pg_am a, "
                                                                "               pg_catalog.pg_namespace n "
-                                                               "WHERE  i.indexrelid = c.oid AND "
+                                                               "WHERE  i.indexrelid = c.oid AND "
                                                                "               c.relam = a.oid AND "
                                                                "               c.relnamespace = n.oid AND "
                                                        "               a.amname IN ('hash', 'gin') AND "
@@ -494,17 +480,17 @@ old_8_3_invalidate_hash_gin_indexes(migratorContext *ctx, bool check_mode,
                        found = true;
                        if (!check_mode)
                        {
-                               if (script == NULL && (script = fopen(output_path, "w")) == NULL)
-                                       pg_log(ctx, PG_FATAL, "Could not create necessary file:  %s\n", output_path);
+                               if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+                                       pg_fatal("could not open file \"%s\": %s\n", output_path, getErrorText(errno));
                                if (!db_used)
                                {
                                        fprintf(script, "\\connect %s\n",
-                                                       quote_identifier(ctx, active_db->db_name));
+                                                       quote_identifier(active_db->db_name));
                                        db_used = true;
                                }
                                fprintf(script, "REINDEX INDEX %s.%s;\n",
-                                       quote_identifier(ctx, PQgetvalue(res, rowno, i_nspname)),
-                                  quote_identifier(ctx, PQgetvalue(res, rowno, i_relname)));
+                                               quote_identifier(PQgetvalue(res, rowno, i_nspname)),
+                                               quote_identifier(PQgetvalue(res, rowno, i_relname)));
                        }
                }
 
@@ -512,13 +498,13 @@ old_8_3_invalidate_hash_gin_indexes(migratorContext *ctx, bool check_mode,
 
                if (!check_mode && found)
                        /* mark hash and gin indexes as invalid */
-                       PQclear(executeQueryOrDie(ctx, conn,
+                       PQclear(executeQueryOrDie(conn,
                                                                          "UPDATE pg_catalog.pg_index i "
                                                                          "SET  indisvalid = false "
-                                                                         "FROM         pg_catalog.pg_class c, "
+                                                                         "FROM pg_catalog.pg_class c, "
                                                                          "             pg_catalog.pg_am a, "
                                                                          "             pg_catalog.pg_namespace n "
-                                                                         "WHERE        i.indexrelid = c.oid AND "
+                                                                         "WHERE        i.indexrelid = c.oid AND "
                                                                          "             c.relam = a.oid AND "
                                                                          "             c.relnamespace = n.oid AND "
                                                                        "               a.amname IN ('hash', 'gin')"));
@@ -526,34 +512,30 @@ old_8_3_invalidate_hash_gin_indexes(migratorContext *ctx, bool check_mode,
                PQfinish(conn);
        }
 
+       if (script)
+               fclose(script);
+
        if (found)
        {
-               if (!check_mode)
-                       fclose(script);
-               report_status(ctx, PG_WARNING, "warning");
+               report_status(PG_WARNING, "warning");
                if (check_mode)
-                       pg_log(ctx, PG_WARNING, "\n"
-                                  "| Your installation contains hash and/or gin\n"
-                                  "| indexes.  These indexes have different\n"
-                                  "| internal formats between your old and new\n"
-                                  "| clusters so they must be reindexed with the\n"
-                                  "| REINDEX command. After migration, you will\n"
-                                  "| be given REINDEX instructions.\n\n");
+                       pg_log(PG_WARNING, "\n"
+                                  "Your installation contains hash and/or GIN indexes.  These indexes have\n"
+                                  "different internal formats between your old and new clusters, so they\n"
+                                  "must be reindexed with the REINDEX command.  After upgrading, you will\n"
+                                  "be given REINDEX instructions.\n\n");
                else
-                       pg_log(ctx, PG_WARNING, "\n"
-                                  "| Your installation contains hash and/or gin\n"
-                                  "| indexes.  These indexes have different internal\n"
-                                  "| formats between your old and new clusters so\n"
-                                  "| they must be reindexed with the REINDEX command.\n"
-                                  "| The file:\n"
-                                  "| \t%s\n"
-                                  "| when executed by psql by the database super-user\n"
-                                  "| will recreate all invalid indexes; until then,\n"
-                                  "| none of these indexes will be used.\n\n",
+                       pg_log(PG_WARNING, "\n"
+                                  "Your installation contains hash and/or GIN indexes.  These indexes have\n"
+                                  "different internal formats between your old and new clusters, so they\n"
+                                  "must be reindexed with the REINDEX command.  The file:\n"
+                                  "    %s\n"
+                                  "when executed by psql by the database superuser will recreate all invalid\n"
+                         "indexes; until then, none of these indexes will be used.\n\n",
                                   output_path);
        }
        else
-               check_ok(ctx);
+               check_ok();
 }
 
 
@@ -563,22 +545,19 @@ old_8_3_invalidate_hash_gin_indexes(migratorContext *ctx, bool check_mode,
  *     8.4 bpchar_pattern_ops no longer sorts based on trailing spaces
  */
 void
-old_8_3_invalidate_bpchar_pattern_ops_indexes(migratorContext *ctx, bool check_mode,
-                                                                                         Cluster whichCluster)
+old_8_3_invalidate_bpchar_pattern_ops_indexes(ClusterInfo *cluster,
+                                                                                         bool check_mode)
 {
-       ClusterInfo *active_cluster = (whichCluster == CLUSTER_OLD) ?
-       &ctx->old : &ctx->new;
        int                     dbnum;
        FILE       *script = NULL;
        bool            found = false;
        char            output_path[MAXPGPATH];
 
-       prep_status(ctx, "Checking for bpchar_pattern_ops indexes");
+       prep_status("Checking for bpchar_pattern_ops indexes");
 
-       snprintf(output_path, sizeof(output_path), "%s/reindex_bpchar_ops.sql",
-                        ctx->cwd);
+       snprintf(output_path, sizeof(output_path), "reindex_bpchar_ops.sql");
 
-       for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
+       for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
        {
                PGresult   *res;
                bool            db_used = false;
@@ -586,8 +565,8 @@ old_8_3_invalidate_bpchar_pattern_ops_indexes(migratorContext *ctx, bool check_m
                int                     rowno;
                int                     i_nspname,
                                        i_relname;
-               DbInfo     *active_db = &active_cluster->dbarr.dbs[dbnum];
-               PGconn     *conn = connectToServer(ctx, active_db->db_name, whichCluster);
+               DbInfo     *active_db = &cluster->dbarr.dbs[dbnum];
+               PGconn     *conn = connectToServer(cluster, active_db->db_name);
 
                /* find bpchar_pattern_ops indexes */
 
@@ -595,7 +574,7 @@ old_8_3_invalidate_bpchar_pattern_ops_indexes(migratorContext *ctx, bool check_m
                 * Do only non-hash, non-gin indexees;  we already invalidated them
                 * above; no need to reindex twice
                 */
-               res = executeQueryOrDie(ctx, conn,
+               res = executeQueryOrDie(conn,
                                                                "SELECT n.nspname, c.relname "
                                                                "FROM   pg_catalog.pg_index i, "
                                                                "               pg_catalog.pg_class c, "
@@ -620,17 +599,17 @@ old_8_3_invalidate_bpchar_pattern_ops_indexes(migratorContext *ctx, bool check_m
                        found = true;
                        if (!check_mode)
                        {
-                               if (script == NULL && (script = fopen(output_path, "w")) == NULL)
-                                       pg_log(ctx, PG_FATAL, "Could not create necessary file:  %s\n", output_path);
+                               if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+                                       pg_fatal("could not open file \"%s\": %s\n", output_path, getErrorText(errno));
                                if (!db_used)
                                {
                                        fprintf(script, "\\connect %s\n",
-                                                       quote_identifier(ctx, active_db->db_name));
+                                                       quote_identifier(active_db->db_name));
                                        db_used = true;
                                }
                                fprintf(script, "REINDEX INDEX %s.%s;\n",
-                                       quote_identifier(ctx, PQgetvalue(res, rowno, i_nspname)),
-                                  quote_identifier(ctx, PQgetvalue(res, rowno, i_relname)));
+                                               quote_identifier(PQgetvalue(res, rowno, i_nspname)),
+                                               quote_identifier(PQgetvalue(res, rowno, i_relname)));
                        }
                }
 
@@ -638,7 +617,7 @@ old_8_3_invalidate_bpchar_pattern_ops_indexes(migratorContext *ctx, bool check_m
 
                if (!check_mode && found)
                        /* mark bpchar_pattern_ops indexes as invalid */
-                       PQclear(executeQueryOrDie(ctx, conn,
+                       PQclear(executeQueryOrDie(conn,
                                                                          "UPDATE pg_catalog.pg_index i "
                                                                          "SET  indisvalid = false "
                                                                          "FROM pg_catalog.pg_class c, "
@@ -657,34 +636,30 @@ old_8_3_invalidate_bpchar_pattern_ops_indexes(migratorContext *ctx, bool check_m
                PQfinish(conn);
        }
 
+       if (script)
+               fclose(script);
+
        if (found)
        {
-               if (!check_mode)
-                       fclose(script);
-               report_status(ctx, PG_WARNING, "warning");
+               report_status(PG_WARNING, "warning");
                if (check_mode)
-                       pg_log(ctx, PG_WARNING, "\n"
-                                  "| Your installation contains indexes using\n"
-                                  "| \"bpchar_pattern_ops\".  These indexes have\n"
-                                  "| different internal formats between your old and\n"
-                                  "| new clusters so they must be reindexed with the\n"
-                                  "| REINDEX command.  After migration, you will be\n"
-                                  "| given REINDEX instructions.\n\n");
+                       pg_log(PG_WARNING, "\n"
+                                  "Your installation contains indexes using \"bpchar_pattern_ops\".  These\n"
+                                  "indexes have different internal formats between your old and new clusters\n"
+                                  "so they must be reindexed with the REINDEX command.  After upgrading, you\n"
+                                  "will be given REINDEX instructions.\n\n");
                else
-                       pg_log(ctx, PG_WARNING, "\n"
-                                  "| Your installation contains indexes using\n"
-                                  "| \"bpchar_pattern_ops\".  These indexes have\n"
-                                  "| different internal formats between your old and\n"
-                                  "| new clusters so they must be reindexed with the\n"
-                                  "| REINDEX command.  The file:\n"
-                                  "| \t%s\n"
-                                  "| when executed by psql by the database super-user\n"
-                                  "| will recreate all invalid indexes; until then,\n"
-                                  "| none of these indexes will be used.\n\n",
+                       pg_log(PG_WARNING, "\n"
+                                  "Your installation contains indexes using \"bpchar_pattern_ops\".  These\n"
+                                  "indexes have different internal formats between your old and new clusters\n"
+                       "so they must be reindexed with the REINDEX command.  The file:\n"
+                                  "    %s\n"
+                                  "when executed by psql by the database superuser will recreate all invalid\n"
+                         "indexes; until then, none of these indexes will be used.\n\n",
                                   output_path);
        }
        else
-               check_ok(ctx);
+               check_ok();
 }
 
 
@@ -695,24 +670,22 @@ old_8_3_invalidate_bpchar_pattern_ops_indexes(migratorContext *ctx, bool check_m
  *     we don't transfer sequence files but instead use the CREATE SEQUENCE
  *     command from the schema dump, and use setval() to restore the sequence
  *     value and 'is_called' from the old database.  This is safe to run
- *     by pg_upgrade because sequence files are not transfered from the old
+ *     by pg_upgrade because sequence files are not transferred from the old
  *     server, even in link mode.
  */
 char *
-old_8_3_create_sequence_script(migratorContext *ctx, Cluster whichCluster)
+old_8_3_create_sequence_script(ClusterInfo *cluster)
 {
-       ClusterInfo *active_cluster = (whichCluster == CLUSTER_OLD) ?
-       &ctx->old : &ctx->new;
        int                     dbnum;
        FILE       *script = NULL;
        bool            found = false;
-       char       *output_path = pg_malloc(ctx, MAXPGPATH);
+       char       *output_path;
 
-       snprintf(output_path, MAXPGPATH, "%s/adjust_sequences.sql", ctx->cwd);
+       output_path = pg_strdup("adjust_sequences.sql");
 
-       prep_status(ctx, "Creating script to adjust sequences");
+       prep_status("Creating script to adjust sequences");
 
-       for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
+       for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
        {
                PGresult   *res;
                bool            db_used = false;
@@ -720,18 +693,20 @@ old_8_3_create_sequence_script(migratorContext *ctx, Cluster whichCluster)
                int                     rowno;
                int                     i_nspname,
                                        i_relname;
-               DbInfo     *active_db = &active_cluster->dbarr.dbs[dbnum];
-               PGconn     *conn = connectToServer(ctx, active_db->db_name, whichCluster);
+               DbInfo     *active_db = &cluster->dbarr.dbs[dbnum];
+               PGconn     *conn = connectToServer(cluster, active_db->db_name);
 
                /* Find any sequences */
-               res = executeQueryOrDie(ctx, conn,
+               res = executeQueryOrDie(conn,
                                                                "SELECT n.nspname, c.relname "
                                                                "FROM   pg_catalog.pg_class c, "
                                                                "               pg_catalog.pg_namespace n "
                                                                "WHERE  c.relkind = 'S' AND "
                                                                "               c.relnamespace = n.oid AND "
-                                                         "             n.nspname != 'pg_catalog' AND "
-                                                "              n.nspname != 'information_schema'");
+               /* exclude possible orphaned temp tables */
+                                                               "               n.nspname !~ '^pg_temp_' AND "
+                                                "              n.nspname !~ '^pg_toast_temp_' AND "
+                                                               "               n.nspname NOT IN ('pg_catalog', 'information_schema')");
 
                ntups = PQntuples(res);
                i_nspname = PQfnumber(res, "nspname");
@@ -746,28 +721,28 @@ old_8_3_create_sequence_script(migratorContext *ctx, Cluster whichCluster)
 
                        found = true;
 
-                       if (script == NULL && (script = fopen(output_path, "w")) == NULL)
-                               pg_log(ctx, PG_FATAL, "Could not create necessary file:  %s\n", output_path);
+                       if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+                               pg_fatal("could not open file \"%s\": %s\n", output_path, getErrorText(errno));
                        if (!db_used)
                        {
                                fprintf(script, "\\connect %s\n\n",
-                                               quote_identifier(ctx, active_db->db_name));
+                                               quote_identifier(active_db->db_name));
                                db_used = true;
                        }
 
                        /* Find the desired sequence */
-                       seq_res = executeQueryOrDie(ctx, conn,
+                       seq_res = executeQueryOrDie(conn,
                                                                                "SELECT s.last_value, s.is_called "
                                                                                "FROM   %s.%s s",
-                                                                               quote_identifier(ctx, nspname),
-                                                                               quote_identifier(ctx, relname));
+                                                                               quote_identifier(nspname),
+                                                                               quote_identifier(relname));
 
                        assert(PQntuples(seq_res) == 1);
                        i_last_value = PQfnumber(seq_res, "last_value");
                        i_is_called = PQfnumber(seq_res, "is_called");
 
                        fprintf(script, "SELECT setval('%s.%s', %s, '%s');\n",
-                         quote_identifier(ctx, nspname), quote_identifier(ctx, relname),
+                                       quote_identifier(nspname), quote_identifier(relname),
                                        PQgetvalue(seq_res, 0, i_last_value), PQgetvalue(seq_res, 0, i_is_called));
                        PQclear(seq_res);
                }
@@ -778,10 +753,11 @@ old_8_3_create_sequence_script(migratorContext *ctx, Cluster whichCluster)
 
                PQfinish(conn);
        }
-       if (found)
+
+       if (script)
                fclose(script);
 
-       check_ok(ctx);
+       check_ok();
 
        if (found)
                return output_path;