On Fri, May 25, 2012 at 11:08:10PM -0400, Bruce Momjian wrote: > On Fri, May 25, 2012 at 10:20:29AM -0400, Andrew Dunstan wrote: > > pg_upgrade is a little over-keen about checking for shared libraries > > that back functions. In particular, it checks for libraries that > > support functions created in pg_catalog, even if pg_dump doesn't > > export the function. > > > > The attached patch mimics the filter that pg_dump uses for functions > > so that only the relevant libraries are checked. > > > > This would remove the need for a particularly ugly hack in making > > the 9.1 backport of JSON binary upgradeable. > > Andrew is right that pg_upgrade is overly restrictive in checking _any_ > shared object file referenced in pg_proc. I never expected that > pg_catalog would have such references, but in Andrew's case it does, and > pg_dump doesn't dump them, so I guess pg_upgrade shouldn't check them > either. > > In some sense this is a hack for the JSON type, but it also gives users > a way to create shared object references in old clusters that are _not_ > checked by pg_upgrade, and not migrated to the new server, so I suppose > it is fine.
OK, now I know it is _not_ fine. :-( I just realized the problem as part of debugging the report of a problem with plpython_call_handler(): http://archives.postgresql.org/pgsql-hackers/2012-03/msg01101.php http://archives.postgresql.org/pgsql-bugs/2012-05/msg00205.php The problem is that functions defined in the "pg_catalog" schema, while no explicitly dumped by pg_dump, are implicitly dumped by things like CREATE LANGUAGE plperl. I have added a pg_upgrade C comment documenting this issue in case we revisit it later. -- Bruce Momjian <br...@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com + It's impossible for everything to be true. +
diff --git a/contrib/pg_upgrade/function.c b/contrib/pg_upgrade/function.c new file mode 100644 index e38071e..afa7543 *** a/contrib/pg_upgrade/function.c --- b/contrib/pg_upgrade/function.c *************** get_loadable_libraries(void) *** 142,148 **** DbInfo *active_db = &old_cluster.dbarr.dbs[dbnum]; PGconn *conn = connectToServer(&old_cluster, active_db->db_name); ! /* Fetch all libraries referenced in this DB */ ress[dbnum] = executeQueryOrDie(conn, "SELECT DISTINCT probin " "FROM pg_catalog.pg_proc " --- 142,153 ---- DbInfo *active_db = &old_cluster.dbarr.dbs[dbnum]; PGconn *conn = connectToServer(&old_cluster, active_db->db_name); ! /* ! * Fetch all libraries referenced in this DB. We can't exclude ! * the "pg_catalog" schema because, while such functions are not ! * explicitly dumped by pg_dump, they do reference implicit objects ! * that pg_dump does dump, e.g. creation of the plperl language. ! */ ress[dbnum] = executeQueryOrDie(conn, "SELECT DISTINCT probin " "FROM pg_catalog.pg_proc "
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers