(unnamed)

text/plain

Filename: (unnamed)
Type: text/plain
Part: 0
Message: Fix for pg_upgrade migrating pg_largeobject_metadata
diff --git a/contrib/pg_upgrade/dump.c b/contrib/pg_upgrade/dump.c
index 52ab481..aba95f4 100644
*** /tmp/pgdiff.20347/YPWaqb_dump.c	Wed Jan  5 20:52:07 2011
--- contrib/pg_upgrade/dump.c	Wed Jan  5 20:43:29 2011
*************** generate_old_dump(void)
*** 33,39 ****
   *
   *	This function splits pg_dumpall output into global values and
   *	database creation, and per-db schemas.	This allows us to create
!  *	the toast place holders between restoring these two parts of the
   *	dump.  We split on the first "\connect " after a CREATE ROLE
   *	username match;  this is where the per-db restore starts.
   *
--- 33,39 ----
   *
   *	This function splits pg_dumpall output into global values and
   *	database creation, and per-db schemas.	This allows us to create
!  *	the support functions between restoring these two parts of the
   *	dump.  We split on the first "\connect " after a CREATE ROLE
   *	username match;  this is where the per-db restore starts.
   *
diff --git a/contrib/pg_upgrade/function.c b/contrib/pg_upgrade/function.c
index 2ab8e4f..5675551 100644
*** /tmp/pgdiff.20347/QpVBHa_function.c	Wed Jan  5 20:52:07 2011
--- contrib/pg_upgrade/function.c	Wed Jan  5 20:26:33 2011
***************
*** 13,35 ****
  
  
  /*
!  * install_support_functions()
   *
   * pg_upgrade requires some support functions that enable it to modify
   * backend behavior.
   */
  void
! install_support_functions(void)
  {
! 	int			dbnum;
! 
! 	prep_status("Adding support functions to new cluster");
! 
! 	for (dbnum = 0; dbnum < new_cluster.dbarr.ndbs; dbnum++)
! 	{
! 		DbInfo	   *new_db = &new_cluster.dbarr.dbs[dbnum];
! 		PGconn	   *conn = connectToServer(&new_cluster, new_db->db_name);
! 
  		/* suppress NOTICE of dropped objects */
  		PQclear(executeQueryOrDie(conn,
  								  "SET client_min_messages = warning;"));
--- 13,28 ----
  
  
  /*
!  * install_db_support_functions()
   *
   * pg_upgrade requires some support functions that enable it to modify
   * backend behavior.
   */
  void
! install_db_support_functions(const char *db_name)
  {
! 		PGconn *conn = connectToServer(&new_cluster, db_name);
! 		
  		/* suppress NOTICE of dropped objects */
  		PQclear(executeQueryOrDie(conn,
  								  "SET client_min_messages = warning;"));
*************** install_support_functions(void)
*** 83,91 ****
  								  "RETURNS VOID "
  								  "AS '$libdir/pg_upgrade_support' "
  								  "LANGUAGE C STRICT;"));
  		PQfinish(conn);
- 	}
- 	check_ok();
  }
  
  
--- 76,88 ----
  								  "RETURNS VOID "
  								  "AS '$libdir/pg_upgrade_support' "
  								  "LANGUAGE C STRICT;"));
+ 		PQclear(executeQueryOrDie(conn,
+ 								  "CREATE OR REPLACE FUNCTION "
+ 			 "		binary_upgrade.set_next_pg_authid_oid(OID) "
+ 								  "RETURNS VOID "
+ 								  "AS '$libdir/pg_upgrade_support' "
+ 								  "LANGUAGE C STRICT;"));
  		PQfinish(conn);
  }
  
  
diff --git a/contrib/pg_upgrade/info.c b/contrib/pg_upgrade/info.c
index 578bdb9..339849d 100644
*** /tmp/pgdiff.20347/6HSV7d_info.c	Wed Jan  5 20:52:07 2011
--- contrib/pg_upgrade/info.c	Wed Jan  5 20:17:46 2011
*************** get_rel_infos(ClusterInfo *cluster, DbIn
*** 282,288 ****
  			 "	ON c.relnamespace = n.oid "
  			 "   LEFT OUTER JOIN pg_catalog.pg_tablespace t "
  			 "	ON c.reltablespace = t.oid "
! 			 "WHERE (( n.nspname NOT IN ('pg_catalog', 'information_schema') "
  			 "	AND c.oid >= %u "
  			 "	) OR ( "
  			 "	n.nspname = 'pg_catalog' "
--- 282,288 ----
  			 "	ON c.relnamespace = n.oid "
  			 "   LEFT OUTER JOIN pg_catalog.pg_tablespace t "
  			 "	ON c.reltablespace = t.oid "
! 			 "WHERE (( n.nspname NOT IN ('pg_catalog', 'information_schema', 'binary_upgrade') "
  			 "	AND c.oid >= %u "
  			 "	) OR ( "
  			 "	n.nspname = 'pg_catalog' "
diff --git a/contrib/pg_upgrade/pg_upgrade.c b/contrib/pg_upgrade/pg_upgrade.c
index 64fb8f8..fe7b3db 100644
*** /tmp/pgdiff.20347/2pEOVc_pg_upgrade.c	Wed Jan  5 20:52:07 2011
--- contrib/pg_upgrade/pg_upgrade.c	Wed Jan  5 20:49:07 2011
*************** prepare_new_databases(void)
*** 195,205 ****
  
  	set_frozenxids();
  
  	/*
! 	 * We have to create the databases first so we can create the toast table
! 	 * placeholder relfiles.
  	 */
- 	prep_status("Creating databases in the new cluster");
  	exec_prog(true,
  			  SYSTEMQUOTE "\"%s/psql\" --set ON_ERROR_STOP=on "
  	/* --no-psqlrc prevents AUTOCOMMIT=off */
--- 195,209 ----
  
  	set_frozenxids();
  
+ 	prep_status("Creating databases in the new cluster");
+ 
+ 	/* install support functions in the database used by GLOBALS_DUMP_FILE */
+ 	install_db_support_functions(os_info.user);
+ 
  	/*
! 	 * We have to create the databases first so we can install support
! 	 * functions in all the other databases.
  	 */
  	exec_prog(true,
  			  SYSTEMQUOTE "\"%s/psql\" --set ON_ERROR_STOP=on "
  	/* --no-psqlrc prevents AUTOCOMMIT=off */
*************** prepare_new_databases(void)
*** 218,227 ****
  static void
  create_new_objects(void)
  {
  	/* -- NEW -- */
  	start_postmaster(&new_cluster, false);
  
! 	install_support_functions();
  
  	prep_status("Restoring database schema to new cluster");
  	exec_prog(true,
--- 222,241 ----
  static void
  create_new_objects(void)
  {
+ 	int			dbnum;
+ 
  	/* -- NEW -- */
  	start_postmaster(&new_cluster, false);
  
! 	prep_status("Adding support functions to new cluster");
! 
! 	for (dbnum = 0; dbnum < new_cluster.dbarr.ndbs; dbnum++)
! 	{
! 		DbInfo	   *new_db = &new_cluster.dbarr.dbs[dbnum];
! 
! 		install_db_support_functions(new_db->db_name);
! 	}
! 	check_ok();
  
  	prep_status("Restoring database schema to new cluster");
  	exec_prog(true,
diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h
index d863155..ef2cdff 100644
*** /tmp/pgdiff.20347/gzDtFb_pg_upgrade.h	Wed Jan  5 20:52:07 2011
--- contrib/pg_upgrade/pg_upgrade.h	Wed Jan  5 20:32:45 2011
*************** void		check_hard_link(void);
*** 324,330 ****
  
  /* function.c */
  
! void		install_support_functions(void);
  void		uninstall_support_functions(void);
  void		get_loadable_libraries(void);
  void		check_loadable_libraries(void);
--- 324,330 ----
  
  /* function.c */
  
! void		install_db_support_functions(const char *db_name);
  void		uninstall_support_functions(void);
  void		get_loadable_libraries(void);
  void		check_loadable_libraries(void);
diff --git a/contrib/pg_upgrade_support/pg_upgrade_support.c b/contrib/pg_upgrade_support/pg_upgrade_support.c
index e55e139..31c2b4e 100644
*** /tmp/pgdiff.20347/szwF0a_pg_upgrade_support.c	Wed Jan  5 20:52:07 2011
--- contrib/pg_upgrade_support/pg_upgrade_support.c	Wed Jan  5 20:17:46 2011
*************** extern PGDLLIMPORT Oid binary_upgrade_ne
*** 27,32 ****
--- 27,33 ----
  extern PGDLLIMPORT Oid binary_upgrade_next_toast_relfilenode;
  extern PGDLLIMPORT Oid binary_upgrade_next_index_relfilenode;
  extern PGDLLIMPORT Oid binary_upgrade_next_pg_enum_oid;
+ extern PGDLLIMPORT Oid binary_upgrade_next_pg_authid_oid;
  
  Datum		set_next_pg_type_oid(PG_FUNCTION_ARGS);
  Datum		set_next_pg_type_array_oid(PG_FUNCTION_ARGS);
*************** Datum		set_next_heap_relfilenode(PG_FUNC
*** 35,40 ****
--- 36,42 ----
  Datum		set_next_toast_relfilenode(PG_FUNCTION_ARGS);
  Datum		set_next_index_relfilenode(PG_FUNCTION_ARGS);
  Datum		set_next_pg_enum_oid(PG_FUNCTION_ARGS);
+ Datum		set_next_pg_authid_oid(PG_FUNCTION_ARGS);
  
  PG_FUNCTION_INFO_V1(set_next_pg_type_oid);
  PG_FUNCTION_INFO_V1(set_next_pg_type_array_oid);
*************** PG_FUNCTION_INFO_V1(set_next_heap_relfil
*** 43,48 ****
--- 45,51 ----
  PG_FUNCTION_INFO_V1(set_next_toast_relfilenode);
  PG_FUNCTION_INFO_V1(set_next_index_relfilenode);
  PG_FUNCTION_INFO_V1(set_next_pg_enum_oid);
+ PG_FUNCTION_INFO_V1(set_next_pg_authid_oid);
  
  Datum
  set_next_pg_type_oid(PG_FUNCTION_ARGS)
*************** set_next_pg_enum_oid(PG_FUNCTION_ARGS)
*** 113,115 ****
--- 116,128 ----
  
  	PG_RETURN_VOID();
  }
+ 
+ Datum
+ set_next_pg_authid_oid(PG_FUNCTION_ARGS)
+ {
+ 	Oid			authoid = PG_GETARG_OID(0);
+ 
+ 	binary_upgrade_next_pg_authid_oid = authoid;
+ 	PG_RETURN_VOID();
+ }
+ 
diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c
index be049cb..93bfd40 100644
*** /tmp/pgdiff.20347/AvSkle_user.c	Wed Jan  5 20:52:07 2011
--- src/backend/commands/user.c	Wed Jan  5 20:17:46 2011
***************
*** 35,40 ****
--- 35,43 ----
  #include "utils/syscache.h"
  #include "utils/tqual.h"
  
+ /* Kluge for upgrade-in-place support */
+ Oid			binary_upgrade_next_pg_authid_oid = InvalidOid;
+ 
  
  /* GUC parameter */
  extern bool Password_encryption;
*************** CreateRole(CreateRoleStmt *stmt)
*** 393,398 ****
--- 396,408 ----
  
  	tuple = heap_form_tuple(pg_authid_dsc, new_record, new_record_nulls);
  
+ 	/* Use binary-upgrade override if applicable */
+ 	if (OidIsValid(binary_upgrade_next_pg_authid_oid))
+ 	{
+ 		HeapTupleSetOid(tuple, binary_upgrade_next_pg_authid_oid);
+ 		binary_upgrade_next_pg_authid_oid = InvalidOid;
+ 	}
+ 
  	/*
  	 * Insert new record in the pg_authid table
  	 */
diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c
index 17a73b8..2928232 100644
*** /tmp/pgdiff.20347/aQpZrb_pg_dumpall.c	Wed Jan  5 20:52:07 2011
--- src/bin/pg_dump/pg_dumpall.c	Wed Jan  5 20:17:46 2011
*************** dumpRoles(PGconn *conn)
*** 650,656 ****
  {
  	PQExpBuffer buf = createPQExpBuffer();
  	PGresult   *res;
! 	int			i_rolname,
  				i_rolsuper,
  				i_rolinherit,
  				i_rolcreaterole,
--- 650,657 ----
  {
  	PQExpBuffer buf = createPQExpBuffer();
  	PGresult   *res;
! 	int			i_oid,
! 				i_rolname,
  				i_rolsuper,
  				i_rolinherit,
  				i_rolcreaterole,
*************** dumpRoles(PGconn *conn)
*** 667,700 ****
  	/* note: rolconfig is dumped later */
  	if (server_version >= 90100)
  		printfPQExpBuffer(buf,
! 						  "SELECT rolname, rolsuper, rolinherit, "
  						  "rolcreaterole, rolcreatedb, rolcatupdate, "
  						  "rolcanlogin, rolconnlimit, rolpassword, "
  						  "rolvaliduntil, rolreplication, "
  			  "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment "
  						  "FROM pg_authid "
! 						  "ORDER BY 1");
  	else if (server_version >= 80200)
  		printfPQExpBuffer(buf,
! 						  "SELECT rolname, rolsuper, rolinherit, "
  						  "rolcreaterole, rolcreatedb, rolcatupdate, "
  						  "rolcanlogin, rolconnlimit, rolpassword, "
  						  "rolvaliduntil, false as rolreplication, "
  			  "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment "
  						  "FROM pg_authid "
! 						  "ORDER BY 1");
  	else if (server_version >= 80100)
  		printfPQExpBuffer(buf,
! 						  "SELECT rolname, rolsuper, rolinherit, "
  						  "rolcreaterole, rolcreatedb, rolcatupdate, "
  						  "rolcanlogin, rolconnlimit, rolpassword, "
  						  "rolvaliduntil, false as rolreplication, "
  						  "null as rolcomment "
  						  "FROM pg_authid "
! 						  "ORDER BY 1");
  	else
  		printfPQExpBuffer(buf,
! 						  "SELECT usename as rolname, "
  						  "usesuper as rolsuper, "
  						  "true as rolinherit, "
  						  "usesuper as rolcreaterole, "
--- 668,701 ----
  	/* note: rolconfig is dumped later */
  	if (server_version >= 90100)
  		printfPQExpBuffer(buf,
! 						  "SELECT oid, rolname, rolsuper, rolinherit, "
  						  "rolcreaterole, rolcreatedb, rolcatupdate, "
  						  "rolcanlogin, rolconnlimit, rolpassword, "
  						  "rolvaliduntil, rolreplication, "
  			  "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment "
  						  "FROM pg_authid "
! 						  "ORDER BY 2");
  	else if (server_version >= 80200)
  		printfPQExpBuffer(buf,
! 						  "SELECT oid, rolname, rolsuper, rolinherit, "
  						  "rolcreaterole, rolcreatedb, rolcatupdate, "
  						  "rolcanlogin, rolconnlimit, rolpassword, "
  						  "rolvaliduntil, false as rolreplication, "
  			  "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment "
  						  "FROM pg_authid "
! 						  "ORDER BY 2");
  	else if (server_version >= 80100)
  		printfPQExpBuffer(buf,
! 						  "SELECT oid, rolname, rolsuper, rolinherit, "
  						  "rolcreaterole, rolcreatedb, rolcatupdate, "
  						  "rolcanlogin, rolconnlimit, rolpassword, "
  						  "rolvaliduntil, false as rolreplication, "
  						  "null as rolcomment "
  						  "FROM pg_authid "
! 						  "ORDER BY 2");
  	else
  		printfPQExpBuffer(buf,
! 						  "SELECT 0, usename as rolname, "
  						  "usesuper as rolsuper, "
  						  "true as rolinherit, "
  						  "usesuper as rolcreaterole, "
*************** dumpRoles(PGconn *conn)
*** 708,714 ****
  						  "null as rolcomment "
  						  "FROM pg_shadow "
  						  "UNION ALL "
! 						  "SELECT groname as rolname, "
  						  "false as rolsuper, "
  						  "true as rolinherit, "
  						  "false as rolcreaterole, "
--- 709,715 ----
  						  "null as rolcomment "
  						  "FROM pg_shadow "
  						  "UNION ALL "
! 						  "SELECT 0, groname as rolname, "
  						  "false as rolsuper, "
  						  "true as rolinherit, "
  						  "false as rolcreaterole, "
*************** dumpRoles(PGconn *conn)
*** 723,732 ****
  						  "FROM pg_group "
  						  "WHERE NOT EXISTS (SELECT 1 FROM pg_shadow "
  						  " WHERE usename = groname) "
! 						  "ORDER BY 1");
  
  	res = executeQuery(conn, buf->data);
  
  	i_rolname = PQfnumber(res, "rolname");
  	i_rolsuper = PQfnumber(res, "rolsuper");
  	i_rolinherit = PQfnumber(res, "rolinherit");
--- 724,734 ----
  						  "FROM pg_group "
  						  "WHERE NOT EXISTS (SELECT 1 FROM pg_shadow "
  						  " WHERE usename = groname) "
! 						  "ORDER BY 2");
  
  	res = executeQuery(conn, buf->data);
  
+ 	i_oid = PQfnumber(res, "oid");
  	i_rolname = PQfnumber(res, "rolname");
  	i_rolsuper = PQfnumber(res, "rolsuper");
  	i_rolinherit = PQfnumber(res, "rolinherit");
*************** dumpRoles(PGconn *conn)
*** 751,756 ****
--- 753,768 ----
  
  		resetPQExpBuffer(buf);
  
+ 		if (binary_upgrade)
+ 		{
+ 			Oid			auth_oid = atooid(PQgetvalue(res, i, i_oid));
+ 
+ 			appendPQExpBuffer(buf, "\n-- For binary upgrade, must preserve pg_authid.oid\n");
+ 			appendPQExpBuffer(buf,
+ 			 "SELECT binary_upgrade.set_next_pg_authid_oid('%u'::pg_catalog.oid);\n\n",
+ 							  auth_oid);
+ 		}
+ 
  		/*
  		 * We dump CREATE ROLE followed by ALTER ROLE to ensure that the role
  		 * will acquire the right properties even if it already exists (ie, it