Bruce Momjian wrote:
> I have applied the attached patch to CVS HEAD and 9.0 that prevent
> migration when any reg* data type is used in a user table (except
> regtype because pg_type.oid is preserved).
> 
> I documented this restriction.  Thanks again for the report.

Attached is a secondary patch for /contrib/isn, in case you want that
too.

-- 
  Bruce Momjian  <br...@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + None of us is going to be here forever. +
Index: contrib/pg_upgrade/check.c
===================================================================
RCS file: /cvsroot/pgsql/contrib/pg_upgrade/check.c,v
retrieving revision 1.13
diff -c -c -r1.13 check.c
*** contrib/pg_upgrade/check.c	25 Jul 2010 03:28:32 -0000	1.13
--- contrib/pg_upgrade/check.c	25 Jul 2010 03:43:07 -0000
***************
*** 14,19 ****
--- 14,21 ----
  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,73 ****
  	 */
  
  	check_for_reg_data_type_usage(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)
--- 65,75 ----
  	 */
  
  	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_name_data_type_usage(ctx, CLUSTER_OLD);
  		old_8_3_check_for_tsquery_usage(ctx, CLUSTER_OLD);
  		if (ctx->check)
***************
*** 444,449 ****
--- 446,543 ----
  
  
  /*
+  * 	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: contrib/pg_upgrade/pg_upgrade.h
===================================================================
RCS file: /cvsroot/pgsql/contrib/pg_upgrade/pg_upgrade.h,v
retrieving revision 1.15
diff -c -c -r1.15 pg_upgrade.h
*** contrib/pg_upgrade/pg_upgrade.h	6 Jul 2010 19:18:55 -0000	1.15
--- contrib/pg_upgrade/pg_upgrade.h	25 Jul 2010 03:43:07 -0000
***************
*** 388,395 ****
  									   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,
--- 388,393 ----
Index: contrib/pg_upgrade/version_old_8_3.c
===================================================================
RCS file: /cvsroot/pgsql/contrib/pg_upgrade/version_old_8_3.c,v
retrieving revision 1.7
diff -c -c -r1.7 version_old_8_3.c
*** contrib/pg_upgrade/version_old_8_3.c	25 Jul 2010 03:28:32 -0000	1.7
--- contrib/pg_upgrade/version_old_8_3.c	25 Jul 2010 03:43:07 -0000
***************
*** 198,295 ****
  
  
  /*
-  * 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
--- 198,203 ----
-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

Reply via email to