Commit 89c29c03 authored by Tom Lane's avatar Tom Lane

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.
parent 8b255755
...@@ -3462,7 +3462,10 @@ getAggregates(int *numAggs) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment