mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Fix corner case for binary upgrade: extension functions in pg_catalog.
Normally, pg_dump summarily excludes functions in pg_catalog from consideration. However, some extensions may create functions in pg_catalog (adminpack already does that, and extensions for procedural languages will likely do it too). In binary-upgrade mode, we have to dump such functions, or the extension will be incomplete after upgrading. Per experimentation with adminpack.
This commit is contained in:
		@@ -3462,7 +3462,10 @@ getAggregates(int *numAggs)
 | 
				
			|||||||
	/* Make sure we are in proper schema */
 | 
						/* Make sure we are in proper schema */
 | 
				
			||||||
	selectSourceSchema("pg_catalog");
 | 
						selectSourceSchema("pg_catalog");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* find all user-defined aggregates */
 | 
						/*
 | 
				
			||||||
 | 
						 * Find all user-defined aggregates.  See comment in getFuncs() for the
 | 
				
			||||||
 | 
						 * rationale behind the filtering logic.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (g_fout->remoteVersion >= 80200)
 | 
						if (g_fout->remoteVersion >= 80200)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -3471,11 +3474,20 @@ getAggregates(int *numAggs)
 | 
				
			|||||||
						  "pronargs, proargtypes, "
 | 
											  "pronargs, proargtypes, "
 | 
				
			||||||
						  "(%s proowner) AS rolname, "
 | 
											  "(%s proowner) AS rolname, "
 | 
				
			||||||
						  "proacl AS aggacl "
 | 
											  "proacl AS aggacl "
 | 
				
			||||||
						  "FROM pg_proc "
 | 
											  "FROM pg_proc p "
 | 
				
			||||||
						  "WHERE proisagg "
 | 
											  "WHERE proisagg AND ("
 | 
				
			||||||
						  "AND pronamespace != "
 | 
											  "pronamespace != "
 | 
				
			||||||
			   "(SELECT oid FROM pg_namespace WHERE nspname = 'pg_catalog')",
 | 
											  "(SELECT oid FROM pg_namespace "
 | 
				
			||||||
 | 
											  "WHERE nspname = 'pg_catalog')",
 | 
				
			||||||
						  username_subquery);
 | 
											  username_subquery);
 | 
				
			||||||
 | 
							if (binary_upgrade && g_fout->remoteVersion >= 90100)
 | 
				
			||||||
 | 
								appendPQExpBuffer(query,
 | 
				
			||||||
 | 
												  " OR EXISTS(SELECT 1 FROM pg_depend WHERE "
 | 
				
			||||||
 | 
												  "classid = 'pg_proc'::regclass AND "
 | 
				
			||||||
 | 
												  "objid = p.oid AND "
 | 
				
			||||||
 | 
												  "refclassid = 'pg_extension'::regclass AND "
 | 
				
			||||||
 | 
												  "deptype = 'e')");
 | 
				
			||||||
 | 
							appendPQExpBuffer(query, ")");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if (g_fout->remoteVersion >= 70300)
 | 
						else if (g_fout->remoteVersion >= 70300)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -3608,7 +3620,14 @@ getFuncs(int *numFuncs)
 | 
				
			|||||||
	/* Make sure we are in proper schema */
 | 
						/* Make sure we are in proper schema */
 | 
				
			||||||
	selectSourceSchema("pg_catalog");
 | 
						selectSourceSchema("pg_catalog");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* find all user-defined funcs */
 | 
						/*
 | 
				
			||||||
 | 
						 * Find all user-defined functions.  Normally we can exclude functions
 | 
				
			||||||
 | 
						 * in pg_catalog, which is worth doing since there are several thousand
 | 
				
			||||||
 | 
						 * of 'em.  However, there are some extensions that create functions in
 | 
				
			||||||
 | 
						 * pg_catalog.  In normal dumps we can still ignore those --- but in
 | 
				
			||||||
 | 
						 * binary-upgrade mode, we must dump the member objects of the extension,
 | 
				
			||||||
 | 
						 * so be sure to fetch any such functions.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (g_fout->remoteVersion >= 70300)
 | 
						if (g_fout->remoteVersion >= 70300)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -3617,12 +3636,20 @@ getFuncs(int *numFuncs)
 | 
				
			|||||||
						  "pronargs, proargtypes, prorettype, proacl, "
 | 
											  "pronargs, proargtypes, prorettype, proacl, "
 | 
				
			||||||
						  "pronamespace, "
 | 
											  "pronamespace, "
 | 
				
			||||||
						  "(%s proowner) AS rolname "
 | 
											  "(%s proowner) AS rolname "
 | 
				
			||||||
						  "FROM pg_proc "
 | 
											  "FROM pg_proc p "
 | 
				
			||||||
						  "WHERE NOT proisagg "
 | 
											  "WHERE NOT proisagg AND ("
 | 
				
			||||||
						  "AND pronamespace != "
 | 
											  "pronamespace != "
 | 
				
			||||||
						  "(SELECT oid FROM pg_namespace "
 | 
											  "(SELECT oid FROM pg_namespace "
 | 
				
			||||||
						  "WHERE nspname = 'pg_catalog')",
 | 
											  "WHERE nspname = 'pg_catalog')",
 | 
				
			||||||
						  username_subquery);
 | 
											  username_subquery);
 | 
				
			||||||
 | 
							if (binary_upgrade && g_fout->remoteVersion >= 90100)
 | 
				
			||||||
 | 
								appendPQExpBuffer(query,
 | 
				
			||||||
 | 
												  " OR EXISTS(SELECT 1 FROM pg_depend WHERE "
 | 
				
			||||||
 | 
												  "classid = 'pg_proc'::regclass AND "
 | 
				
			||||||
 | 
												  "objid = p.oid AND "
 | 
				
			||||||
 | 
												  "refclassid = 'pg_extension'::regclass AND "
 | 
				
			||||||
 | 
												  "deptype = 'e')");
 | 
				
			||||||
 | 
							appendPQExpBuffer(query, ")");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if (g_fout->remoteVersion >= 70100)
 | 
						else if (g_fout->remoteVersion >= 70100)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -13319,6 +13346,8 @@ getExtensionMembership(ExtensionInfo extinfo[], int numExtensions)
 | 
				
			|||||||
		 */
 | 
							 */
 | 
				
			||||||
		if (!binary_upgrade)
 | 
							if (!binary_upgrade)
 | 
				
			||||||
			dobj->dump = false;
 | 
								dobj->dump = false;
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								dobj->dump = refdobj->dump;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	PQclear(res);
 | 
						PQclear(res);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user