]> granicus.if.org Git - postgresql/commitdiff
Fix dumping of casts and transforms using built-in functions
authorStephen Frost <sfrost@snowman.net>
Wed, 21 Dec 2016 18:47:32 +0000 (13:47 -0500)
committerStephen Frost <sfrost@snowman.net>
Wed, 21 Dec 2016 18:47:32 +0000 (13:47 -0500)
In pg_dump.c dumpCast() and dumpTransform(), we would happily ignore the
cast or transform if it happened to use a built-in function because we
weren't including the information about built-in functions when querying
pg_proc from getFuncs().

Modify the query in getFuncs() to also gather information about
functions which are used by user-defined casts and transforms (where
"user-defined" means "has an OID >= FirstNormalObjectId").  This also
adds to the TAP regression tests for 9.6 and master to cover these
types of objects.

Back-patch all the way for casts, back to 9.5 for transforms.

Discussion: https://www.postgresql.org/message-id/flat/20160504183952.GE10850%40tamriel.snowman.net

src/bin/pg_dump/pg_dump.c

index 36c62363aa036a1e83d6313dd6386442a7c2143a..68468e335bf76fdb7a8159148d25c0910f95eae7 100644 (file)
@@ -3856,7 +3856,9 @@ getFuncs(Archive *fout, int *numFuncs)
         * 3. Otherwise, we normally exclude functions in pg_catalog.  However, if
         * they're members of extensions and we are in binary-upgrade mode then
         * include them, since we want to dump extension members individually in
-        * that mode.
+        * that mode.  Also, if they are used by casts then we need to gather the
+        * information about them, though they won't be dumped if they are
+        * built-in.
         */
 
        if (fout->remoteVersion >= 70300)
@@ -3878,7 +3880,11 @@ getFuncs(Archive *fout, int *numFuncs)
                                                  "\n  AND ("
                                                  "\n  pronamespace != "
                                                  "(SELECT oid FROM pg_namespace "
-                                                 "WHERE nspname = 'pg_catalog')");
+                                                 "WHERE nspname = 'pg_catalog')"
+                                                 "\n  OR EXISTS (SELECT 1 FROM pg_cast"
+                                                 "\n  WHERE pg_cast.oid > '%u'::oid "
+                                                 "\n  AND p.oid = pg_cast.castfunc)",
+                                                 g_last_builtin_oid);
                if (binary_upgrade && fout->remoteVersion >= 90100)
                        appendPQExpBuffer(query,
                                                          "\n  OR EXISTS(SELECT 1 FROM pg_depend WHERE "
@@ -9651,7 +9657,8 @@ dumpCast(Archive *fout, CastInfo *cast)
        {
                funcInfo = findFuncByOid(cast->castfunc);
                if (funcInfo == NULL)
-                       return;
+                       exit_horribly(NULL, "unable to find function definition for OID %u",
+                                                 cast->castfunc);
        }
 
        /*