OSDN Git Service

Adjust check_for_isn_and_int8_passing_mismatch() so it is called for all
authorBruce Momjian <bruce@momjian.us>
Sun, 25 Jul 2010 03:47:29 +0000 (03:47 +0000)
committerBruce Momjian <bruce@momjian.us>
Sun, 25 Jul 2010 03:47:29 +0000 (03:47 +0000)
migrations.

Backpatch to 9.0.

contrib/pg_upgrade/check.c
contrib/pg_upgrade/pg_upgrade.h
contrib/pg_upgrade/version_old_8_3.c

index 60cf86c..62cf556 100644 (file)
@@ -4,7 +4,7 @@
  *     server checks and output routines
  *
  *     Copyright (c) 2010, PostgreSQL Global Development Group
- *     $PostgreSQL: pgsql/contrib/pg_upgrade/check.c,v 1.13 2010/07/25 03:28:32 momjian Exp $
+ *     $PostgreSQL: pgsql/contrib/pg_upgrade/check.c,v 1.14 2010/07/25 03:47:29 momjian Exp $
  */
 
 #include "pg_upgrade.h"
@@ -14,6 +14,8 @@ static void set_locale_and_encoding(migratorContext *ctx, Cluster whichCluster);
 static void check_new_db_is_empty(migratorContext *ctx);
 static void check_locale_and_encoding(migratorContext *ctx, ControlData *oldctrl,
                                                  ControlData *newctrl);
+static void check_for_isn_and_int8_passing_mismatch(migratorContext *ctx,
+                                                                                               Cluster whichCluster);
 static void check_for_reg_data_type_usage(migratorContext *ctx, Cluster whichCluster);
 
 
