public inbox for [email protected]
help / color / mirror / Atom feedFrom: Nathan Bossart <[email protected]>
Subject: [PATCH v3 1/4] pg_dump/pg_dumpall: bump minimum supported version to v10
Date: Fri, 17 Apr 2026 10:15:38 -0700
---
doc/src/sgml/ref/pg_dump.sgml | 14 +-
doc/src/sgml/runtime.sgml | 2 +-
src/bin/pg_dump/pg_dump.c | 330 ++--------------------------------
src/bin/pg_dump/pg_dumpall.c | 32 +---
4 files changed, 22 insertions(+), 356 deletions(-)
diff --git a/doc/src/sgml/ref/pg_dump.sgml b/doc/src/sgml/ref/pg_dump.sgml
index ae1bc14d2f2..64a3447e445 100644
--- a/doc/src/sgml/ref/pg_dump.sgml
+++ b/doc/src/sgml/ref/pg_dump.sgml
@@ -407,18 +407,6 @@ PostgreSQL documentation
and there is no way to continue with the dump, so <application>pg_dump</application> has no choice
but to abort the dump.
</para>
- <para>
- To perform a parallel dump, the database server needs to support
- synchronized snapshots, a feature that was introduced in
- <productname>PostgreSQL</productname> 9.2 for primary servers and 10
- for standbys. With this feature, database clients can ensure they see
- the same data set even though they use different connections.
- <command>pg_dump -j</command> uses multiple database connections; it
- connects to the database once with the leader process and once again
- for each worker job. Without the synchronized snapshot feature, the
- different worker jobs wouldn't be guaranteed to see the same data in
- each connection, which could lead to an inconsistent backup.
- </para>
</listitem>
</varlistentry>
@@ -1718,7 +1706,7 @@ CREATE DATABASE foo WITH TEMPLATE template0;
<productname>PostgreSQL</productname> server versions newer than
<application>pg_dump</application>'s version. <application>pg_dump</application> can also
dump from <productname>PostgreSQL</productname> servers older than its own version.
- (Currently, servers back to version 9.2 are supported.)
+ (Currently, servers back to version 10 are supported.)
However, <application>pg_dump</application> cannot dump from
<productname>PostgreSQL</productname> servers newer than its own major version;
it will refuse to even try, rather than risk making an invalid dump.
diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml
index dfa292c2c3a..d9984910cc4 100644
--- a/doc/src/sgml/runtime.sgml
+++ b/doc/src/sgml/runtime.sgml
@@ -1776,7 +1776,7 @@ $ <userinput>kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`</userinput
version of
<productname>PostgreSQL</productname>, to take advantage of enhancements
that might have been made in these programs. Current releases of the
- dump programs can read data from any server version back to 9.2.
+ dump programs can read data from any server version back to 10.
</para>
<para>
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index d56dcc701ce..eed9aaeb7c1 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -977,10 +977,10 @@ main(int argc, char **argv)
/*
- * We allow the server to be back to 9.2, and up to any minor release of
+ * We allow the server to be back to 10, and up to any minor release of
* our own major version. (See also version check in pg_dumpall.c.)
*/
- fout->minRemoteVersion = 90200;
+ fout->minRemoteVersion = 100000;
fout->maxRemoteVersion = (PG_VERSION_NUM / 100) * 100 + 99;
fout->numWorkers = numWorkers;
@@ -1491,9 +1491,7 @@ setup_connection(Archive *AH, const char *dumpencoding,
* Disable timeouts if supported.
*/
ExecuteSqlStatement(AH, "SET statement_timeout = 0");
- if (AH->remoteVersion >= 90300)
ExecuteSqlStatement(AH, "SET lock_timeout = 0");
- if (AH->remoteVersion >= 90600)
ExecuteSqlStatement(AH, "SET idle_in_transaction_session_timeout = 0");
if (AH->remoteVersion >= 170000)
ExecuteSqlStatement(AH, "SET transaction_timeout = 0");
@@ -1507,13 +1505,10 @@ setup_connection(Archive *AH, const char *dumpencoding,
/*
* Adjust row-security mode, if supported.
*/
- if (AH->remoteVersion >= 90500)
- {
if (dopt->enable_row_security)
ExecuteSqlStatement(AH, "SET row_security = on");
else
ExecuteSqlStatement(AH, "SET row_security = off");
- }
/*
* For security reasons, we restrict the expansion of non-system views and
@@ -1568,11 +1563,7 @@ setup_connection(Archive *AH, const char *dumpencoding,
destroyPQExpBuffer(query);
}
else if (AH->numWorkers > 1)
- {
- if (AH->isStandby && AH->remoteVersion < 100000)
- pg_fatal("parallel dumps from standby servers are not supported by this server version");
AH->sync_snapshot_id = get_synchronized_snapshot(AH);
- }
}
/* Set up connection for a parallel worker process */
@@ -1964,12 +1955,7 @@ checkExtensionMembership(DumpableObject *dobj, Archive *fout)
if (fout->dopt->binary_upgrade)
dobj->dump = ext->dobj.dump;
else
- {
- if (fout->remoteVersion < 90600)
- dobj->dump = DUMP_COMPONENT_NONE;
- else
dobj->dump = ext->dobj.dump_contains & (DUMP_COMPONENT_ACL);
- }
return true;
}
@@ -2000,11 +1986,10 @@ selectDumpableNamespace(NamespaceInfo *nsinfo, Archive *fout)
simple_oid_list_member(&schema_include_oids,
nsinfo->dobj.catId.oid) ?
DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
- else if (fout->remoteVersion >= 90600 &&
- strcmp(nsinfo->dobj.name, "pg_catalog") == 0)
+ else if (strcmp(nsinfo->dobj.name, "pg_catalog") == 0)
{
/*
- * In 9.6 and above, we dump out any ACLs defined in pg_catalog, if
+ * We dump out any ACLs defined in pg_catalog, if
* they are interesting (and not the original ACLs which were set at
* initdb time, see pg_init_privs).
*/
@@ -2213,8 +2198,7 @@ selectDumpableProcLang(ProcLangInfo *plang, Archive *fout)
else
{
if (plang->dobj.catId.oid <= g_last_builtin_oid)
- plang->dobj.dump = fout->remoteVersion < 90600 ?
- DUMP_COMPONENT_NONE : DUMP_COMPONENT_ACL;
+ plang->dobj.dump = DUMP_COMPONENT_ACL;
else
plang->dobj.dump = DUMP_COMPONENT_ALL;
}
@@ -2231,13 +2215,6 @@ selectDumpableProcLang(ProcLangInfo *plang, Archive *fout)
static void
selectDumpableAccessMethod(AccessMethodInfo *method, Archive *fout)
{
- /* see getAccessMethods() comment about v9.6. */
- if (fout->remoteVersion < 90600)
- {
- method->dobj.dump = DUMP_COMPONENT_NONE;
- return;
- }
-
if (checkExtensionMembership(&method->dobj, fout))
return; /* extension membership overrides all else */
@@ -3123,10 +3100,6 @@ buildMatViewRefreshDependencies(Archive *fout)
i_objid,
i_refobjid;
- /* No Mat Views before 9.3. */
- if (fout->remoteVersion < 90300)
- return;
-
query = createPQExpBuffer();
appendPQExpBufferStr(query, "WITH RECURSIVE w AS "
@@ -3325,10 +3298,7 @@ dumpDatabase(Archive *fout)
"datcollate, datctype, datfrozenxid, "
"datacl, acldefault('d', datdba) AS acldefault, "
"datistemplate, datconnlimit, ");
- if (fout->remoteVersion >= 90300)
appendPQExpBufferStr(dbQry, "datminmxid, ");
- else
- appendPQExpBufferStr(dbQry, "0 AS datminmxid, ");
if (fout->remoteVersion >= 170000)
appendPQExpBufferStr(dbQry, "datlocprovider, datlocale, datcollversion, ");
else if (fout->remoteVersion >= 150000)
@@ -3670,17 +3640,11 @@ dumpDatabase(Archive *fout)
ii_oid,
ii_relminmxid;
- if (fout->remoteVersion >= 90300)
appendPQExpBuffer(loFrozenQry, "SELECT relfrozenxid, relminmxid, relfilenode, oid\n"
"FROM pg_catalog.pg_class\n"
"WHERE oid IN (%u, %u, %u, %u);\n",
LargeObjectRelationId, LargeObjectLOidPNIndexId,
LargeObjectMetadataRelationId, LargeObjectMetadataOidIndexId);
- else
- appendPQExpBuffer(loFrozenQry, "SELECT relfrozenxid, 0 AS relminmxid, relfilenode, oid\n"
- "FROM pg_catalog.pg_class\n"
- "WHERE oid IN (%u, %u);\n",
- LargeObjectRelationId, LargeObjectLOidPNIndexId);
lo_res = ExecuteSqlQuery(fout, loFrozenQry->data, PGRES_TUPLES_OK);
@@ -4243,10 +4207,6 @@ getPolicies(Archive *fout, TableInfo tblinfo[], int numTables)
j,
ntups;
- /* No policies before 9.5 */
- if (fout->remoteVersion < 90500)
- return;
-
/* Skip if --no-policies was specified */
if (dopt->no_policies)
return;
@@ -4316,10 +4276,7 @@ getPolicies(Archive *fout, TableInfo tblinfo[], int numTables)
printfPQExpBuffer(query,
"SELECT pol.oid, pol.tableoid, pol.polrelid, pol.polname, pol.polcmd, ");
- if (fout->remoteVersion >= 100000)
appendPQExpBufferStr(query, "pol.polpermissive, ");
- else
- appendPQExpBufferStr(query, "'t' as polpermissive, ");
appendPQExpBuffer(query,
"CASE WHEN pol.polroles = '{0}' THEN NULL ELSE "
" pg_catalog.array_to_string(ARRAY(SELECT pg_catalog.quote_ident(rolname) from pg_catalog.pg_roles WHERE oid = ANY(pol.polroles)), ', ') END AS polroles, "
@@ -4534,7 +4491,7 @@ getPublications(Archive *fout)
int i,
ntups;
- if (dopt->no_publications || fout->remoteVersion < 100000)
+ if (dopt->no_publications)
return;
query = createPQExpBuffer();
@@ -4897,7 +4854,7 @@ getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables)
j,
ntups;
- if (dopt->no_publications || fout->remoteVersion < 100000)
+ if (dopt->no_publications)
return;
query = createPQExpBuffer();
@@ -5187,7 +5144,7 @@ getSubscriptions(Archive *fout)
int i,
ntups;
- if (dopt->no_subscriptions || fout->remoteVersion < 100000)
+ if (dopt->no_subscriptions)
return;
if (!is_superuser(fout))
@@ -6675,24 +6632,12 @@ getAccessMethods(Archive *fout)
query = createPQExpBuffer();
/*
- * Select all access methods from pg_am table. v9.6 introduced CREATE
- * ACCESS METHOD, so earlier versions usually have only built-in access
- * methods. v9.6 also changed the access method API, replacing dozens of
- * pg_am columns with amhandler. Even if a user created an access method
- * by "INSERT INTO pg_am", we have no way to translate pre-v9.6 pg_am
- * columns to a v9.6+ CREATE ACCESS METHOD. Hence, before v9.6, read
- * pg_am just to facilitate findAccessMethodByOid() providing the
- * OID-to-name mapping.
+ * Select all access methods from pg_am table.
*/
appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, ");
- if (fout->remoteVersion >= 90600)
appendPQExpBufferStr(query,
"amtype, "
"amhandler::pg_catalog.regproc AS amhandler ");
- else
- appendPQExpBufferStr(query,
- "'i'::pg_catalog.\"char\" AS amtype, "
- "'-'::pg_catalog.regproc AS amhandler ");
appendPQExpBufferStr(query, "FROM pg_am");
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
@@ -6878,15 +6823,12 @@ getAggregates(Archive *fout)
int i_proowner;
int i_aggacl;
int i_acldefault;
+ const char *agg_check;
/*
* Find all interesting aggregates. See comment in getFuncs() for the
* rationale behind the filtering logic.
*/
- if (fout->remoteVersion >= 90600)
- {
- const char *agg_check;
-
agg_check = (fout->remoteVersion >= 110000 ? "p.prokind = 'a'"
: "p.proisagg");
@@ -6916,29 +6858,6 @@ getAggregates(Archive *fout)
"refclassid = 'pg_extension'::regclass AND "
"deptype = 'e')");
appendPQExpBufferChar(query, ')');
- }
- else
- {
- appendPQExpBufferStr(query, "SELECT tableoid, oid, proname AS aggname, "
- "pronamespace AS aggnamespace, "
- "pronargs, proargtypes, "
- "proowner, "
- "proacl AS aggacl, "
- "acldefault('f', proowner) AS acldefault "
- "FROM pg_proc p "
- "WHERE proisagg AND ("
- "pronamespace != "
- "(SELECT oid FROM pg_namespace "
- "WHERE nspname = 'pg_catalog')");
- if (dopt->binary_upgrade)
- appendPQExpBufferStr(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')");
- appendPQExpBufferChar(query, ')');
- }
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
@@ -7021,6 +6940,7 @@ getFuncs(Archive *fout)
int i_prorettype;
int i_proacl;
int i_acldefault;
+ const char *not_agg_check;
/*
* Find all interesting functions. This is a bit complicated:
@@ -7039,14 +6959,10 @@ getFuncs(Archive *fout)
* include them, since we want to dump extension members individually in
* that mode. Also, if they are used by casts or transforms then we need
* to gather the information about them, though they won't be dumped if
- * they are built-in. Also, in 9.6 and up, include functions in
+ * they are built-in. Also, include functions in
* pg_catalog if they have an ACL different from what's shown in
* pg_init_privs (so we have to join to pg_init_privs; annoying).
*/
- if (fout->remoteVersion >= 90600)
- {
- const char *not_agg_check;
-
not_agg_check = (fout->remoteVersion >= 110000 ? "p.prokind <> 'a'"
: "NOT p.proisagg");
@@ -7090,46 +7006,6 @@ getFuncs(Archive *fout)
appendPQExpBufferStr(query,
"\n OR p.proacl IS DISTINCT FROM pip.initprivs");
appendPQExpBufferChar(query, ')');
- }
- else
- {
- appendPQExpBuffer(query,
- "SELECT tableoid, oid, proname, prolang, "
- "pronargs, proargtypes, prorettype, proacl, "
- "acldefault('f', proowner) AS acldefault, "
- "pronamespace, "
- "proowner "
- "FROM pg_proc p "
- "WHERE NOT proisagg"
- "\n AND NOT EXISTS (SELECT 1 FROM pg_depend "
- "WHERE classid = 'pg_proc'::regclass AND "
- "objid = p.oid AND deptype = 'i')"
- "\n AND ("
- "\n pronamespace != "
- "(SELECT oid FROM pg_namespace "
- "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 (fout->remoteVersion >= 90500)
- appendPQExpBuffer(query,
- "\n OR EXISTS (SELECT 1 FROM pg_transform"
- "\n WHERE pg_transform.oid > '%u'::oid"
- "\n AND (p.oid = pg_transform.trffromsql"
- "\n OR p.oid = pg_transform.trftosql))",
- g_last_builtin_oid);
-
- if (dopt->binary_upgrade)
- appendPQExpBufferStr(query,
- "\n OR EXISTS(SELECT 1 FROM pg_depend WHERE "
- "classid = 'pg_proc'::regclass AND "
- "objid = p.oid AND "
- "refclassid = 'pg_extension'::regclass AND "
- "deptype = 'e')");
- appendPQExpBufferChar(query, ')');
- }
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
@@ -7378,64 +7254,31 @@ getTables(Archive *fout, int *numTables)
appendPQExpBufferStr(query,
"c.relhasoids, ");
- if (fout->remoteVersion >= 90300)
appendPQExpBufferStr(query,
"c.relispopulated, ");
- else
- appendPQExpBufferStr(query,
- "'t' as relispopulated, ");
- if (fout->remoteVersion >= 90400)
appendPQExpBufferStr(query,
"c.relreplident, ");
- else
- appendPQExpBufferStr(query,
- "'d' AS relreplident, ");
- if (fout->remoteVersion >= 90500)
appendPQExpBufferStr(query,
"c.relrowsecurity, c.relforcerowsecurity, ");
- else
- appendPQExpBufferStr(query,
- "false AS relrowsecurity, "
- "false AS relforcerowsecurity, ");
- if (fout->remoteVersion >= 90300)
appendPQExpBufferStr(query,
"c.relminmxid, tc.relminmxid AS tminmxid, ");
- else
- appendPQExpBufferStr(query,
- "0 AS relminmxid, 0 AS tminmxid, ");
- if (fout->remoteVersion >= 90300)
appendPQExpBufferStr(query,
"array_remove(array_remove(c.reloptions,'check_option=local'),'check_option=cascaded') AS reloptions, "
"CASE WHEN 'check_option=local' = ANY (c.reloptions) THEN 'LOCAL'::text "
"WHEN 'check_option=cascaded' = ANY (c.reloptions) THEN 'CASCADED'::text ELSE NULL END AS checkoption, ");
- else
- appendPQExpBufferStr(query,
- "c.reloptions, NULL AS checkoption, ");
- if (fout->remoteVersion >= 90600)
appendPQExpBufferStr(query,
"am.amname, ");
- else
- appendPQExpBufferStr(query,
- "NULL AS amname, ");
- if (fout->remoteVersion >= 90600)
appendPQExpBufferStr(query,
"(d.deptype = 'i') IS TRUE AS is_identity_sequence, ");
- else
- appendPQExpBufferStr(query,
- "false AS is_identity_sequence, ");
- if (fout->remoteVersion >= 100000)
appendPQExpBufferStr(query,
"c.relispartition AS ispartition ");
- else
- appendPQExpBufferStr(query,
- "false AS ispartition ");
/*
* Left join to pg_depend to pick up dependency info linking sequences to
@@ -7453,9 +7296,8 @@ getTables(Archive *fout, int *numTables)
"LEFT JOIN pg_tablespace tsp ON (tsp.oid = c.reltablespace)\n");
/*
- * In 9.6 and up, left join to pg_am to pick up the amname.
+ * Left join to pg_am to pick up the amname.
*/
- if (fout->remoteVersion >= 90600)
appendPQExpBufferStr(query,
"LEFT JOIN pg_am am ON (c.relam = am.oid)\n");
@@ -8028,12 +7870,8 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
"t.reloptions AS indreloptions, ");
- if (fout->remoteVersion >= 90400)
appendPQExpBufferStr(query,
"i.indisreplident, ");
- else
- appendPQExpBufferStr(query,
- "false AS indisreplident, ");
if (fout->remoteVersion >= 110000)
appendPQExpBufferStr(query,
@@ -8318,10 +8156,6 @@ getExtendedStatistics(Archive *fout)
int i_stattarget;
int i;
- /* Extended statistics were new in v10 */
- if (fout->remoteVersion < 100000)
- return;
-
query = createPQExpBuffer();
if (fout->remoteVersion < 130000)
@@ -8988,10 +8822,6 @@ getEventTriggers(Archive *fout)
i_evtenabled;
int ntups;
- /* Before 9.3, there are no event triggers */
- if (fout->remoteVersion < 90300)
- return;
-
query = createPQExpBuffer();
appendPQExpBufferStr(query,
@@ -9258,10 +9088,6 @@ getTransforms(Archive *fout)
int i_trffromsql;
int i_trftosql;
- /* Transforms didn't exist pre-9.5 */
- if (fout->remoteVersion < 90500)
- return;
-
query = createPQExpBuffer();
appendPQExpBufferStr(query, "SELECT tableoid, oid, "
@@ -9489,12 +9315,8 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
appendPQExpBufferStr(q,
"'' AS attcompression,\n");
- if (fout->remoteVersion >= 100000)
appendPQExpBufferStr(q,
"a.attidentity,\n");
- else
- appendPQExpBufferStr(q,
- "'' AS attidentity,\n");
if (fout->remoteVersion >= 110000)
appendPQExpBufferStr(q,
@@ -10897,8 +10719,6 @@ getAdditionalACLs(Archive *fout)
PQclear(res);
/* Fetch initial-privileges data */
- if (fout->remoteVersion >= 90600)
- {
printfPQExpBuffer(query,
"SELECT objoid, classoid, objsubid, privtype, initprivs "
"FROM pg_init_privs");
@@ -10966,7 +10786,6 @@ getAdditionalACLs(Archive *fout)
}
}
PQclear(res);
- }
destroyPQExpBuffer(query);
}
@@ -11141,15 +10960,6 @@ fetchAttributeStats(Archive *fout)
static bool restarted;
int max_rels = MAX_ATTR_STATS_RELS;
- /*
- * Our query for retrieving statistics for multiple relations uses WITH
- * ORDINALITY and multi-argument UNNEST(), both of which were introduced
- * in v9.4. For older versions, we resort to gathering statistics for a
- * single relation at a time.
- */
- if (fout->remoteVersion < 90400)
- max_rels = 1;
-
/* If we're just starting, set our TOC pointer. */
if (!te)
te = AH->toc->next;
@@ -11320,16 +11130,11 @@ dumpRelationStats_dumper(Archive *fout, const void *userArg, const TocEntry *te)
* The results must be in the order of the relations supplied in the
* parameters to ensure we remain in sync as we walk through the TOC.
*
- * For v9.4 through v18, the redundant filter clause on s.tablename =
+ * For versions before 19, the redundant filter clause on s.tablename =
* ANY(...) seems sufficient to convince the planner to use
* pg_class_relname_nsp_index, which avoids a full scan of pg_stats.
* In newer versions, pg_stats returns the table OIDs, eliminating the
* need for that hack.
- *
- * Our query for retrieving statistics for multiple relations uses
- * WITH ORDINALITY and multi-argument UNNEST(), both of which were
- * introduced in v9.4. For older versions, we resort to gathering
- * statistics for a single relation at a time.
*/
if (fout->remoteVersion >= 190000)
appendPQExpBufferStr(query,
@@ -11337,7 +11142,7 @@ dumpRelationStats_dumper(Archive *fout, const void *userArg, const TocEntry *te)
"JOIN unnest($1) WITH ORDINALITY AS u (tableid, ord) "
"ON s.tableid = u.tableid "
"ORDER BY u.ord, s.attname, s.inherited");
- else if (fout->remoteVersion >= 90400)
+ else
appendPQExpBufferStr(query,
"FROM pg_catalog.pg_stats s "
"JOIN unnest($1, $2) WITH ORDINALITY AS u (schemaname, tablename, ord) "
@@ -11345,12 +11150,6 @@ dumpRelationStats_dumper(Archive *fout, const void *userArg, const TocEntry *te)
"AND s.tablename = u.tablename "
"WHERE s.tablename = ANY($2) "
"ORDER BY u.ord, s.attname, s.inherited");
- else
- appendPQExpBufferStr(query,
- "FROM pg_catalog.pg_stats s "
- "WHERE s.schemaname = $1[1] "
- "AND s.tablename = $2[1] "
- "ORDER BY s.attname, s.inherited");
ExecuteSqlStatement(fout, query->data);
@@ -13672,19 +13471,11 @@ dumpFunc(Archive *fout, const FuncInfo *finfo)
"pg_catalog.pg_get_function_result(p.oid) AS funcresult,\n"
"proleakproof,\n");
- if (fout->remoteVersion >= 90500)
appendPQExpBufferStr(query,
"array_to_string(protrftypes, ' ') AS protrftypes,\n");
- else
- appendPQExpBufferStr(query,
- "NULL AS protrftypes,\n");
- if (fout->remoteVersion >= 90600)
appendPQExpBufferStr(query,
"proparallel,\n");
- else
- appendPQExpBufferStr(query,
- "'u' AS proparallel,\n");
if (fout->remoteVersion >= 110000)
appendPQExpBufferStr(query,
@@ -15174,14 +14965,9 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
/* Get collation-specific details */
appendPQExpBufferStr(query, "SELECT ");
- if (fout->remoteVersion >= 100000)
appendPQExpBufferStr(query,
"collprovider, "
"collversion, ");
- else
- appendPQExpBufferStr(query,
- "'c' AS collprovider, "
- "NULL AS collversion, ");
if (fout->remoteVersion >= 120000)
appendPQExpBufferStr(query,
@@ -15588,7 +15374,6 @@ dumpAgg(Archive *fout, const AggInfo *agginfo)
"pg_catalog.pg_get_function_arguments(p.oid) AS funcargs,\n"
"pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs,\n");
- if (fout->remoteVersion >= 90400)
appendPQExpBufferStr(query,
"aggkind,\n"
"aggmtransfn,\n"
@@ -15600,31 +15385,12 @@ dumpAgg(Archive *fout, const AggInfo *agginfo)
"aggtransspace,\n"
"aggmtransspace,\n"
"aggminitval,\n");
- else
- appendPQExpBufferStr(query,
- "'n' AS aggkind,\n"
- "'-' AS aggmtransfn,\n"
- "'-' AS aggminvtransfn,\n"
- "'-' AS aggmfinalfn,\n"
- "0 AS aggmtranstype,\n"
- "false AS aggfinalextra,\n"
- "false AS aggmfinalextra,\n"
- "0 AS aggtransspace,\n"
- "0 AS aggmtransspace,\n"
- "NULL AS aggminitval,\n");
- if (fout->remoteVersion >= 90600)
appendPQExpBufferStr(query,
"aggcombinefn,\n"
"aggserialfn,\n"
"aggdeserialfn,\n"
"proparallel,\n");
- else
- appendPQExpBufferStr(query,
- "'-' AS aggcombinefn,\n"
- "'-' AS aggserialfn,\n"
- "'-' AS aggdeserialfn,\n"
- "'u' AS proparallel,\n");
if (fout->remoteVersion >= 110000)
appendPQExpBufferStr(query,
@@ -17084,8 +16850,6 @@ dumpTable(Archive *fout, const TableInfo *tbinfo)
appendPQExpBufferStr(query,
"PREPARE getColumnACLs(pg_catalog.oid) AS\n");
- if (fout->remoteVersion >= 90600)
- {
/*
* In principle we should call acldefault('c', relowner) to
* get the default ACL for a column. However, we don't
@@ -17110,17 +16874,6 @@ dumpTable(Archive *fout, const TableInfo *tbinfo)
"NOT at.attisdropped "
"AND (at.attacl IS NOT NULL OR pip.initprivs IS NOT NULL) "
"ORDER BY at.attnum");
- }
- else
- {
- appendPQExpBufferStr(query,
- "SELECT attname, attacl, '{}' AS acldefault, "
- "NULL AS privtype, NULL AS initprivs "
- "FROM pg_catalog.pg_attribute "
- "WHERE attrelid = $1 AND NOT attisdropped "
- "AND attacl IS NOT NULL "
- "ORDER BY attnum");
- }
ExecuteSqlStatement(fout, query->data);
@@ -19410,16 +19163,10 @@ collectSequences(Archive *fout)
const char *query;
/*
- * Before Postgres 10, sequence metadata is in the sequence itself. With
- * some extra effort, we might be able to use the sorted table for those
- * versions, but for now it seems unlikely to be worth it.
- *
* Since version 18, we can gather the sequence data in this query with
* pg_get_sequence_data(), but we only do so for non-schema-only dumps.
*/
- if (fout->remoteVersion < 100000)
- return;
- else if (fout->remoteVersion < 180000 ||
+ if (fout->remoteVersion < 180000 ||
(!fout->dopt->dumpData && !fout->dopt->sequence_data))
query = "SELECT seqrelid, format_type(seqtypid, NULL), "
"seqstart, seqincrement, "
@@ -19477,59 +19224,20 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo)
PQExpBuffer delqry = createPQExpBuffer();
char *qseqname;
TableInfo *owning_tab = NULL;
+ SequenceItem key = {0};
qseqname = pg_strdup(fmtId(tbinfo->dobj.name));
/*
- * For versions >= 10, the sequence information is gathered in a sorted
+ * The sequence information is gathered in a sorted
* table before any calls to dumpSequence(). See collectSequences() for
* more information.
*/
- if (fout->remoteVersion >= 100000)
- {
- SequenceItem key = {0};
-
Assert(sequences);
key.oid = tbinfo->dobj.catId.oid;
seq = bsearch(&key, sequences, nsequences,
sizeof(SequenceItem), SequenceItemCmp);
- }
- else
- {
- PGresult *res;
-
- /*
- * Before PostgreSQL 10, sequence metadata is in the sequence itself.
- *
- * Note: it might seem that 'bigint' potentially needs to be
- * schema-qualified, but actually that's a keyword.
- */
- appendPQExpBuffer(query,
- "SELECT 'bigint' AS sequence_type, "
- "start_value, increment_by, max_value, min_value, "
- "cache_value, is_cycled FROM %s",
- fmtQualifiedDumpable(tbinfo));
-
- res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
-
- if (PQntuples(res) != 1)
- pg_fatal(ngettext("query to get data of sequence \"%s\" returned %d row (expected 1)",
- "query to get data of sequence \"%s\" returned %d rows (expected 1)",
- PQntuples(res)),
- tbinfo->dobj.name, PQntuples(res));
-
- seq = pg_malloc0_object(SequenceItem);
- seq->seqtype = parse_sequence_type(PQgetvalue(res, 0, 0));
- seq->startv = strtoi64(PQgetvalue(res, 0, 1), NULL, 10);
- seq->incby = strtoi64(PQgetvalue(res, 0, 2), NULL, 10);
- seq->maxv = strtoi64(PQgetvalue(res, 0, 3), NULL, 10);
- seq->minv = strtoi64(PQgetvalue(res, 0, 4), NULL, 10);
- seq->cache = strtoi64(PQgetvalue(res, 0, 5), NULL, 10);
- seq->cycled = (strcmp(PQgetvalue(res, 0, 6), "t") == 0);
-
- PQclear(res);
- }
/* Calculate default limits for a sequence of this type */
is_ascending = (seq->incby >= 0);
@@ -19708,8 +19416,6 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo)
tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
tbinfo->dobj.catId, 0, tbinfo->dobj.dumpId);
- if (fout->remoteVersion < 100000)
- pg_free(seq);
destroyPQExpBuffer(query);
destroyPQExpBuffer(delqry);
free(qseqname);
diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c
index c1f43113c53..5b10f7122b7 100644
--- a/src/bin/pg_dump/pg_dumpall.c
+++ b/src/bin/pg_dump/pg_dumpall.c
@@ -693,11 +693,11 @@ main(int argc, char *argv[])
fout->verbose = verbose;
/*
- * We allow the server to be back to 9.2, and up to any minor release
+ * We allow the server to be back to 10, and up to any minor release
* of our own major version. (See also version check in
* pg_dumpall.c.)
*/
- fout->minRemoteVersion = 90200;
+ fout->minRemoteVersion = 100000;
fout->maxRemoteVersion = (PG_VERSION_NUM / 100) * 100 + 99;
fout->numWorkers = 1;
@@ -954,17 +954,11 @@ dropRoles(PGconn *conn)
int i_rolname;
int i;
- if (server_version >= 90600)
printfPQExpBuffer(buf,
"SELECT rolname "
"FROM %s "
"WHERE rolname !~ '^pg_' "
"ORDER BY 1", role_catalog);
- else
- printfPQExpBuffer(buf,
- "SELECT rolname "
- "FROM %s "
- "ORDER BY 1", role_catalog);
res = executeQuery(conn, buf->data);
@@ -1041,7 +1035,6 @@ dumpRoles(PGconn *conn)
* Notes: rolconfig is dumped later, and pg_authid must be used for
* extracting rolcomment regardless of role_catalog.
*/
- if (server_version >= 90600)
printfPQExpBuffer(buf,
"SELECT oid, rolname, rolsuper, rolinherit, "
"rolcreaterole, rolcreatedb, "
@@ -1052,27 +1045,6 @@ dumpRoles(PGconn *conn)
"FROM %s "
"WHERE rolname !~ '^pg_' "
"ORDER BY 2", role_catalog);
- else if (server_version >= 90500)
- printfPQExpBuffer(buf,
- "SELECT oid, rolname, rolsuper, rolinherit, "
- "rolcreaterole, rolcreatedb, "
- "rolcanlogin, rolconnlimit, rolpassword, "
- "rolvaliduntil, rolreplication, rolbypassrls, "
- "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment, "
- "rolname = current_user AS is_current_user "
- "FROM %s "
- "ORDER BY 2", role_catalog);
- else
- printfPQExpBuffer(buf,
- "SELECT oid, rolname, rolsuper, rolinherit, "
- "rolcreaterole, rolcreatedb, "
- "rolcanlogin, rolconnlimit, rolpassword, "
- "rolvaliduntil, rolreplication, "
- "false as rolbypassrls, "
- "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment, "
- "rolname = current_user AS is_current_user "
- "FROM %s "
- "ORDER BY 2", role_catalog);
res = executeQuery(conn, buf->data);
--
2.50.1 (Apple Git-155)
--6vzYk1swa63ey9i6
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
filename=v3-0002-pg_upgrade-bump-minimum-supported-version-to-v10.patch
view thread (758+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected]
Subject: Re: [PATCH v3 1/4] pg_dump/pg_dumpall: bump minimum supported version to v10
In-Reply-To: <no-message-id-145609@localhost>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox