From 107943f1a9b2823e5faef78f3ca1400a7612a24e Mon Sep 17 00:00:00 2001 From: Stephen Frost Date: Wed, 21 Dec 2016 13:47:23 -0500 Subject: [PATCH] For 8.0 servers, get last built-in oid from pg_database We didn't start ensuring that all built-in objects had OIDs less than 16384 until 8.1, so for 8.0 servers we still need to query the value out of pg_database. We need this, in particular, to distinguish which casts were built-in and which were user-defined. For HEAD, we only worry about going back to 8.0, for the back-branches, we also ensure that 7.0-7.4 work. Discussion: https://www.postgresql.org/message-id/flat/20160504183952.GE10850%40tamriel.snowman.net --- src/bin/pg_dump/pg_dump.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 3592796cc0b..3e7b6891f2e 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -95,7 +95,10 @@ static const char *lockWaitTimeout; /* subquery used to convert user ID (eg, datdba) to user name */ static const char *username_subquery; -/* obsolete as of 7.3: */ +/* + * For 8.0 and earlier servers, pulled from pg_database, for 8.1+ we use + * FirstNormalObjectId - 1. + */ static Oid g_last_builtin_oid; /* value of the last builtin oid */ /* @@ -705,17 +708,24 @@ main(int argc, char **argv) "Run with --no-synchronized-snapshots instead if you do not need\n" "synchronized snapshots.\n"); - /* Find the last built-in OID, if needed */ - if (fout->remoteVersion < 70300) + /* + * Find the last built-in OID, if needed (prior to 8.1) + * + * With 8.1 and above, we can just use FirstNormalObjectId - 1. + */ + if (fout->remoteVersion < 80100) { if (fout->remoteVersion >= 70100) g_last_builtin_oid = findLastBuiltinOid_V71(fout, PQdb(GetConnection(fout))); else g_last_builtin_oid = findLastBuiltinOid_V70(fout); - if (g_verbose) - write_msg(NULL, "last built-in OID is %u\n", g_last_builtin_oid); } + else + g_last_builtin_oid = FirstNormalObjectId - 1; + + if (g_verbose) + write_msg(NULL, "last built-in OID is %u\n", g_last_builtin_oid); /* Expand schema selection patterns into OID lists */ if (schema_include_patterns.head != NULL) @@ -1429,7 +1439,7 @@ selectDumpableCast(CastInfo *cast) if (checkExtensionMembership(&cast->dobj)) return; /* extension membership overrides all else */ - if (cast->dobj.catId.oid < (Oid) FirstNormalObjectId) + if (cast->dobj.catId.oid <= (Oid) g_last_builtin_oid) cast->dobj.dump = false; else cast->dobj.dump = include_everything; @@ -1449,7 +1459,7 @@ selectDumpableProcLang(ProcLangInfo *plang) if (checkExtensionMembership(&plang->dobj)) return; /* extension membership overrides all else */ - if (plang->dobj.catId.oid < (Oid) FirstNormalObjectId) + if (plang->dobj.catId.oid <= (Oid) g_last_builtin_oid) plang->dobj.dump = false; else plang->dobj.dump = include_everything; @@ -1468,7 +1478,7 @@ selectDumpableProcLang(ProcLangInfo *plang) static void selectDumpableExtension(ExtensionInfo *extinfo) { - if (binary_upgrade && extinfo->dobj.catId.oid < (Oid) FirstNormalObjectId) + if (binary_upgrade && extinfo->dobj.catId.oid <= (Oid) g_last_builtin_oid) extinfo->dobj.dump = false; else extinfo->dobj.dump = include_everything; @@ -8159,8 +8169,8 @@ dumpExtension(Archive *fout, ExtensionInfo *extinfo) /* * We unconditionally create the extension, so we must drop it if it * exists. This could happen if the user deleted 'plpgsql' and then - * readded it, causing its oid to be greater than FirstNormalObjectId. - * The FirstNormalObjectId test was kept to avoid repeatedly dropping + * readded it, causing its oid to be greater than g_last_builtin_oid. + * The g_last_builtin_oid test was kept to avoid repeatedly dropping * and recreating extensions like 'plpgsql'. */ appendPQExpBuffer(q, "DROP EXTENSION IF EXISTS %s;\n", qextname); @@ -14257,10 +14267,10 @@ dumpTableConstraintComment(Archive *fout, ConstraintInfo *coninfo) } /* - * findLastBuiltInOid - + * findLastBuiltinOid - * find the last built in oid * - * For 7.1 and 7.2, we do this by retrieving datlastsysoid from the + * For 7.1 through 8.0, we do this by retrieving datlastsysoid from the * pg_database entry for the current database */ static Oid @@ -14282,7 +14292,7 @@ findLastBuiltinOid_V71(Archive *fout, const char *dbname) } /* - * findLastBuiltInOid - + * findLastBuiltinOid - * find the last built in oid * * For 7.0, we do this by assuming that the last thing that initdb does is to