mirror of
https://github.com/postgres/postgres.git
synced 2025-05-11 05:41:32 +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:
parent
8b2557553c
commit
89c29c0331
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user