@@ -63,11 +65,11 @@ check_old_cluster(migratorContext *ctx, bool live_check,
         */
 
        check_for_reg_data_type_usage(ctx, CLUSTER_OLD);
+       check_for_isn_and_int8_passing_mismatch(ctx, CLUSTER_OLD);
 
        /* old = PG 8.3 checks? */
        if (GET_MAJOR_VERSION(ctx->old.major_version) <= 803)
        {
-               old_8_3_check_for_isn_and_int8_passing_mismatch(ctx, CLUSTER_OLD);
                old_8_3_check_for_name_data_type_usage(ctx, CLUSTER_OLD);
                old_8_3_check_for_tsquery_usage(ctx, CLUSTER_OLD);
                if (ctx->check)
@@ -444,6 +446,98 @@ create_script_for_old_cluster_deletion(migratorContext *ctx,
 
 
 /*
+ *     check_for_isn_and_int8_passing_mismatch()
+ *
+ *     /contrib/isn relies on data type int8, and in 8.4 int8 can now be passed
+ *     by value.  The schema dumps the CREATE TYPE PASSEDBYVALUE setting so
+ *     it must match for the old and new servers.
+ */
+void
+check_for_isn_and_int8_passing_mismatch(migratorContext *ctx, Cluster whichCluster)
+{
+       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;
+       }
+
+       snprintf(output_path, sizeof(output_path), "%s/contrib_isn_and_int8_pass_by_value.txt",
+                        ctx->cwd);
+
+       for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
+       {
+               PGresult   *res;
+               bool            db_used = false;
+               int                     ntups;
+               int                     rowno;
+               int                     i_nspname,
+                                       i_proname;
+               DbInfo     *active_db = &active_cluster->dbarr.dbs[dbnum];
+               PGconn     *conn = connectToServer(ctx, active_db->db_name, whichCluster);
+
+               /* Find any functions coming from contrib/isn */
+               res = executeQueryOrDie(ctx, 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'");
+
+               ntups = PQntuples(res);
+               i_nspname = PQfnumber(res, "nspname");
+               i_proname = PQfnumber(res, "proname");
+               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 (!db_used)
+                       {
+                               fprintf(script, "Database:  %s\n", active_db->db_name);
+                               db_used = true;
+                       }
+                       fprintf(script, "  %s.%s\n",
+                                       PQgetvalue(res, rowno, i_nspname),
+                                       PQgetvalue(res, rowno, i_proname));
+               }
+
+               PQclear(res);
+
+               PQfinish(conn);
+       }
+
+       if (found)
+       {
+               fclose(script);
+               pg_log(ctx, PG_REPORT, "fatal\n");
+               pg_log(ctx, PG_FATAL,
+                          "| Your installation contains \"/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);
+       }
+       else
+               check_ok(ctx);
+}
+
+
+/*
  * check_for_reg_data_type_usage()
  *     pg_upgrade only preserves these system values:
  *             pg_class.relfilenode
index b80f327..a80fff7 100644 (file)
@@ -2,7 +2,7 @@
  *     pg_upgrade.h
  *
  *     Copyright (c) 2010, PostgreSQL Global Development Group
- *     $PostgreSQL: pgsql/contrib/pg_upgrade/pg_upgrade.h,v 1.15 2010/07/06 19:18:55 momjian Exp $
+ *     $PostgreSQL: pgsql/contrib/pg_upgrade/pg_upgrade.h,v 1.16 2010/07/25 03:47:29 momjian Exp $
  */
 
 #include "postgres.h"
@@ -388,8 +388,6 @@ void old_8_3_check_for_name_data_type_usage(migratorContext *ctx,
                                                                           Cluster whichCluster);
 void old_8_3_check_for_tsquery_usage(migratorContext *ctx,
                                                                Cluster whichCluster);
-void old_8_3_check_for_isn_and_int8_passing_mismatch(migratorContext *ctx,
-                                                                                               Cluster whichCluster);
 void old_8_3_rebuild_tsvector_tables(migratorContext *ctx,
                                                                bool check_mode, Cluster whichCluster);
 void old_8_3_invalidate_hash_gin_indexes(migratorContext *ctx,
index d9a1ef9..cca5891 100644 (file)
@@ -4,7 +4,7 @@
  *     Postgres-version-specific routines
  *
  *     Copyright (c) 2010, PostgreSQL Global Development Group
- *     $PostgreSQL: pgsql/contrib/pg_upgrade/version_old_8_3.c,v 1.7 2010/07/25 03:28:32 momjian Exp $
+ *     $PostgreSQL: pgsql/contrib/pg_upgrade/version_old_8_3.c,v 1.8 2010/07/25 03:47:29 momjian Exp $
  */
 
 #include "pg_upgrade.h"
@@ -198,98 +198,6 @@ old_8_3_check_for_tsquery_usage(migratorContext *ctx, Cluster whichCluster)
 
 
 /*
- * old_8_3_check_for_isn_and_int8_passing_mismatch()
- *     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.
- */
-void
-old_8_3_check_for_isn_and_int8_passing_mismatch(migratorContext *ctx, Cluster whichCluster)
-{
-       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;
-       }
-
-       snprintf(output_path, sizeof(output_path), "%s/contrib_isn_and_int8_pass_by_value.txt",
-                        ctx->cwd);
-
-       for (dbnum = 0; dbnum < active_cluster->dbarr.ndbs; dbnum++)
-       {
-               PGresult   *res;
-               bool            db_used = false;
-               int                     ntups;
-               int                     rowno;
-               int                     i_nspname,
-                                       i_proname;
-               DbInfo     *active_db = &active_cluster->dbarr.dbs[dbnum];
-               PGconn     *conn = connectToServer(ctx, active_db->db_name, whichCluster);
-
-               /* Find any functions coming from contrib/isn */
-               res = executeQueryOrDie(ctx, 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'");
-
-               ntups = PQntuples(res);
-               i_nspname = PQfnumber(res, "nspname");
-               i_proname = PQfnumber(res, "proname");
-               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 (!db_used)
-                       {
-                               fprintf(script, "Database:  %s\n", active_db->db_name);
-                               db_used = true;
-                       }
-                       fprintf(script, "  %s.%s\n",
-                                       PQgetvalue(res, rowno, i_nspname),
-                                       PQgetvalue(res, rowno, i_proname));
-               }
-
-               PQclear(res);
-
-               PQfinish(conn);
-       }
-
-       if (found)
-       {
-               fclose(script);
-               pg_log(ctx, PG_REPORT, "fatal\n");
-               pg_log(ctx, PG_FATAL,
-                          "| Your installation contains \"/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);
-       }
-       else
-               check_ok(ctx);
-}
-
-
-/*
  * old_8_3_rebuild_tsvector_tables()
  *     8.3 -> 8.4
  * 8.3 sorts lexemes by its length and if lengths are the same then it uses