diff --git a/doc/src/sgml/ref/pg_dump.sgml b/doc/src/sgml/ref/pg_dump.sgml index 7682226b99..96cbc76e79 100644 --- a/doc/src/sgml/ref/pg_dump.sgml +++ b/doc/src/sgml/ref/pg_dump.sgml @@ -398,16 +398,6 @@ PostgreSQL documentation different worker jobs wouldn't be guaranteed to see the same data in each connection, which could lead to an inconsistent backup. - - If you want to run a parallel dump of a pre-9.2 server, you need to make sure that the - database content doesn't change from between the time the leader connects to the - database until the last worker job has connected to the database. The easiest way to - do this is to halt any data modifying processes (DDL and DML) accessing the database - before starting the backup. You also need to specify the - parameter when running - pg_dump -j against a pre-9.2 PostgreSQL - server. - @@ -945,9 +935,10 @@ PostgreSQL documentation - This option allows running pg_dump -j against a pre-9.2 - server, see the documentation of the parameter - for more details. + This option allows running pg_dump -j against a + pre-v10 standby server, at the cost of possibly producing an + inconsistent dump. See the documentation of the + parameter for more details. @@ -1381,7 +1372,7 @@ CREATE DATABASE foo WITH TEMPLATE template0; PostgreSQL server versions newer than pg_dump's version. pg_dump can also dump from PostgreSQL servers older than its own version. - (Currently, servers back to version 8.0 are supported.) + (Currently, servers back to version 9.2 are supported.) However, pg_dump cannot dump from PostgreSQL servers newer than its own major version; it will refuse to even try, rather than risk making an invalid dump. diff --git a/src/bin/pg_dump/dumputils.c b/src/bin/pg_dump/dumputils.c index 6e216313c6..dfc96bc98b 100644 --- a/src/bin/pg_dump/dumputils.c +++ b/src/bin/pg_dump/dumputils.c @@ -227,10 +227,6 @@ buildACLCommands(const char *name, const char *subname, const char *nspname, appendPQExpBuffer(firstsql, "%s FROM ", name); if (grantee->len == 0) appendPQExpBufferStr(firstsql, "PUBLIC;\n"); - else if (strncmp(grantee->data, "group ", - strlen("group ")) == 0) - appendPQExpBuffer(firstsql, "GROUP %s;\n", - fmtId(grantee->data + strlen("group "))); else appendPQExpBuffer(firstsql, "%s;\n", fmtId(grantee->data)); @@ -247,14 +243,9 @@ buildACLCommands(const char *name, const char *subname, const char *nspname, * public privileges are added in new versions: the REVOKE ALL will revoke * them, leading to behavior different from what the old version had, * which is generally not what's wanted. So add back default privs if the - * source database is too old to have had that particular priv. + * source database is too old to have had that particular priv. (As of + * right now, no such cases exist in supported versions.) */ - if (remoteVersion < 80200 && strcmp(type, "DATABASE") == 0) - { - /* database CONNECT priv didn't exist before 8.2 */ - appendPQExpBuffer(firstsql, "%sGRANT CONNECT ON %s %s TO PUBLIC;\n", - prefix, type, name); - } /* * Scan individual ACL items to be granted. @@ -306,10 +297,6 @@ buildACLCommands(const char *name, const char *subname, const char *nspname, appendPQExpBuffer(thissql, "%s TO ", name); if (grantee->len == 0) appendPQExpBufferStr(thissql, "PUBLIC;\n"); - else if (strncmp(grantee->data, "group ", - strlen("group ")) == 0) - appendPQExpBuffer(thissql, "GROUP %s;\n", - fmtId(grantee->data + strlen("group "))); else appendPQExpBuffer(thissql, "%s;\n", fmtId(grantee->data)); } @@ -322,10 +309,6 @@ buildACLCommands(const char *name, const char *subname, const char *nspname, appendPQExpBuffer(thissql, "%s TO ", name); if (grantee->len == 0) appendPQExpBufferStr(thissql, "PUBLIC"); - else if (strncmp(grantee->data, "group ", - strlen("group ")) == 0) - appendPQExpBuffer(thissql, "GROUP %s", - fmtId(grantee->data + strlen("group "))); else appendPQExpBufferStr(thissql, fmtId(grantee->data)); appendPQExpBufferStr(thissql, " WITH GRANT OPTION;\n"); @@ -420,16 +403,12 @@ buildDefaultACLCommands(const char *type, const char *nspname, /* * This will parse an aclitem string, having the general form * username=privilegecodes/grantor - * or - * group groupname=privilegecodes/grantor - * (the "group" case occurs only with servers before 8.1). * * Returns true on success, false on parse error. On success, the components * of the string are returned in the PQExpBuffer parameters. * - * The returned grantee string will be the dequoted username or groupname - * (preceded with "group " in the latter case). Note that a grant to PUBLIC - * is represented by an empty grantee string. The returned grantor is the + * The returned grantee string will be the dequoted username, or an empty + * string in the case of a grant to PUBLIC. The returned grantor is the * dequoted grantor name. Privilege characters are translated to GRANT/REVOKE * comma-separated privileges lists. If "privswgo" is non-NULL, the result is * separate lists for privileges with grant option ("privswgo") and without @@ -522,8 +501,7 @@ do { \ { CONVERT_PRIV('d', "DELETE"); CONVERT_PRIV('t', "TRIGGER"); - if (remoteVersion >= 80400) - CONVERT_PRIV('D', "TRUNCATE"); + CONVERT_PRIV('D', "TRUNCATE"); } } diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index 59f4fbb2cc..8903a694ae 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -904,13 +904,10 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel) StartTransaction(&AH->public); /* - * If the server version is >= 8.4, make sure we issue - * TRUNCATE with ONLY so that child tables are not - * wiped. + * Issue TRUNCATE with ONLY so that child tables are + * not wiped. */ - ahprintf(AH, "TRUNCATE TABLE %s%s;\n\n", - (PQserverVersion(AH->connection) >= 80400 ? - "ONLY " : ""), + ahprintf(AH, "TRUNCATE TABLE ONLY %s;\n\n", fmtQualifiedId(te->namespace, te->tag)); } diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 10a86f9810..326441a76a 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -96,10 +96,6 @@ static bool dosync = true; /* Issue fsync() to make dump durable on disk. */ /* subquery used to convert user ID (eg, datdba) to user name */ static const char *username_subquery; -/* - * 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 */ /* The specified names/patterns should to match at least one entity */ @@ -178,7 +174,6 @@ static void expand_table_name_patterns(Archive *fout, static NamespaceInfo *findNamespace(Oid nsoid); static void dumpTableData(Archive *fout, const TableDataInfo *tdinfo); static void refreshMatViewData(Archive *fout, const TableDataInfo *tdinfo); -static void guessConstraintInheritance(TableInfo *tblinfo, int numTables); static void getAdditionalACLs(Archive *fout); static void dumpCommentExtended(Archive *fout, const char *type, const char *name, const char *namespace, @@ -268,17 +263,11 @@ static void buildMatViewRefreshDependencies(Archive *fout); static void getTableDataFKConstraints(void); static char *format_function_arguments(const FuncInfo *finfo, const char *funcargs, bool is_agg); -static char *format_function_arguments_old(Archive *fout, - const FuncInfo *finfo, int nallargs, - char **allargtypes, - char **argmodes, - char **argnames); static char *format_function_signature(Archive *fout, const FuncInfo *finfo, bool honor_quotes); static char *convertRegProcReference(const char *proc); static char *getFormattedOperatorName(const char *oproid); static char *convertTSFunction(Archive *fout, Oid funcOid); -static Oid findLastBuiltinOid_V71(Archive *fout); static const char *getFormattedTypeName(Archive *fout, Oid oid, OidOptions opts); static void getBlobs(Archive *fout); static void dumpBlob(Archive *fout, const BlobInfo *binfo); @@ -735,10 +724,10 @@ main(int argc, char **argv) /* - * We allow the server to be back to 8.4, and up to any minor release of + * We allow the server to be back to 9.2, and up to any minor release of * our own major version. (See also version check in pg_dumpall.c.) */ - fout->minRemoteVersion = 80400; + fout->minRemoteVersion = 90200; fout->maxRemoteVersion = (PG_VERSION_NUM / 100) * 100 + 99; fout->numWorkers = numWorkers; @@ -750,13 +739,6 @@ main(int argc, char **argv) ConnectDatabase(fout, &dopt.cparams, false); setup_connection(fout, dumpencoding, dumpsnapshot, use_role); - /* - * Disable security label support if server version < v9.1.x (prevents - * access to nonexistent pg_seclabel catalog) - */ - if (fout->remoteVersion < 90100) - dopt.no_security_labels = 1; - /* * On hot standbys, never try to dump unlogged table data, since it will * just throw an error. @@ -765,31 +747,14 @@ main(int argc, char **argv) dopt.no_unlogged_table_data = true; /* Select the appropriate subquery to convert user IDs to names */ - if (fout->remoteVersion >= 80100) - username_subquery = "SELECT rolname FROM pg_catalog.pg_roles WHERE oid ="; - else - username_subquery = "SELECT usename FROM pg_catalog.pg_user WHERE usesysid ="; - - /* check the version for the synchronized snapshots feature */ - if (numWorkers > 1 && fout->remoteVersion < 90200 - && !dopt.no_synchronized_snapshots) - fatal("Synchronized snapshots are not supported by this server version.\n" - "Run with --no-synchronized-snapshots instead if you do not need\n" - "synchronized snapshots."); - - /* check the version when a snapshot is explicitly specified by user */ - if (dumpsnapshot && fout->remoteVersion < 90200) - fatal("Exported snapshots are not supported by this server version."); + username_subquery = "SELECT rolname FROM pg_catalog.pg_roles WHERE oid ="; /* * 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) - g_last_builtin_oid = findLastBuiltinOid_V71(fout); - else - g_last_builtin_oid = FirstNormalObjectId - 1; + g_last_builtin_oid = FirstNormalObjectId - 1; pg_log_info("last built-in OID is %u", g_last_builtin_oid); @@ -857,9 +822,6 @@ main(int argc, char **argv) */ tblinfo = getSchemaData(fout, &numTables); - if (fout->remoteVersion < 80400) - guessConstraintInheritance(tblinfo, numTables); - if (!dopt.schemaOnly) { getTableData(&dopt, tblinfo, numTables, 0); @@ -1136,7 +1098,7 @@ setup_connection(Archive *AH, const char *dumpencoding, use_role = AH->use_role; /* Set the role if requested */ - if (use_role && AH->remoteVersion >= 80100) + if (use_role) { PQExpBuffer query = createPQExpBuffer(); @@ -1153,8 +1115,7 @@ setup_connection(Archive *AH, const char *dumpencoding, ExecuteSqlStatement(AH, "SET DATESTYLE = ISO"); /* Likewise, avoid using sql_standard intervalstyle */ - if (AH->remoteVersion >= 80400) - ExecuteSqlStatement(AH, "SET INTERVALSTYLE = POSTGRES"); + ExecuteSqlStatement(AH, "SET INTERVALSTYLE = POSTGRES"); /* * Use an explicitly specified extra_float_digits if it has been provided. @@ -1170,17 +1131,14 @@ setup_connection(Archive *AH, const char *dumpencoding, ExecuteSqlStatement(AH, q->data); destroyPQExpBuffer(q); } - else if (AH->remoteVersion >= 90000) - ExecuteSqlStatement(AH, "SET extra_float_digits TO 3"); else - ExecuteSqlStatement(AH, "SET extra_float_digits TO 2"); + ExecuteSqlStatement(AH, "SET extra_float_digits TO 3"); /* - * If synchronized scanning is supported, disable it, to prevent - * unpredictable changes in row ordering across a dump and reload. + * Disable synchronized scanning, to prevent unpredictable changes in row + * ordering across a dump and reload. */ - if (AH->remoteVersion >= 80300) - ExecuteSqlStatement(AH, "SET synchronize_seqscans TO off"); + ExecuteSqlStatement(AH, "SET synchronize_seqscans TO off"); /* * Disable timeouts if supported. @@ -1194,7 +1152,7 @@ setup_connection(Archive *AH, const char *dumpencoding, /* * Quote all identifiers, if requested. */ - if (quote_all_identifiers && AH->remoteVersion >= 90100) + if (quote_all_identifiers) ExecuteSqlStatement(AH, "SET quote_all_identifiers = true"); /* @@ -1218,31 +1176,23 @@ setup_connection(Archive *AH, const char *dumpencoding, * Start transaction-snapshot mode transaction to dump consistent data. */ ExecuteSqlStatement(AH, "BEGIN"); - if (AH->remoteVersion >= 90100) - { - /* - * To support the combination of serializable_deferrable with the jobs - * option we use REPEATABLE READ for the worker connections that are - * passed a snapshot. As long as the snapshot is acquired in a - * SERIALIZABLE, READ ONLY, DEFERRABLE transaction, its use within a - * REPEATABLE READ transaction provides the appropriate integrity - * guarantees. This is a kluge, but safe for back-patching. - */ - if (dopt->serializable_deferrable && AH->sync_snapshot_id == NULL) - ExecuteSqlStatement(AH, - "SET TRANSACTION ISOLATION LEVEL " - "SERIALIZABLE, READ ONLY, DEFERRABLE"); - else - ExecuteSqlStatement(AH, - "SET TRANSACTION ISOLATION LEVEL " - "REPEATABLE READ, READ ONLY"); - } - else - { + + /* + * To support the combination of serializable_deferrable with the jobs + * option we use REPEATABLE READ for the worker connections that are + * passed a snapshot. As long as the snapshot is acquired in a + * SERIALIZABLE, READ ONLY, DEFERRABLE transaction, its use within a + * REPEATABLE READ transaction provides the appropriate integrity + * guarantees. This is a kluge, but safe for back-patching. + */ + if (dopt->serializable_deferrable && AH->sync_snapshot_id == NULL) ExecuteSqlStatement(AH, "SET TRANSACTION ISOLATION LEVEL " - "SERIALIZABLE, READ ONLY"); - } + "SERIALIZABLE, READ ONLY, DEFERRABLE"); + else + ExecuteSqlStatement(AH, + "SET TRANSACTION ISOLATION LEVEL " + "REPEATABLE READ, READ ONLY"); /* * If user specified a snapshot to use, select that. In a parallel dump @@ -1262,7 +1212,6 @@ setup_connection(Archive *AH, const char *dumpencoding, destroyPQExpBuffer(query); } else if (AH->numWorkers > 1 && - AH->remoteVersion >= 90200 && !dopt->no_synchronized_snapshots) { if (AH->isStandby && AH->remoteVersion < 100000) @@ -1989,7 +1938,6 @@ dumpTableData_copy(Archive *fout, const void *dcontext) */ if (tdinfo->filtercond || tbinfo->relkind == RELKIND_FOREIGN_TABLE) { - /* Note: this syntax is only supported in 8.2 and up */ appendPQExpBufferStr(q, "COPY (SELECT "); /* klugery to get rid of parens in column list */ if (strlen(column_list) > 2) @@ -2780,82 +2728,6 @@ getTableDataFKConstraints(void) } -/* - * guessConstraintInheritance: - * In pre-8.4 databases, we can't tell for certain which constraints - * are inherited. We assume a CHECK constraint is inherited if its name - * matches the name of any constraint in the parent. Originally this code - * tried to compare the expression texts, but that can fail for various - * reasons --- for example, if the parent and child tables are in different - * schemas, reverse-listing of function calls may produce different text - * (schema-qualified or not) depending on search path. - * - * In 8.4 and up we can rely on the conislocal field to decide which - * constraints must be dumped; much safer. - * - * This function assumes all conislocal flags were initialized to true. - * It clears the flag on anything that seems to be inherited. - */ -static void -guessConstraintInheritance(TableInfo *tblinfo, int numTables) -{ - int i, - j, - k; - - for (i = 0; i < numTables; i++) - { - TableInfo *tbinfo = &(tblinfo[i]); - int numParents; - TableInfo **parents; - TableInfo *parent; - - /* Some kinds never have parents */ - if (tbinfo->relkind == RELKIND_SEQUENCE || - tbinfo->relkind == RELKIND_VIEW || - tbinfo->relkind == RELKIND_MATVIEW) - continue; - - /* Don't bother computing anything for non-target tables, either */ - if (!(tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)) - continue; - - numParents = tbinfo->numParents; - parents = tbinfo->parents; - - if (numParents == 0) - continue; /* nothing to see here, move along */ - - /* scan for inherited CHECK constraints */ - for (j = 0; j < tbinfo->ncheck; j++) - { - ConstraintInfo *constr; - - constr = &(tbinfo->checkexprs[j]); - - for (k = 0; k < numParents; k++) - { - int l; - - parent = parents[k]; - for (l = 0; l < parent->ncheck; l++) - { - ConstraintInfo *pconstr = &(parent->checkexprs[l]); - - if (strcmp(pconstr->dobj.name, constr->dobj.name) == 0) - { - constr->conislocal = false; - break; - } - } - if (!constr->conislocal) - break; - } - } - } -} - - /* * dumpDatabase: * dump the database definition @@ -2919,7 +2791,7 @@ dumpDatabase(Archive *fout) "WHERE datname = current_database()", username_subquery); } - else if (fout->remoteVersion >= 90200) + else { appendPQExpBuffer(dbQry, "SELECT tableoid, oid, datname, " "(%s datdba) AS dba, " @@ -2934,49 +2806,6 @@ dumpDatabase(Archive *fout) "WHERE datname = current_database()", username_subquery); } - else if (fout->remoteVersion >= 80400) - { - appendPQExpBuffer(dbQry, "SELECT tableoid, oid, datname, " - "(%s datdba) AS dba, " - "pg_encoding_to_char(encoding) AS encoding, " - "datcollate, datctype, datfrozenxid, 0 AS datminmxid, " - "datacl, NULL AS acldefault, " - "datistemplate, datconnlimit, " - "(SELECT spcname FROM pg_tablespace t WHERE t.oid = dattablespace) AS tablespace, " - "shobj_description(oid, 'pg_database') AS description " - - "FROM pg_database " - "WHERE datname = current_database()", - username_subquery); - } - else if (fout->remoteVersion >= 80200) - { - appendPQExpBuffer(dbQry, "SELECT tableoid, oid, datname, " - "(%s datdba) AS dba, " - "pg_encoding_to_char(encoding) AS encoding, " - "NULL AS datcollate, NULL AS datctype, datfrozenxid, 0 AS datminmxid, " - "datacl, NULL AS acldefault, " - "datistemplate, datconnlimit, " - "(SELECT spcname FROM pg_tablespace t WHERE t.oid = dattablespace) AS tablespace, " - "shobj_description(oid, 'pg_database') AS description " - - "FROM pg_database " - "WHERE datname = current_database()", - username_subquery); - } - else - { - appendPQExpBuffer(dbQry, "SELECT tableoid, oid, datname, " - "(%s datdba) AS dba, " - "pg_encoding_to_char(encoding) AS encoding, " - "NULL AS datcollate, NULL AS datctype, datfrozenxid, 0 AS datminmxid, " - "datacl, NULL AS acldefault, " - "datistemplate, -1 AS datconnlimit, " - "(SELECT spcname FROM pg_tablespace t WHERE t.oid = dattablespace) AS tablespace " - "FROM pg_database " - "WHERE datname = current_database()", - username_subquery); - } res = ExecuteSqlQueryForSingleRow(fout, dbQry->data); @@ -3077,7 +2906,6 @@ dumpDatabase(Archive *fout) appendPQExpBuffer(labelq, "DATABASE %s", qdatname); /* Dump DB comment if any */ - if (fout->remoteVersion >= 80200) { /* * 8.2 and up keep comments on shared objects in a shared table, so we @@ -3108,14 +2936,9 @@ dumpDatabase(Archive *fout) .nDeps = 1)); } } - else - { - dumpComment(fout, "DATABASE", qdatname, NULL, dba, - dbCatId, 0, dbDumpId); - } /* Dump DB security label, if enabled */ - if (!dopt->no_security_labels && fout->remoteVersion >= 90200) + if (!dopt->no_security_labels) { PGresult *shres; PQExpBuffer seclabelQry; @@ -3281,63 +3104,36 @@ dumpDatabaseConfig(Archive *AH, PQExpBuffer outbuf, PGconn *conn = GetConnection(AH); PQExpBuffer buf = createPQExpBuffer(); PGresult *res; - int count = 1; - /* - * First collect database-specific options. Pre-8.4 server versions lack - * unnest(), so we do this the hard way by querying once per subscript. - */ - for (;;) - { - if (AH->remoteVersion >= 90000) - printfPQExpBuffer(buf, "SELECT setconfig[%d] FROM pg_db_role_setting " - "WHERE setrole = 0 AND setdatabase = '%u'::oid", - count, dboid); - else - printfPQExpBuffer(buf, "SELECT datconfig[%d] FROM pg_database WHERE oid = '%u'::oid", count, dboid); + /* First collect database-specific options */ + printfPQExpBuffer(buf, "SELECT unnest(setconfig) FROM pg_db_role_setting " + "WHERE setrole = 0 AND setdatabase = '%u'::oid", + dboid); - res = ExecuteSqlQuery(AH, buf->data, PGRES_TUPLES_OK); + res = ExecuteSqlQuery(AH, buf->data, PGRES_TUPLES_OK); - if (PQntuples(res) == 1 && - !PQgetisnull(res, 0, 0)) - { - makeAlterConfigCommand(conn, PQgetvalue(res, 0, 0), - "DATABASE", dbname, NULL, NULL, - outbuf); - PQclear(res); - count++; - } - else - { - PQclear(res); - break; - } - } + for (int i = 0; i < PQntuples(res); i++) + makeAlterConfigCommand(conn, PQgetvalue(res, i, 0), + "DATABASE", dbname, NULL, NULL, + outbuf); + + PQclear(res); /* Now look for role-and-database-specific options */ - if (AH->remoteVersion >= 90000) - { - /* Here we can assume we have unnest() */ - printfPQExpBuffer(buf, "SELECT rolname, unnest(setconfig) " - "FROM pg_db_role_setting s, pg_roles r " - "WHERE setrole = r.oid AND setdatabase = '%u'::oid", - dboid); + printfPQExpBuffer(buf, "SELECT rolname, unnest(setconfig) " + "FROM pg_db_role_setting s, pg_roles r " + "WHERE setrole = r.oid AND setdatabase = '%u'::oid", + dboid); - res = ExecuteSqlQuery(AH, buf->data, PGRES_TUPLES_OK); + res = ExecuteSqlQuery(AH, buf->data, PGRES_TUPLES_OK); - if (PQntuples(res) > 0) - { - int i; + for (int i = 0; i < PQntuples(res); i++) + makeAlterConfigCommand(conn, PQgetvalue(res, i, 1), + "ROLE", PQgetvalue(res, i, 0), + "DATABASE", dbname, + outbuf); - for (i = 0; i < PQntuples(res); i++) - makeAlterConfigCommand(conn, PQgetvalue(res, i, 1), - "ROLE", PQgetvalue(res, i, 0), - "DATABASE", dbname, - outbuf); - } - - PQclear(res); - } + PQclear(res); destroyPQExpBuffer(buf); } @@ -3474,27 +3270,12 @@ getBlobs(Archive *fout) pg_log_info("reading large objects"); - /* Fetch BLOB OIDs, and owner/ACL data if >= 9.0 */ - if (fout->remoteVersion >= 90200) - { - appendPQExpBuffer(blobQry, - "SELECT oid, (%s lomowner) AS rolname, lomacl, " - "acldefault('L', lomowner) AS acldefault " - "FROM pg_largeobject_metadata", - username_subquery); - } - else if (fout->remoteVersion >= 90000) - appendPQExpBuffer(blobQry, - "SELECT oid, (%s lomowner) AS rolname, lomacl, " - "NULL AS acldefault " - "FROM pg_largeobject_metadata", - username_subquery); - else - appendPQExpBufferStr(blobQry, - "SELECT DISTINCT loid AS oid, " - "NULL::name AS rolname, NULL::oid AS lomacl, " - "NULL::oid AS acldefault " - " FROM pg_largeobject"); + /* Fetch BLOB OIDs, and owner/ACL data */ + appendPQExpBuffer(blobQry, + "SELECT oid, (%s lomowner) AS rolname, lomacl, " + "acldefault('L', lomowner) AS acldefault " + "FROM pg_largeobject_metadata", + username_subquery); res = ExecuteSqlQuery(fout, blobQry->data, PGRES_TUPLES_OK); @@ -3632,14 +3413,9 @@ dumpBlobs(Archive *fout, const void *arg) * Currently, we re-fetch all BLOB OIDs using a cursor. Consider scanning * the already-in-memory dumpable objects instead... */ - if (fout->remoteVersion >= 90000) - blobQry = - "DECLARE bloboid CURSOR FOR " - "SELECT oid FROM pg_largeobject_metadata ORDER BY 1"; - else - blobQry = - "DECLARE bloboid CURSOR FOR " - "SELECT DISTINCT loid FROM pg_largeobject ORDER BY 1"; + blobQry = + "DECLARE bloboid CURSOR FOR " + "SELECT oid FROM pg_largeobject_metadata ORDER BY 1"; ExecuteSqlStatement(fout, blobQry); @@ -4751,7 +4527,6 @@ binary_upgrade_set_type_oids_by_type_oid(Archive *fout, "SELECT pg_catalog.binary_upgrade_set_next_pg_type_oid('%u'::pg_catalog.oid);\n\n", pg_type_oid); - /* we only support old >= 8.3 for binary upgrades */ appendPQExpBuffer(upgrade_query, "SELECT typarray " "FROM pg_catalog.pg_type " @@ -4983,20 +4758,13 @@ getNamespaces(Archive *fout, int *numNamespaces) * we fetch all namespaces including system ones, so that every object we * read in can be linked to a containing namespace. */ - if (fout->remoteVersion >= 90200) - appendPQExpBuffer(query, "SELECT n.tableoid, n.oid, n.nspname, " - "n.nspowner, " - "(%s nspowner) AS rolname, " - "n.nspacl, " - "acldefault('n', n.nspowner) AS acldefault " - "FROM pg_namespace n", - username_subquery); - else - appendPQExpBuffer(query, "SELECT tableoid, oid, nspname, nspowner, " - "(%s nspowner) AS rolname, " - "nspacl, NULL AS acldefault " - "FROM pg_namespace", - username_subquery); + appendPQExpBuffer(query, "SELECT n.tableoid, n.oid, n.nspname, " + "n.nspowner, " + "(%s nspowner) AS rolname, " + "n.nspacl, " + "acldefault('n', n.nspowner) AS acldefault " + "FROM pg_namespace n", + username_subquery); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -5127,15 +4895,6 @@ getExtensions(Archive *fout, int *numExtensions) int i_extconfig; int i_extcondition; - /* - * Before 9.1, there are no extensions. - */ - if (fout->remoteVersion < 90100) - { - *numExtensions = 0; - return NULL; - } - query = createPQExpBuffer(); appendPQExpBufferStr(query, "SELECT x.tableoid, x.oid, " @@ -5231,48 +4990,18 @@ getTypes(Archive *fout, int *numTypes) * cost of the subselect probe for all standard types. This would have to * be revisited if the backend ever allows renaming of array types. */ - if (fout->remoteVersion >= 90200) - { - appendPQExpBuffer(query, "SELECT tableoid, oid, typname, " - "typnamespace, typacl, " - "acldefault('T', typowner) AS acldefault, " - "(%s typowner) AS rolname, " - "typelem, typrelid, " - "CASE WHEN typrelid = 0 THEN ' '::\"char\" " - "ELSE (SELECT relkind FROM pg_class WHERE oid = typrelid) END AS typrelkind, " - "typtype, typisdefined, " - "typname[0] = '_' AND typelem != 0 AND " - "(SELECT typarray FROM pg_type te WHERE oid = pg_type.typelem) = oid AS isarray " - "FROM pg_type", - username_subquery); - } - else if (fout->remoteVersion >= 80300) - { - appendPQExpBuffer(query, "SELECT tableoid, oid, typname, " - "typnamespace, NULL AS typacl, NULL AS acldefault, " - "(%s typowner) AS rolname, " - "typelem, typrelid, " - "CASE WHEN typrelid = 0 THEN ' '::\"char\" " - "ELSE (SELECT relkind FROM pg_class WHERE oid = typrelid) END AS typrelkind, " - "typtype, typisdefined, " - "typname[0] = '_' AND typelem != 0 AND " - "(SELECT typarray FROM pg_type te WHERE oid = pg_type.typelem) = oid AS isarray " - "FROM pg_type", - username_subquery); - } - else - { - appendPQExpBuffer(query, "SELECT tableoid, oid, typname, " - "typnamespace, NULL AS typacl, NULL AS acldefault, " - "(%s typowner) AS rolname, " - "typelem, typrelid, " - "CASE WHEN typrelid = 0 THEN ' '::\"char\" " - "ELSE (SELECT relkind FROM pg_class WHERE oid = typrelid) END AS typrelkind, " - "typtype, typisdefined, " - "typname[0] = '_' AND typelem != 0 AS isarray " - "FROM pg_type", - username_subquery); - } + appendPQExpBuffer(query, "SELECT tableoid, oid, typname, " + "typnamespace, typacl, " + "acldefault('T', typowner) AS acldefault, " + "(%s typowner) AS rolname, " + "typelem, typrelid, " + "CASE WHEN typrelid = 0 THEN ' '::\"char\" " + "ELSE (SELECT relkind FROM pg_class WHERE oid = typrelid) END AS typrelkind, " + "typtype, typisdefined, " + "typname[0] = '_' AND typelem != 0 AND " + "(SELECT typarray FROM pg_type te WHERE oid = pg_type.typelem) = oid AS isarray " + "FROM pg_type", + username_subquery); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -5491,13 +5220,6 @@ getCollations(Archive *fout, int *numCollations) int i_collnamespace; int i_rolname; - /* Collations didn't exist pre-9.1 */ - if (fout->remoteVersion < 90100) - { - *numCollations = 0; - return NULL; - } - query = createPQExpBuffer(); /* @@ -5778,13 +5500,6 @@ getOpfamilies(Archive *fout, int *numOpfamilies) int i_opfnamespace; int i_rolname; - /* Before 8.3, there is no separate concept of opfamilies */ - if (fout->remoteVersion < 80300) - { - *numOpfamilies = 0; - return NULL; - } - query = createPQExpBuffer(); /* @@ -5902,7 +5617,7 @@ getAggregates(Archive *fout, int *numAggs) "deptype = 'e')"); appendPQExpBufferChar(query, ')'); } - else if (fout->remoteVersion >= 90200) + else { appendPQExpBuffer(query, "SELECT tableoid, oid, proname AS aggname, " "pronamespace AS aggnamespace, " @@ -5925,44 +5640,6 @@ getAggregates(Archive *fout, int *numAggs) "deptype = 'e')"); appendPQExpBufferChar(query, ')'); } - else if (fout->remoteVersion >= 80200) - { - appendPQExpBuffer(query, "SELECT tableoid, oid, proname AS aggname, " - "pronamespace AS aggnamespace, " - "pronargs, proargtypes, " - "(%s proowner) AS rolname, " - "proacl AS aggacl, " - "NULL AS acldefault " - "FROM pg_proc p " - "WHERE proisagg AND (" - "pronamespace != " - "(SELECT oid FROM pg_namespace " - "WHERE nspname = 'pg_catalog')", - username_subquery); - if (dopt->binary_upgrade && fout->remoteVersion >= 90100) - 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, ')'); - } - else - { - appendPQExpBuffer(query, "SELECT tableoid, oid, proname AS aggname, " - "pronamespace AS aggnamespace, " - "CASE WHEN proargtypes[0] = 'pg_catalog.\"any\"'::pg_catalog.regtype THEN 0 ELSE 1 END AS pronargs, " - "proargtypes, " - "(%s proowner) AS rolname, " - "proacl AS aggacl, " - "NULL AS acldefault " - "FROM pg_proc " - "WHERE proisagg " - "AND pronamespace != " - "(SELECT oid FROM pg_namespace WHERE nspname = 'pg_catalog')", - username_subquery); - } res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -6062,10 +5739,9 @@ getFuncs(Archive *fout, int *numFuncs) * 2. Always exclude functions that are internally dependent on something * else, since presumably those will be created as a result of creating * the something else. This currently acts only to suppress constructor - * functions for range types (so we only need it in 9.2 and up). Note - * this is OK only because the constructors don't have any dependencies - * the range type doesn't have; otherwise we might not get creation - * ordering correct. + * functions for range types. Note this is OK only because the + * constructors don't have any dependencies the range type doesn't have; + * otherwise we might not get creation ordering correct. * * 3. Otherwise, we normally exclude functions in pg_catalog. However, if * they're members of extensions and we are in binary-upgrade mode then @@ -6127,27 +5803,17 @@ getFuncs(Archive *fout, int *numFuncs) } else { - const char *acldefault_call; - - acldefault_call = (fout->remoteVersion >= 90200 ? - "acldefault('f', proowner)" : "NULL"); - appendPQExpBuffer(query, "SELECT tableoid, oid, proname, prolang, " "pronargs, proargtypes, prorettype, proacl, " - "%s AS acldefault, " + "acldefault('f', proowner) AS acldefault, " "pronamespace, " "(%s proowner) AS rolname " "FROM pg_proc p " - "WHERE NOT proisagg", - acldefault_call, - username_subquery); - if (fout->remoteVersion >= 90200) - appendPQExpBufferStr(query, - "\n AND NOT EXISTS (SELECT 1 FROM pg_depend " - "WHERE classid = 'pg_proc'::regclass AND " - "objid = p.oid AND deptype = 'i')"); - appendPQExpBuffer(query, + "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 " @@ -6155,6 +5821,7 @@ getFuncs(Archive *fout, int *numFuncs) "\n OR EXISTS (SELECT 1 FROM pg_cast" "\n WHERE pg_cast.oid > '%u'::oid" "\n AND p.oid = pg_cast.castfunc)", + username_subquery, g_last_builtin_oid); if (fout->remoteVersion >= 90500) @@ -6165,7 +5832,7 @@ getFuncs(Archive *fout, int *numFuncs) "\n OR p.oid = pg_transform.trftosql))", g_last_builtin_oid); - if (dopt->binary_upgrade && fout->remoteVersion >= 90100) + if (dopt->binary_upgrade) appendPQExpBufferStr(query, "\n OR EXISTS(SELECT 1 FROM pg_depend WHERE " "classid = 'pg_proc'::regclass AND " @@ -6317,7 +5984,19 @@ getTables(Archive *fout, int *numTables) "(%s c.relowner) AS rolname, " "c.relchecks, " "c.relhasindex, c.relhasrules, c.relpages, " + "c.relhastriggers, " + "c.relpersistence, " + "c.reloftype, " + "c.relacl, " + "acldefault(CASE WHEN c.relkind = " CppAsString2(RELKIND_SEQUENCE) + " THEN 's'::\"char\" ELSE 'r'::\"char\" END, c.relowner) AS acldefault, " + "CASE WHEN c.relkind = " CppAsString2(RELKIND_FOREIGN_TABLE) " THEN " + "(SELECT ftserver FROM pg_catalog.pg_foreign_table WHERE ftrelid = c.oid) " + "ELSE 0 END AS foreignserver, " + "c.relfrozenxid, tc.relfrozenxid AS tfrozenxid, " + "tc.oid AS toid, " "tc.relpages AS toastpages, " + "tc.reloptions AS toast_reloptions, " "d.refobjid AS owning_tab, " "d.refobjsubid AS owning_col, " "tsp.spcname AS reltablespace, ", @@ -6330,20 +6009,6 @@ getTables(Archive *fout, int *numTables) appendPQExpBufferStr(query, "c.relhasoids, "); - if (fout->remoteVersion >= 80400) - appendPQExpBufferStr(query, - "c.relhastriggers, "); - else - appendPQExpBufferStr(query, - "(c.reltriggers <> 0) AS relhastriggers, "); - - if (fout->remoteVersion >= 90100) - appendPQExpBufferStr(query, - "c.relpersistence, "); - else - appendPQExpBufferStr(query, - "'p' AS relpersistence, "); - if (fout->remoteVersion >= 90300) appendPQExpBufferStr(query, "c.relispopulated, "); @@ -6366,15 +6031,6 @@ getTables(Archive *fout, int *numTables) "false AS relrowsecurity, " "false AS relforcerowsecurity, "); - if (fout->remoteVersion >= 80200) - appendPQExpBufferStr(query, - "c.relfrozenxid, tc.relfrozenxid AS tfrozenxid, " - "tc.oid AS toid, "); - else - appendPQExpBufferStr(query, - "0 AS relfrozenxid, 0 AS tfrozenxid, " - "0 AS toid, "); - if (fout->remoteVersion >= 90300) appendPQExpBufferStr(query, "c.relminmxid, tc.relminmxid AS tminmxid, "); @@ -6387,35 +6043,9 @@ getTables(Archive *fout, int *numTables) "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 if (fout->remoteVersion >= 80200) + else appendPQExpBufferStr(query, "c.reloptions, NULL AS checkoption, "); - else - appendPQExpBufferStr(query, - "NULL AS reloptions, NULL AS checkoption, "); - - if (fout->remoteVersion >= 80400) - appendPQExpBufferStr(query, - "tc.reloptions AS toast_reloptions, "); - else - appendPQExpBufferStr(query, - "NULL AS toast_reloptions, "); - - if (fout->remoteVersion >= 90000) - appendPQExpBufferStr(query, - "c.reloftype, "); - else - appendPQExpBufferStr(query, - "0 AS reloftype, "); - - if (fout->remoteVersion >= 90100) - appendPQExpBufferStr(query, - "CASE WHEN c.relkind = " CppAsString2(RELKIND_FOREIGN_TABLE) " THEN " - "(SELECT ftserver FROM pg_catalog.pg_foreign_table WHERE ftrelid = c.oid) " - "ELSE 0 END AS foreignserver, "); - else - appendPQExpBufferStr(query, - "0 AS foreignserver, "); if (fout->remoteVersion >= 90600) appendPQExpBufferStr(query, @@ -6436,15 +6066,6 @@ getTables(Archive *fout, int *numTables) appendPQExpBufferStr(query, "false AS is_identity_sequence, "); - if (fout->remoteVersion >= 90200) - appendPQExpBufferStr(query, - "c.relacl, " - "acldefault(CASE WHEN c.relkind = " CppAsString2(RELKIND_SEQUENCE) - " THEN 's'::\"char\" ELSE 'r'::\"char\" END, c.relowner) AS acldefault, "); - else - appendPQExpBufferStr(query, - "c.relacl, NULL AS acldefault, "); - if (fout->remoteVersion >= 100000) appendPQExpBufferStr(query, "c.relispartition AS ispartition "); @@ -6454,8 +6075,9 @@ getTables(Archive *fout, int *numTables) /* * Left join to pg_depend to pick up dependency info linking sequences to - * their owning column, if any (note this dependency is AUTO as of 8.2). - * Also join to pg_tablespace to collect the spcname. + * their owning column, if any (note this dependency is AUTO except for + * identity sequences, where it's INTERNAL). Also join to pg_tablespace to + * collect the spcname. */ appendPQExpBufferStr(query, "\nFROM pg_class c\n" @@ -6899,9 +6521,8 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) * create a CONSTRAINT entry linked to the INDEX entry. We assume an * index won't have more than one internal dependency. * - * As of 9.0 we don't need to look at pg_depend but can check for a match - * to pg_constraint.conindid. The check on conrelid is redundant but - * useful because that column is indexed while conindid is not. + * Note: the check on conrelid is redundant, but useful because that + * column is indexed while conindid is not. */ if (fout->remoteVersion >= 110000) { @@ -6979,7 +6600,7 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) "ORDER BY i.indrelid, indexname", tbloids->data); } - else if (fout->remoteVersion >= 90000) + else { /* * the test on indisready is necessary in 9.2, and harmless in @@ -7014,73 +6635,6 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) "ORDER BY i.indrelid, indexname", tbloids->data); } - else if (fout->remoteVersion >= 80200) - { - appendPQExpBuffer(query, - "SELECT t.tableoid, t.oid, i.indrelid, " - "t.relname AS indexname, " - "0 AS parentidx, " - "pg_catalog.pg_get_indexdef(i.indexrelid) AS indexdef, " - "i.indnatts AS indnkeyatts, " - "i.indnatts AS indnatts, " - "i.indkey, i.indisclustered, " - "false AS indisreplident, " - "c.contype, c.conname, " - "c.condeferrable, c.condeferred, " - "c.tableoid AS contableoid, " - "c.oid AS conoid, " - "null AS condef, " - "(SELECT spcname FROM pg_catalog.pg_tablespace s WHERE s.oid = t.reltablespace) AS tablespace, " - "t.reloptions AS indreloptions, " - "'' AS indstatcols, " - "'' AS indstatvals " - "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n" - "JOIN pg_catalog.pg_index i ON (src.tbloid = i.indrelid) " - "JOIN pg_catalog.pg_class t ON (t.oid = i.indexrelid) " - "LEFT JOIN pg_catalog.pg_depend d " - "ON (d.classid = t.tableoid " - "AND d.objid = t.oid " - "AND d.deptype = 'i') " - "LEFT JOIN pg_catalog.pg_constraint c " - "ON (d.refclassid = c.tableoid " - "AND d.refobjid = c.oid) " - "WHERE i.indisvalid " - "ORDER BY i.indrelid, indexname", - tbloids->data); - } - else - { - appendPQExpBuffer(query, - "SELECT t.tableoid, t.oid, i.indrelid, " - "t.relname AS indexname, " - "0 AS parentidx, " - "pg_catalog.pg_get_indexdef(i.indexrelid) AS indexdef, " - "t.relnatts AS indnkeyatts, " - "t.relnatts AS indnatts, " - "i.indkey, i.indisclustered, " - "false AS indisreplident, " - "c.contype, c.conname, " - "c.condeferrable, c.condeferred, " - "c.tableoid AS contableoid, " - "c.oid AS conoid, " - "null AS condef, " - "(SELECT spcname FROM pg_catalog.pg_tablespace s WHERE s.oid = t.reltablespace) AS tablespace, " - "null AS indreloptions, " - "'' AS indstatcols, " - "'' AS indstatvals " - "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n" - "JOIN pg_catalog.pg_index i ON (src.tbloid = i.indrelid) " - "JOIN pg_catalog.pg_class t ON (t.oid = i.indexrelid) " - "LEFT JOIN pg_catalog.pg_depend d " - "ON (d.classid = t.tableoid " - "AND d.objid = t.oid " - "AND d.deptype = 'i') " - "LEFT JOIN pg_catalog.pg_constraint c " - "ON (d.refclassid = c.tableoid " - "AND d.refobjid = c.oid) " - "ORDER BY i.indrelid, indexname", - tbloids->data); - } res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -7512,22 +7066,13 @@ getDomainConstraints(Archive *fout, TypeInfo *tyinfo) { /* Set up query for constraint-specific details */ appendPQExpBufferStr(query, - "PREPARE getDomainConstraints(pg_catalog.oid) AS\n"); - - if (fout->remoteVersion >= 90100) - appendPQExpBufferStr(query, "SELECT tableoid, oid, conname, " - "pg_catalog.pg_get_constraintdef(oid) AS consrc, " - "convalidated " - "FROM pg_catalog.pg_constraint " - "WHERE contypid = $1 " - "ORDER BY conname"); - else - appendPQExpBufferStr(query, "SELECT tableoid, oid, conname, " - "pg_catalog.pg_get_constraintdef(oid) AS consrc, " - "true as convalidated " - "FROM pg_catalog.pg_constraint " - "WHERE contypid = $1 " - "ORDER BY conname"); + "PREPARE getDomainConstraints(pg_catalog.oid) AS\n" + "SELECT tableoid, oid, conname, " + "pg_catalog.pg_get_constraintdef(oid) AS consrc, " + "convalidated " + "FROM pg_catalog.pg_constraint " + "WHERE contypid = $1 " + "ORDER BY conname"); ExecuteSqlStatement(fout, query->data); @@ -7612,24 +7157,12 @@ getRules(Archive *fout, int *numRules) int i_is_instead; int i_ev_enabled; - if (fout->remoteVersion >= 80300) - { - appendPQExpBufferStr(query, "SELECT " - "tableoid, oid, rulename, " - "ev_class AS ruletable, ev_type, is_instead, " - "ev_enabled " - "FROM pg_rewrite " - "ORDER BY oid"); - } - else - { - appendPQExpBufferStr(query, "SELECT " - "tableoid, oid, rulename, " - "ev_class AS ruletable, ev_type, is_instead, " - "'O'::char AS ev_enabled " - "FROM pg_rewrite " - "ORDER BY oid"); - } + appendPQExpBufferStr(query, "SELECT " + "tableoid, oid, rulename, " + "ev_class AS ruletable, ev_type, is_instead, " + "ev_enabled " + "FROM pg_rewrite " + "ORDER BY oid"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -7807,7 +7340,7 @@ getTriggers(Archive *fout, TableInfo tblinfo[], int numTables) "ORDER BY t.tgrelid, t.tgname", tbloids->data); } - else if (fout->remoteVersion >= 90000) + else { /* See above about pretty=true in pg_get_triggerdef */ appendPQExpBuffer(query, @@ -7822,50 +7355,6 @@ getTriggers(Archive *fout, TableInfo tblinfo[], int numTables) "ORDER BY t.tgrelid, t.tgname", tbloids->data); } - else if (fout->remoteVersion >= 80300) - { - /* - * We ignore triggers that are tied to a foreign-key constraint - */ - appendPQExpBuffer(query, - "SELECT t.tgrelid, tgname, " - "tgfoid::pg_catalog.regproc AS tgfname, " - "tgtype, tgnargs, tgargs, tgenabled, " - "false as tgisinternal, " - "tgisconstraint, tgconstrname, tgdeferrable, " - "tgconstrrelid, tginitdeferred, t.tableoid, t.oid, " - "tgconstrrelid::pg_catalog.regclass AS tgconstrrelname " - "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n" - "JOIN pg_catalog.pg_trigger t ON (src.tbloid = t.tgrelid) " - "WHERE tgconstraint = 0 " - "ORDER BY t.tgrelid, t.tgname", - tbloids->data); - } - else - { - /* - * We ignore triggers that are tied to a foreign-key constraint, but - * in these versions we have to grovel through pg_constraint to find - * out - */ - appendPQExpBuffer(query, - "SELECT t.tgrelid, tgname, " - "tgfoid::pg_catalog.regproc AS tgfname, " - "tgtype, tgnargs, tgargs, tgenabled, " - "false as tgisinternal, " - "tgisconstraint, tgconstrname, tgdeferrable, " - "tgconstrrelid, tginitdeferred, t.tableoid, t.oid, " - "tgconstrrelid::pg_catalog.regclass AS tgconstrrelname " - "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n" - "JOIN pg_catalog.pg_trigger t ON (src.tbloid = t.tgrelid) " - "WHERE (NOT tgisconstraint " - " OR NOT EXISTS" - " (SELECT 1 FROM pg_catalog.pg_depend d " - " JOIN pg_catalog.pg_constraint c ON (d.refclassid = c.tableoid AND d.refobjid = c.oid) " - " WHERE d.classid = t.tableoid AND d.objid = t.oid AND d.deptype = 'i' AND c.contype = 'f')) " - "ORDER BY t.tgrelid, t.tgname", - tbloids->data); - } res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -8106,72 +7595,16 @@ getProcLangs(Archive *fout, int *numProcLangs) int i_acldefault; int i_lanowner; - if (fout->remoteVersion >= 90200) - { - /* acldefault() exists */ - appendPQExpBuffer(query, "SELECT tableoid, oid, " - "lanname, lanpltrusted, lanplcallfoid, " - "laninline, lanvalidator, " - "lanacl, " - "acldefault('l', lanowner) AS acldefault, " - "(%s lanowner) AS lanowner " - "FROM pg_language " - "WHERE lanispl " - "ORDER BY oid", - username_subquery); - } - else if (fout->remoteVersion >= 90000) - { - /* pg_language has a laninline column */ - appendPQExpBuffer(query, "SELECT tableoid, oid, " - "lanname, lanpltrusted, lanplcallfoid, " - "laninline, lanvalidator, " - "lanacl, NULL AS acldefault, " - "(%s lanowner) AS lanowner " - "FROM pg_language " - "WHERE lanispl " - "ORDER BY oid", - username_subquery); - } - else if (fout->remoteVersion >= 80300) - { - /* pg_language has a lanowner column */ - appendPQExpBuffer(query, "SELECT tableoid, oid, " - "lanname, lanpltrusted, lanplcallfoid, " - "0 AS laninline, lanvalidator, lanacl, " - "NULL AS acldefault, " - "(%s lanowner) AS lanowner " - "FROM pg_language " - "WHERE lanispl " - "ORDER BY oid", - username_subquery); - } - else if (fout->remoteVersion >= 80100) - { - /* Languages are owned by the bootstrap superuser, OID 10 */ - appendPQExpBuffer(query, "SELECT tableoid, oid, " - "lanname, lanpltrusted, lanplcallfoid, " - "0 AS laninline, lanvalidator, lanacl, " - "NULL AS acldefault, " - "(%s '10') AS lanowner " - "FROM pg_language " - "WHERE lanispl " - "ORDER BY oid", - username_subquery); - } - else - { - /* Languages are owned by the bootstrap superuser, sysid 1 */ - appendPQExpBuffer(query, "SELECT tableoid, oid, " - "lanname, lanpltrusted, lanplcallfoid, " - "0 AS laninline, lanvalidator, lanacl, " - "NULL AS acldefault, " - "(%s '1') AS lanowner " - "FROM pg_language " - "WHERE lanispl " - "ORDER BY oid", - username_subquery); - } + appendPQExpBuffer(query, "SELECT tableoid, oid, " + "lanname, lanpltrusted, lanplcallfoid, " + "laninline, lanvalidator, " + "lanacl, " + "acldefault('l', lanowner) AS acldefault, " + "(%s lanowner) AS lanowner " + "FROM pg_language " + "WHERE lanispl " + "ORDER BY oid", + username_subquery); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -8263,18 +7696,11 @@ getCasts(Archive *fout, int *numCasts) ") " "ORDER BY 3,4"); } - else if (fout->remoteVersion >= 80400) - { - appendPQExpBufferStr(query, "SELECT tableoid, oid, " - "castsource, casttarget, castfunc, castcontext, " - "castmethod " - "FROM pg_cast ORDER BY 3,4"); - } else { appendPQExpBufferStr(query, "SELECT tableoid, oid, " "castsource, casttarget, castfunc, castcontext, " - "CASE WHEN castfunc = 0 THEN 'b' ELSE 'f' END AS castmethod " + "castmethod " "FROM pg_cast ORDER BY 3,4"); } @@ -8520,7 +7946,13 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables) appendPQExpBufferChar(tbloids, '}'); appendPQExpBufferChar(checkoids, '}'); - /* find all the user attributes and their types */ + /* + * Find all the user attributes and their types. + * + * Since we only want to dump COLLATE clauses for attributes whose + * collation is different from their type's default, we use a CASE here to + * suppress uninteresting attcollations cheaply. + */ appendPQExpBufferStr(q, "SELECT\n" "a.attrelid,\n" @@ -8536,29 +7968,16 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables) "a.attlen,\n" "a.attalign,\n" "a.attislocal,\n" - "pg_catalog.format_type(t.oid, a.atttypmod) AS atttypname,\n"); - - if (fout->remoteVersion >= 90000) - appendPQExpBufferStr(q, - "array_to_string(a.attoptions, ', ') AS attoptions,\n"); - else - appendPQExpBufferStr(q, - "'' AS attoptions,\n"); - - if (fout->remoteVersion >= 90100) - { - /* - * Since we only want to dump COLLATE clauses for attributes whose - * collation is different from their type's default, we use a CASE - * here to suppress uninteresting attcollations cheaply. - */ - appendPQExpBufferStr(q, - "CASE WHEN a.attcollation <> t.typcollation " - "THEN a.attcollation ELSE 0 END AS attcollation,\n"); - } - else - appendPQExpBufferStr(q, - "0 AS attcollation,\n"); + "pg_catalog.format_type(t.oid, a.atttypmod) AS atttypname,\n" + "array_to_string(a.attoptions, ', ') AS attoptions,\n" + "CASE WHEN a.attcollation <> t.typcollation " + "THEN a.attcollation ELSE 0 END AS attcollation,\n" + "pg_catalog.array_to_string(ARRAY(" + "SELECT pg_catalog.quote_ident(option_name) || " + "' ' || pg_catalog.quote_literal(option_value) " + "FROM pg_catalog.pg_options_to_table(attfdwoptions) " + "ORDER BY option_name" + "), E',\n ') AS attfdwoptions,\n"); if (fout->remoteVersion >= 140000) appendPQExpBufferStr(q, @@ -8567,18 +7986,6 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables) appendPQExpBufferStr(q, "'' AS attcompression,\n"); - if (fout->remoteVersion >= 90200) - appendPQExpBufferStr(q, - "pg_catalog.array_to_string(ARRAY(" - "SELECT pg_catalog.quote_ident(option_name) || " - "' ' || pg_catalog.quote_literal(option_value) " - "FROM pg_catalog.pg_options_to_table(attfdwoptions) " - "ORDER BY option_name" - "), E',\n ') AS attfdwoptions,\n"); - else - appendPQExpBufferStr(q, - "'' AS attfdwoptions,\n"); - if (fout->remoteVersion >= 100000) appendPQExpBufferStr(q, "a.attidentity,\n"); @@ -8897,30 +8304,10 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables) pg_log_info("finding table check constraints"); resetPQExpBuffer(q); - appendPQExpBufferStr(q, - "SELECT c.tableoid, c.oid, conrelid, conname, " - "pg_catalog.pg_get_constraintdef(c.oid) AS consrc, "); - if (fout->remoteVersion >= 90200) - { - /* - * convalidated is new in 9.2 (actually, it is there in 9.1, but - * it wasn't ever false for check constraints until 9.2). - */ - appendPQExpBufferStr(q, - "conislocal, convalidated "); - } - else if (fout->remoteVersion >= 80400) - { - /* conislocal is new in 8.4 */ - appendPQExpBufferStr(q, - "conislocal, true AS convalidated "); - } - else - { - appendPQExpBufferStr(q, - "true AS conislocal, true AS convalidated "); - } appendPQExpBuffer(q, + "SELECT c.tableoid, c.oid, conrelid, conname, " + "pg_catalog.pg_get_constraintdef(c.oid) AS consrc, " + "conislocal, convalidated " "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n" "JOIN pg_catalog.pg_constraint c ON (src.tbloid = c.conrelid)\n" "WHERE contype = 'c' " @@ -9021,9 +8408,8 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables) constrs[j].dobj.dumpId); /* - * If the constraint is inherited, this will be detected later - * (in pre-8.4 databases). We also detect later if the - * constraint must be split out from the table definition. + * We will detect later whether the constraint must be split + * out from the table definition. */ } } @@ -9089,13 +8475,6 @@ getTSParsers(Archive *fout, int *numTSParsers) int i_prsheadline; int i_prslextype; - /* Before 8.3, there is no built-in text search support */ - if (fout->remoteVersion < 80300) - { - *numTSParsers = 0; - return NULL; - } - query = createPQExpBuffer(); /* @@ -9174,13 +8553,6 @@ getTSDictionaries(Archive *fout, int *numTSDicts) int i_dicttemplate; int i_dictinitoption; - /* Before 8.3, there is no built-in text search support */ - if (fout->remoteVersion < 80300) - { - *numTSDicts = 0; - return NULL; - } - query = createPQExpBuffer(); appendPQExpBuffer(query, "SELECT tableoid, oid, dictname, " @@ -9253,13 +8625,6 @@ getTSTemplates(Archive *fout, int *numTSTemplates) int i_tmplinit; int i_tmpllexize; - /* Before 8.3, there is no built-in text search support */ - if (fout->remoteVersion < 80300) - { - *numTSTemplates = 0; - return NULL; - } - query = createPQExpBuffer(); appendPQExpBufferStr(query, "SELECT tableoid, oid, tmplname, " @@ -9325,13 +8690,6 @@ getTSConfigurations(Archive *fout, int *numTSConfigs) int i_rolname; int i_cfgparser; - /* Before 8.3, there is no built-in text search support */ - if (fout->remoteVersion < 80300) - { - *numTSConfigs = 0; - return NULL; - } - query = createPQExpBuffer(); appendPQExpBuffer(query, "SELECT tableoid, oid, cfgname, " @@ -9401,64 +8759,22 @@ getForeignDataWrappers(Archive *fout, int *numForeignDataWrappers) int i_acldefault; int i_fdwoptions; - /* Before 8.4, there are no foreign-data wrappers */ - if (fout->remoteVersion < 80400) - { - *numForeignDataWrappers = 0; - return NULL; - } - query = createPQExpBuffer(); - if (fout->remoteVersion >= 90200) - { - appendPQExpBuffer(query, "SELECT tableoid, oid, fdwname, " - "(%s fdwowner) AS rolname, " - "fdwhandler::pg_catalog.regproc, " - "fdwvalidator::pg_catalog.regproc, " - "fdwacl, " - "acldefault('F', fdwowner) AS acldefault, " - "array_to_string(ARRAY(" - "SELECT quote_ident(option_name) || ' ' || " - "quote_literal(option_value) " - "FROM pg_options_to_table(fdwoptions) " - "ORDER BY option_name" - "), E',\n ') AS fdwoptions " - "FROM pg_foreign_data_wrapper", - username_subquery); - } - else if (fout->remoteVersion >= 90100) - { - appendPQExpBuffer(query, "SELECT tableoid, oid, fdwname, " - "(%s fdwowner) AS rolname, " - "fdwhandler::pg_catalog.regproc, " - "fdwvalidator::pg_catalog.regproc, fdwacl, " - "NULL AS acldefault, " - "array_to_string(ARRAY(" - "SELECT quote_ident(option_name) || ' ' || " - "quote_literal(option_value) " - "FROM pg_options_to_table(fdwoptions) " - "ORDER BY option_name" - "), E',\n ') AS fdwoptions " - "FROM pg_foreign_data_wrapper", - username_subquery); - } - else - { - appendPQExpBuffer(query, "SELECT tableoid, oid, fdwname, " - "(%s fdwowner) AS rolname, " - "'-' AS fdwhandler, " - "fdwvalidator::pg_catalog.regproc, fdwacl, " - "NULL AS acldefault, " - "array_to_string(ARRAY(" - "SELECT quote_ident(option_name) || ' ' || " - "quote_literal(option_value) " - "FROM pg_options_to_table(fdwoptions) " - "ORDER BY option_name" - "), E',\n ') AS fdwoptions " - "FROM pg_foreign_data_wrapper", - username_subquery); - } + appendPQExpBuffer(query, "SELECT tableoid, oid, fdwname, " + "(%s fdwowner) AS rolname, " + "fdwhandler::pg_catalog.regproc, " + "fdwvalidator::pg_catalog.regproc, " + "fdwacl, " + "acldefault('F', fdwowner) AS acldefault, " + "array_to_string(ARRAY(" + "SELECT quote_ident(option_name) || ' ' || " + "quote_literal(option_value) " + "FROM pg_options_to_table(fdwoptions) " + "ORDER BY option_name" + "), E',\n ') AS fdwoptions " + "FROM pg_foreign_data_wrapper", + username_subquery); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -9535,45 +8851,20 @@ getForeignServers(Archive *fout, int *numForeignServers) int i_acldefault; int i_srvoptions; - /* Before 8.4, there are no foreign servers */ - if (fout->remoteVersion < 80400) - { - *numForeignServers = 0; - return NULL; - } - query = createPQExpBuffer(); - if (fout->remoteVersion >= 90200) - { - appendPQExpBuffer(query, "SELECT tableoid, oid, srvname, " - "(%s srvowner) AS rolname, " - "srvfdw, srvtype, srvversion, srvacl, " - "acldefault('S', srvowner) AS acldefault, " - "array_to_string(ARRAY(" - "SELECT quote_ident(option_name) || ' ' || " - "quote_literal(option_value) " - "FROM pg_options_to_table(srvoptions) " - "ORDER BY option_name" - "), E',\n ') AS srvoptions " - "FROM pg_foreign_server", - username_subquery); - } - else - { - appendPQExpBuffer(query, "SELECT tableoid, oid, srvname, " - "(%s srvowner) AS rolname, " - "srvfdw, srvtype, srvversion, srvacl, " - "NULL AS acldefault, " - "array_to_string(ARRAY(" - "SELECT quote_ident(option_name) || ' ' || " - "quote_literal(option_value) " - "FROM pg_options_to_table(srvoptions) " - "ORDER BY option_name" - "), E',\n ') AS srvoptions " - "FROM pg_foreign_server", - username_subquery); - } + appendPQExpBuffer(query, "SELECT tableoid, oid, srvname, " + "(%s srvowner) AS rolname, " + "srvfdw, srvtype, srvversion, srvacl, " + "acldefault('S', srvowner) AS acldefault, " + "array_to_string(ARRAY(" + "SELECT quote_ident(option_name) || ' ' || " + "quote_literal(option_value) " + "FROM pg_options_to_table(srvoptions) " + "ORDER BY option_name" + "), E',\n ') AS srvoptions " + "FROM pg_foreign_server", + username_subquery); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -9653,50 +8944,33 @@ getDefaultACLs(Archive *fout, int *numDefaultACLs) int i, ntups; - if (fout->remoteVersion < 90000) - { - *numDefaultACLs = 0; - return NULL; - } - query = createPQExpBuffer(); + /* + * Global entries (with defaclnamespace=0) replace the hard-wired default + * ACL for their object type. We should dump them as deltas from the + * default ACL, since that will be used as a starting point for + * interpreting the ALTER DEFAULT PRIVILEGES commands. On the other hand, + * non-global entries can only add privileges not revoke them. We must + * dump those as-is (i.e., as deltas from an empty ACL). + * + * We can use defaclobjtype as the object type for acldefault(), except + * for the case of 'S' (DEFACLOBJ_SEQUENCE) which must be converted to + * 's'. + */ appendPQExpBuffer(query, "SELECT oid, tableoid, " "(%s defaclrole) AS defaclrole, " "defaclnamespace, " "defaclobjtype, " - "defaclacl, ", + "defaclacl, " + "CASE WHEN defaclnamespace = 0 THEN " + "acldefault(CASE WHEN defaclobjtype = 'S' " + "THEN 's'::\"char\" ELSE defaclobjtype END, " + "defaclrole) ELSE '{}' END AS acldefault " + "FROM pg_default_acl", username_subquery); - if (fout->remoteVersion >= 90200) - { - /* - * Global entries (with defaclnamespace=0) replace the hard-wired - * default ACL for their object type. We should dump them as deltas - * from the default ACL, since that will be used as a starting point - * for interpreting the ALTER DEFAULT PRIVILEGES commands. On the - * other hand, non-global entries can only add privileges not revoke - * them. We must dump those as-is (i.e., as deltas from an empty - * ACL). - * - * We can use defaclobjtype as the object type for acldefault(), - * except for the case of 'S' (DEFACLOBJ_SEQUENCE) which must be - * converted to 's'. - */ - appendPQExpBufferStr(query, - "CASE WHEN defaclnamespace = 0 THEN " - "acldefault(CASE WHEN defaclobjtype = 'S' " - "THEN 's'::\"char\" ELSE defaclobjtype END, " - "defaclrole) ELSE '{}' END AS acldefault "); - } - else - appendPQExpBufferStr(query, - "NULL AS acldefault "); - - appendPQExpBufferStr(query, - "FROM pg_default_acl"); - res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); ntups = PQntuples(res); @@ -9769,30 +9043,27 @@ getAdditionalACLs(Archive *fout) i; /* Check for per-column ACLs */ - if (fout->remoteVersion >= 80400) + appendPQExpBufferStr(query, + "SELECT DISTINCT attrelid FROM pg_attribute " + "WHERE attacl IS NOT NULL"); + + res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); + + ntups = PQntuples(res); + for (i = 0; i < ntups; i++) { - appendPQExpBufferStr(query, - "SELECT DISTINCT attrelid FROM pg_attribute " - "WHERE attacl IS NOT NULL"); + Oid relid = atooid(PQgetvalue(res, i, 0)); + TableInfo *tblinfo; - res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); - - ntups = PQntuples(res); - for (i = 0; i < ntups; i++) + tblinfo = findTableByOid(relid); + /* OK to ignore tables we haven't got a DumpableObject for */ + if (tblinfo) { - Oid relid = atooid(PQgetvalue(res, i, 0)); - TableInfo *tblinfo; - - tblinfo = findTableByOid(relid); - /* OK to ignore tables we haven't got a DumpableObject for */ - if (tblinfo) - { - tblinfo->dobj.components |= DUMP_COMPONENT_ACL; - tblinfo->hascolumnACLs = true; - } + tblinfo->dobj.components |= DUMP_COMPONENT_ACL; + tblinfo->hascolumnACLs = true; } - PQclear(res); } + PQclear(res); /* Fetch initial-privileges data */ if (fout->remoteVersion >= 90600) @@ -10504,9 +9775,7 @@ dumpNamespace(Archive *fout, const NamespaceInfo *nspinfo) const char *initdb_comment = NULL; if (!nspinfo->create && strcmp(qnspname, "public") == 0) - initdb_comment = (fout->remoteVersion >= 80300 ? - "standard public schema" : - "Standard public schema"); + initdb_comment = "standard public schema"; dumpCommentExtended(fout, "SCHEMA", qnspname, NULL, nspinfo->rolname, nspinfo->dobj.catId, 0, nspinfo->dobj.dumpId, @@ -10713,18 +9982,11 @@ dumpEnumType(Archive *fout, const TypeInfo *tyinfo) { /* Set up query for enum-specific details */ appendPQExpBufferStr(query, - "PREPARE dumpEnumType(pg_catalog.oid) AS\n"); - - if (fout->remoteVersion >= 90100) - appendPQExpBufferStr(query, "SELECT oid, enumlabel " - "FROM pg_catalog.pg_enum " - "WHERE enumtypid = $1 " - "ORDER BY enumsortorder"); - else - appendPQExpBufferStr(query, "SELECT oid, enumlabel " - "FROM pg_catalog.pg_enum " - "WHERE enumtypid = $1 " - "ORDER BY oid"); + "PREPARE dumpEnumType(pg_catalog.oid) AS\n" + "SELECT oid, enumlabel " + "FROM pg_catalog.pg_enum " + "WHERE enumtypid = $1 " + "ORDER BY enumsortorder"); ExecuteSqlStatement(fout, query->data); @@ -11100,53 +10362,28 @@ dumpBaseType(Archive *fout, const TypeInfo *tyinfo) { /* Set up query for type-specific details */ appendPQExpBufferStr(query, - "PREPARE dumpBaseType(pg_catalog.oid) AS\n"); - - appendPQExpBufferStr(query, "SELECT typlen, " + "PREPARE dumpBaseType(pg_catalog.oid) AS\n" + "SELECT typlen, " "typinput, typoutput, typreceive, typsend, " "typreceive::pg_catalog.oid AS typreceiveoid, " "typsend::pg_catalog.oid AS typsendoid, " "typanalyze, " "typanalyze::pg_catalog.oid AS typanalyzeoid, " - "typdelim, typbyval, typalign, typstorage, "); - - if (fout->remoteVersion >= 80300) - appendPQExpBufferStr(query, - "typmodin, typmodout, " - "typmodin::pg_catalog.oid AS typmodinoid, " - "typmodout::pg_catalog.oid AS typmodoutoid, "); - else - appendPQExpBufferStr(query, - "'-' AS typmodin, '-' AS typmodout, " - "0 AS typmodinoid, 0 AS typmodoutoid, "); - - if (fout->remoteVersion >= 80400) - appendPQExpBufferStr(query, - "typcategory, typispreferred, "); - else - appendPQExpBufferStr(query, - "'U' AS typcategory, false AS typispreferred, "); - - if (fout->remoteVersion >= 90100) - appendPQExpBufferStr(query, "(typcollation <> 0) AS typcollatable, "); - else - appendPQExpBufferStr(query, "false AS typcollatable, "); + "typdelim, typbyval, typalign, typstorage, " + "typmodin, typmodout, " + "typmodin::pg_catalog.oid AS typmodinoid, " + "typmodout::pg_catalog.oid AS typmodoutoid, " + "typcategory, typispreferred, " + "(typcollation <> 0) AS typcollatable, " + "pg_catalog.pg_get_expr(typdefaultbin, 0) AS typdefaultbin, typdefault, "); if (fout->remoteVersion >= 140000) appendPQExpBufferStr(query, "typsubscript, " - "typsubscript::pg_catalog.oid AS typsubscriptoid, "); + "typsubscript::pg_catalog.oid AS typsubscriptoid "); else appendPQExpBufferStr(query, - "'-' AS typsubscript, 0 AS typsubscriptoid, "); - - /* Before 8.4, pg_get_expr does not allow 0 for its second arg */ - if (fout->remoteVersion >= 80400) - appendPQExpBufferStr(query, - "pg_catalog.pg_get_expr(typdefaultbin, 0) AS typdefaultbin, typdefault "); - else - appendPQExpBufferStr(query, - "pg_catalog.pg_get_expr(typdefaultbin, 'pg_catalog.pg_type'::pg_catalog.regclass) AS typdefaultbin, typdefault "); + "'-' AS typsubscript, 0 AS typsubscriptoid "); appendPQExpBufferStr(query, "FROM pg_catalog.pg_type " "WHERE oid = $1"); @@ -11358,28 +10595,15 @@ dumpDomain(Archive *fout, const TypeInfo *tyinfo) appendPQExpBufferStr(query, "PREPARE dumpDomain(pg_catalog.oid) AS\n"); - if (fout->remoteVersion >= 90100) - { - /* typcollation is new in 9.1 */ - appendPQExpBufferStr(query, "SELECT t.typnotnull, " - "pg_catalog.format_type(t.typbasetype, t.typtypmod) AS typdefn, " - "pg_catalog.pg_get_expr(t.typdefaultbin, 'pg_catalog.pg_type'::pg_catalog.regclass) AS typdefaultbin, " - "t.typdefault, " - "CASE WHEN t.typcollation <> u.typcollation " - "THEN t.typcollation ELSE 0 END AS typcollation " - "FROM pg_catalog.pg_type t " - "LEFT JOIN pg_catalog.pg_type u ON (t.typbasetype = u.oid) " - "WHERE t.oid = $1"); - } - else - { - appendPQExpBufferStr(query, "SELECT typnotnull, " - "pg_catalog.format_type(typbasetype, typtypmod) AS typdefn, " - "pg_catalog.pg_get_expr(typdefaultbin, 'pg_catalog.pg_type'::pg_catalog.regclass) AS typdefaultbin, " - "typdefault, 0 AS typcollation " - "FROM pg_catalog.pg_type " - "WHERE oid = $1"); - } + appendPQExpBufferStr(query, "SELECT t.typnotnull, " + "pg_catalog.format_type(t.typbasetype, t.typtypmod) AS typdefn, " + "pg_catalog.pg_get_expr(t.typdefaultbin, 'pg_catalog.pg_type'::pg_catalog.regclass) AS typdefaultbin, " + "t.typdefault, " + "CASE WHEN t.typcollation <> u.typcollation " + "THEN t.typcollation ELSE 0 END AS typcollation " + "FROM pg_catalog.pg_type t " + "LEFT JOIN pg_catalog.pg_type u ON (t.typbasetype = u.oid) " + "WHERE t.oid = $1"); ExecuteSqlStatement(fout, query->data); @@ -11544,45 +10768,26 @@ dumpCompositeType(Archive *fout, const TypeInfo *tyinfo) if (!fout->is_prepared[PREPQUERY_DUMPCOMPOSITETYPE]) { - /* Set up query for type-specific details */ + /* + * Set up query for type-specific details. + * + * Since we only want to dump COLLATE clauses for attributes whose + * collation is different from their type's default, we use a CASE + * here to suppress uninteresting attcollations cheaply. atttypid + * will be 0 for dropped columns; collation does not matter for those. + */ appendPQExpBufferStr(query, - "PREPARE dumpCompositeType(pg_catalog.oid) AS\n"); - - if (fout->remoteVersion >= 90100) - { - /* - * attcollation is new in 9.1. Since we only want to dump COLLATE - * clauses for attributes whose collation is different from their - * type's default, we use a CASE here to suppress uninteresting - * attcollations cheaply. atttypid will be 0 for dropped columns; - * collation does not matter for those. - */ - appendPQExpBufferStr(query, "SELECT a.attname, " - "pg_catalog.format_type(a.atttypid, a.atttypmod) AS atttypdefn, " - "a.attlen, a.attalign, a.attisdropped, " - "CASE WHEN a.attcollation <> at.typcollation " - "THEN a.attcollation ELSE 0 END AS attcollation " - "FROM pg_catalog.pg_type ct " - "JOIN pg_catalog.pg_attribute a ON a.attrelid = ct.typrelid " - "LEFT JOIN pg_catalog.pg_type at ON at.oid = a.atttypid " - "WHERE ct.oid = $1 " - "ORDER BY a.attnum"); - } - else - { - /* - * Since ALTER TYPE could not drop columns until 9.1, attisdropped - * should always be false. - */ - appendPQExpBufferStr(query, "SELECT a.attname, " - "pg_catalog.format_type(a.atttypid, a.atttypmod) AS atttypdefn, " - "a.attlen, a.attalign, a.attisdropped, " - "0 AS attcollation " - "FROM pg_catalog.pg_type ct, pg_catalog.pg_attribute a " - "WHERE ct.oid = $1 " - "AND a.attrelid = ct.typrelid " - "ORDER BY a.attnum"); - } + "PREPARE dumpCompositeType(pg_catalog.oid) AS\n" + "SELECT a.attname, " + "pg_catalog.format_type(a.atttypid, a.atttypmod) AS atttypdefn, " + "a.attlen, a.attalign, a.attisdropped, " + "CASE WHEN a.attcollation <> at.typcollation " + "THEN a.attcollation ELSE 0 END AS attcollation " + "FROM pg_catalog.pg_type ct " + "JOIN pg_catalog.pg_attribute a ON a.attrelid = ct.typrelid " + "LEFT JOIN pg_catalog.pg_type at ON at.oid = a.atttypid " + "WHERE ct.oid = $1 " + "ORDER BY a.attnum"); ExecuteSqlStatement(fout, query->data); @@ -12049,82 +11254,11 @@ format_function_arguments(const FuncInfo *finfo, const char *funcargs, bool is_a return fn.data; } -/* - * format_function_arguments_old: generate function name and argument list - * - * The argument type names are qualified if needed. The function name - * is never qualified. - * - * This is used only with pre-8.4 servers, so we aren't expecting to see - * VARIADIC or TABLE arguments, nor are there any defaults for arguments. - * - * Any or all of allargtypes, argmodes, argnames may be NULL. - */ -static char * -format_function_arguments_old(Archive *fout, - const FuncInfo *finfo, int nallargs, - char **allargtypes, - char **argmodes, - char **argnames) -{ - PQExpBufferData fn; - int j; - - initPQExpBuffer(&fn); - appendPQExpBuffer(&fn, "%s(", fmtId(finfo->dobj.name)); - for (j = 0; j < nallargs; j++) - { - Oid typid; - const char *typname; - const char *argmode; - const char *argname; - - typid = allargtypes ? atooid(allargtypes[j]) : finfo->argtypes[j]; - typname = getFormattedTypeName(fout, typid, zeroIsError); - - if (argmodes) - { - switch (argmodes[j][0]) - { - case PROARGMODE_IN: - argmode = ""; - break; - case PROARGMODE_OUT: - argmode = "OUT "; - break; - case PROARGMODE_INOUT: - argmode = "INOUT "; - break; - default: - pg_log_warning("bogus value in proargmodes array"); - argmode = ""; - break; - } - } - else - argmode = ""; - - argname = argnames ? argnames[j] : (char *) NULL; - if (argname && argname[0] == '\0') - argname = NULL; - - appendPQExpBuffer(&fn, "%s%s%s%s%s", - (j > 0) ? ", " : "", - argmode, - argname ? fmtId(argname) : "", - argname ? " " : "", - typname); - } - appendPQExpBufferChar(&fn, ')'); - return fn.data; -} - /* * format_function_signature: generate function name and argument list * - * This is like format_function_arguments_old except that only a minimal - * list of input argument types is generated; this is sufficient to - * reference the function, but not to define it. + * Only a minimal list of input argument types is generated; this is + * sufficient to reference the function, but not to define it. * * If honor_quotes is false then the function name is never quoted. * This is appropriate for use in TOC tags, but not in SQL commands. @@ -12225,47 +11359,14 @@ dumpFunc(Archive *fout, const FuncInfo *finfo) "provolatile,\n" "proisstrict,\n" "prosecdef,\n" - "lanname,\n"); - - if (fout->remoteVersion >= 80300) - appendPQExpBufferStr(query, - "proconfig,\n" - "procost,\n" - "prorows,\n"); - else - appendPQExpBufferStr(query, - "null AS proconfig,\n" - "0 AS procost,\n" - "0 AS prorows,\n"); - - if (fout->remoteVersion >= 80400) - { - /* - * In 8.4 and up we rely on pg_get_function_arguments and - * pg_get_function_result instead of examining proallargtypes etc. - */ - appendPQExpBufferStr(query, - "pg_catalog.pg_get_function_arguments(p.oid) AS funcargs,\n" - "pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs,\n" - "pg_catalog.pg_get_function_result(p.oid) AS funcresult,\n"); - } - else if (fout->remoteVersion >= 80100) - appendPQExpBufferStr(query, - "proallargtypes,\n" - "proargmodes,\n" - "proargnames,\n"); - else - appendPQExpBufferStr(query, - "null AS proallargtypes,\n" - "null AS proargmodes,\n" - "proargnames,\n"); - - if (fout->remoteVersion >= 90200) - appendPQExpBufferStr(query, - "proleakproof,\n"); - else - appendPQExpBufferStr(query, - "false AS proleakproof,\n"); + "lanname,\n" + "proconfig,\n" + "procost,\n" + "prorows,\n" + "pg_catalog.pg_get_function_arguments(p.oid) AS funcargs,\n" + "pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs,\n" + "pg_catalog.pg_get_function_result(p.oid) AS funcresult,\n" + "proleakproof,\n"); if (fout->remoteVersion >= 90500) appendPQExpBufferStr(query, @@ -12281,12 +11382,9 @@ dumpFunc(Archive *fout, const FuncInfo *finfo) if (fout->remoteVersion >= 110000) appendPQExpBufferStr(query, "prokind,\n"); - else if (fout->remoteVersion >= 80400) - appendPQExpBufferStr(query, - "CASE WHEN proiswindow THEN 'w' ELSE 'f' END AS prokind,\n"); else appendPQExpBufferStr(query, - "'f' AS prokind,\n"); + "CASE WHEN proiswindow THEN 'w' ELSE 'f' END AS prokind,\n"); if (fout->remoteVersion >= 120000) appendPQExpBufferStr(query, @@ -12331,20 +11429,10 @@ dumpFunc(Archive *fout, const FuncInfo *finfo) probin = NULL; prosqlbody = PQgetvalue(res, 0, PQfnumber(res, "prosqlbody")); } - if (fout->remoteVersion >= 80400) - { - funcargs = PQgetvalue(res, 0, PQfnumber(res, "funcargs")); - funciargs = PQgetvalue(res, 0, PQfnumber(res, "funciargs")); - funcresult = PQgetvalue(res, 0, PQfnumber(res, "funcresult")); - proallargtypes = proargmodes = proargnames = NULL; - } - else - { - proallargtypes = PQgetvalue(res, 0, PQfnumber(res, "proallargtypes")); - proargmodes = PQgetvalue(res, 0, PQfnumber(res, "proargmodes")); - proargnames = PQgetvalue(res, 0, PQfnumber(res, "proargnames")); - funcargs = funciargs = funcresult = NULL; - } + funcargs = PQgetvalue(res, 0, PQfnumber(res, "funcargs")); + funciargs = PQgetvalue(res, 0, PQfnumber(res, "funciargs")); + funcresult = PQgetvalue(res, 0, PQfnumber(res, "funcresult")); + proallargtypes = proargmodes = proargnames = NULL; if (PQfnumber(res, "protrftypes") != -1) protrftypes = PQgetvalue(res, 0, PQfnumber(res, "protrftypes")); else @@ -12460,17 +11548,8 @@ dumpFunc(Archive *fout, const FuncInfo *finfo) nconfigitems = 0; } - if (funcargs) - { - /* 8.4 or later; we rely on server-side code for most of the work */ - funcfullsig = format_function_arguments(finfo, funcargs, false); - funcsig = format_function_arguments(finfo, funciargs, false); - } - else - /* pre-8.4, do it ourselves */ - funcsig = format_function_arguments_old(fout, - finfo, nallargs, allargtypes, - argmodes, argnames); + funcfullsig = format_function_arguments(finfo, funcargs, false); + funcsig = format_function_arguments(finfo, funciargs, false); funcsig_tag = format_function_signature(fout, finfo, false); @@ -12984,37 +12063,18 @@ dumpOpr(Archive *fout, const OprInfo *oprinfo) { /* Set up query for operator-specific details */ appendPQExpBufferStr(query, - "PREPARE dumpOpr(pg_catalog.oid) AS\n"); - - if (fout->remoteVersion >= 80300) - { - appendPQExpBufferStr(query, "SELECT oprkind, " - "oprcode::pg_catalog.regprocedure, " - "oprleft::pg_catalog.regtype, " - "oprright::pg_catalog.regtype, " - "oprcom, " - "oprnegate, " - "oprrest::pg_catalog.regprocedure, " - "oprjoin::pg_catalog.regprocedure, " - "oprcanmerge, oprcanhash " - "FROM pg_catalog.pg_operator " - "WHERE oid = $1"); - } - else - { - appendPQExpBufferStr(query, "SELECT oprkind, " - "oprcode::pg_catalog.regprocedure, " - "oprleft::pg_catalog.regtype, " - "oprright::pg_catalog.regtype, " - "oprcom, " - "oprnegate, " - "oprrest::pg_catalog.regprocedure, " - "oprjoin::pg_catalog.regprocedure, " - "(oprlsortop != 0) AS oprcanmerge, " - "oprcanhash " - "FROM pg_catalog.pg_operator " - "WHERE oid = $1"); - } + "PREPARE dumpOpr(pg_catalog.oid) AS\n" + "SELECT oprkind, " + "oprcode::pg_catalog.regprocedure, " + "oprleft::pg_catalog.regtype, " + "oprright::pg_catalog.regtype, " + "oprcom, " + "oprnegate, " + "oprrest::pg_catalog.regprocedure, " + "oprjoin::pg_catalog.regprocedure, " + "oprcanmerge, oprcanhash " + "FROM pg_catalog.pg_operator " + "WHERE oid = $1"); ExecuteSqlStatement(fout, query->data); @@ -13347,7 +12407,6 @@ dumpOpclass(Archive *fout, const OpclassInfo *opcinfo) int i_opcfamilynsp; int i_amname; int i_amopstrategy; - int i_amopreqcheck; int i_amopopr; int i_sortfamily; int i_sortfamilynsp; @@ -13363,7 +12422,6 @@ dumpOpclass(Archive *fout, const OpclassInfo *opcinfo) char *opcfamilynsp; char *amname; char *amopstrategy; - char *amopreqcheck; char *amopopr; char *sortfamily; char *sortfamilynsp; @@ -13384,32 +12442,17 @@ dumpOpclass(Archive *fout, const OpclassInfo *opcinfo) nameusing = createPQExpBuffer(); /* Get additional fields from the pg_opclass row */ - if (fout->remoteVersion >= 80300) - { - appendPQExpBuffer(query, "SELECT opcintype::pg_catalog.regtype, " - "opckeytype::pg_catalog.regtype, " - "opcdefault, opcfamily, " - "opfname AS opcfamilyname, " - "nspname AS opcfamilynsp, " - "(SELECT amname FROM pg_catalog.pg_am WHERE oid = opcmethod) AS amname " - "FROM pg_catalog.pg_opclass c " - "LEFT JOIN pg_catalog.pg_opfamily f ON f.oid = opcfamily " - "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = opfnamespace " - "WHERE c.oid = '%u'::pg_catalog.oid", - opcinfo->dobj.catId.oid); - } - else - { - appendPQExpBuffer(query, "SELECT opcintype::pg_catalog.regtype, " - "opckeytype::pg_catalog.regtype, " - "opcdefault, NULL AS opcfamily, " - "NULL AS opcfamilyname, " - "NULL AS opcfamilynsp, " - "(SELECT amname FROM pg_catalog.pg_am WHERE oid = opcamid) AS amname " - "FROM pg_catalog.pg_opclass " - "WHERE oid = '%u'::pg_catalog.oid", - opcinfo->dobj.catId.oid); - } + appendPQExpBuffer(query, "SELECT opcintype::pg_catalog.regtype, " + "opckeytype::pg_catalog.regtype, " + "opcdefault, opcfamily, " + "opfname AS opcfamilyname, " + "nspname AS opcfamilynsp, " + "(SELECT amname FROM pg_catalog.pg_am WHERE oid = opcmethod) AS amname " + "FROM pg_catalog.pg_opclass c " + "LEFT JOIN pg_catalog.pg_opfamily f ON f.oid = opcfamily " + "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = opfnamespace " + "WHERE c.oid = '%u'::pg_catalog.oid", + opcinfo->dobj.catId.oid); res = ExecuteSqlQueryForSingleRow(fout, query->data); @@ -13469,82 +12512,28 @@ dumpOpclass(Archive *fout, const OpclassInfo *opcinfo) * * Print only those opfamily members that are tied to the opclass by * pg_depend entries. - * - * XXX RECHECK is gone as of 8.4, but we'll still print it if dumping an - * older server's opclass in which it is used. This is to avoid - * hard-to-detect breakage if a newer pg_dump is used to dump from an - * older server and then reload into that old version. This can go away - * once 8.3 is so old as to not be of interest to anyone. */ resetPQExpBuffer(query); - - if (fout->remoteVersion >= 90100) - { - appendPQExpBuffer(query, "SELECT amopstrategy, false AS amopreqcheck, " - "amopopr::pg_catalog.regoperator, " - "opfname AS sortfamily, " - "nspname AS sortfamilynsp " - "FROM pg_catalog.pg_amop ao JOIN pg_catalog.pg_depend ON " - "(classid = 'pg_catalog.pg_amop'::pg_catalog.regclass AND objid = ao.oid) " - "LEFT JOIN pg_catalog.pg_opfamily f ON f.oid = amopsortfamily " - "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = opfnamespace " - "WHERE refclassid = 'pg_catalog.pg_opclass'::pg_catalog.regclass " - "AND refobjid = '%u'::pg_catalog.oid " - "AND amopfamily = '%s'::pg_catalog.oid " - "ORDER BY amopstrategy", - opcinfo->dobj.catId.oid, - opcfamily); - } - else if (fout->remoteVersion >= 80400) - { - appendPQExpBuffer(query, "SELECT amopstrategy, false AS amopreqcheck, " - "amopopr::pg_catalog.regoperator, " - "NULL AS sortfamily, " - "NULL AS sortfamilynsp " - "FROM pg_catalog.pg_amop ao, pg_catalog.pg_depend " - "WHERE refclassid = 'pg_catalog.pg_opclass'::pg_catalog.regclass " - "AND refobjid = '%u'::pg_catalog.oid " - "AND classid = 'pg_catalog.pg_amop'::pg_catalog.regclass " - "AND objid = ao.oid " - "ORDER BY amopstrategy", - opcinfo->dobj.catId.oid); - } - else if (fout->remoteVersion >= 80300) - { - appendPQExpBuffer(query, "SELECT amopstrategy, amopreqcheck, " - "amopopr::pg_catalog.regoperator, " - "NULL AS sortfamily, " - "NULL AS sortfamilynsp " - "FROM pg_catalog.pg_amop ao, pg_catalog.pg_depend " - "WHERE refclassid = 'pg_catalog.pg_opclass'::pg_catalog.regclass " - "AND refobjid = '%u'::pg_catalog.oid " - "AND classid = 'pg_catalog.pg_amop'::pg_catalog.regclass " - "AND objid = ao.oid " - "ORDER BY amopstrategy", - opcinfo->dobj.catId.oid); - } - else - { - /* - * Here, we print all entries since there are no opfamilies and hence - * no loose operators to worry about. - */ - appendPQExpBuffer(query, "SELECT amopstrategy, amopreqcheck, " - "amopopr::pg_catalog.regoperator, " - "NULL AS sortfamily, " - "NULL AS sortfamilynsp " - "FROM pg_catalog.pg_amop " - "WHERE amopclaid = '%u'::pg_catalog.oid " - "ORDER BY amopstrategy", - opcinfo->dobj.catId.oid); - } + appendPQExpBuffer(query, "SELECT amopstrategy, " + "amopopr::pg_catalog.regoperator, " + "opfname AS sortfamily, " + "nspname AS sortfamilynsp " + "FROM pg_catalog.pg_amop ao JOIN pg_catalog.pg_depend ON " + "(classid = 'pg_catalog.pg_amop'::pg_catalog.regclass AND objid = ao.oid) " + "LEFT JOIN pg_catalog.pg_opfamily f ON f.oid = amopsortfamily " + "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = opfnamespace " + "WHERE refclassid = 'pg_catalog.pg_opclass'::pg_catalog.regclass " + "AND refobjid = '%u'::pg_catalog.oid " + "AND amopfamily = '%s'::pg_catalog.oid " + "ORDER BY amopstrategy", + opcinfo->dobj.catId.oid, + opcfamily); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); ntups = PQntuples(res); i_amopstrategy = PQfnumber(res, "amopstrategy"); - i_amopreqcheck = PQfnumber(res, "amopreqcheck"); i_amopopr = PQfnumber(res, "amopopr"); i_sortfamily = PQfnumber(res, "sortfamily"); i_sortfamilynsp = PQfnumber(res, "sortfamilynsp"); @@ -13552,7 +12541,6 @@ dumpOpclass(Archive *fout, const OpclassInfo *opcinfo) for (i = 0; i < ntups; i++) { amopstrategy = PQgetvalue(res, i, i_amopstrategy); - amopreqcheck = PQgetvalue(res, i, i_amopreqcheck); amopopr = PQgetvalue(res, i, i_amopopr); sortfamily = PQgetvalue(res, i, i_sortfamily); sortfamilynsp = PQgetvalue(res, i, i_sortfamilynsp); @@ -13570,9 +12558,6 @@ dumpOpclass(Archive *fout, const OpclassInfo *opcinfo) appendPQExpBufferStr(q, fmtId(sortfamily)); } - if (strcmp(amopreqcheck, "t") == 0) - appendPQExpBufferStr(q, " RECHECK"); - needComma = true; } @@ -13586,37 +12571,21 @@ dumpOpclass(Archive *fout, const OpclassInfo *opcinfo) * * We print the amproclefttype/amprocrighttype even though in most cases * the backend could deduce the right values, because of the corner case - * of a btree sort support function for a cross-type comparison. That's - * only allowed in 9.2 and later, but for simplicity print them in all - * versions that have the columns. + * of a btree sort support function for a cross-type comparison. */ resetPQExpBuffer(query); - if (fout->remoteVersion >= 80300) - { - appendPQExpBuffer(query, "SELECT amprocnum, " - "amproc::pg_catalog.regprocedure, " - "amproclefttype::pg_catalog.regtype, " - "amprocrighttype::pg_catalog.regtype " - "FROM pg_catalog.pg_amproc ap, pg_catalog.pg_depend " - "WHERE refclassid = 'pg_catalog.pg_opclass'::pg_catalog.regclass " - "AND refobjid = '%u'::pg_catalog.oid " - "AND classid = 'pg_catalog.pg_amproc'::pg_catalog.regclass " - "AND objid = ap.oid " - "ORDER BY amprocnum", - opcinfo->dobj.catId.oid); - } - else - { - appendPQExpBuffer(query, "SELECT amprocnum, " - "amproc::pg_catalog.regprocedure, " - "'' AS amproclefttype, " - "'' AS amprocrighttype " - "FROM pg_catalog.pg_amproc " - "WHERE amopclaid = '%u'::pg_catalog.oid " - "ORDER BY amprocnum", - opcinfo->dobj.catId.oid); - } + appendPQExpBuffer(query, "SELECT amprocnum, " + "amproc::pg_catalog.regprocedure, " + "amproclefttype::pg_catalog.regtype, " + "amprocrighttype::pg_catalog.regtype " + "FROM pg_catalog.pg_amproc ap, pg_catalog.pg_depend " + "WHERE refclassid = 'pg_catalog.pg_opclass'::pg_catalog.regclass " + "AND refobjid = '%u'::pg_catalog.oid " + "AND classid = 'pg_catalog.pg_amproc'::pg_catalog.regclass " + "AND objid = ap.oid " + "ORDER BY amprocnum", + opcinfo->dobj.catId.oid); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -13715,7 +12684,6 @@ dumpOpfamily(Archive *fout, const OpfamilyInfo *opfinfo) int ntups; int i_amname; int i_amopstrategy; - int i_amopreqcheck; int i_amopopr; int i_sortfamily; int i_sortfamilynsp; @@ -13725,7 +12693,6 @@ dumpOpfamily(Archive *fout, const OpfamilyInfo *opfinfo) int i_amprocrighttype; char *amname; char *amopstrategy; - char *amopreqcheck; char *amopopr; char *sortfamily; char *sortfamilynsp; @@ -13748,58 +12715,21 @@ dumpOpfamily(Archive *fout, const OpfamilyInfo *opfinfo) /* * Fetch only those opfamily members that are tied directly to the * opfamily by pg_depend entries. - * - * XXX RECHECK is gone as of 8.4, but we'll still print it if dumping an - * older server's opclass in which it is used. This is to avoid - * hard-to-detect breakage if a newer pg_dump is used to dump from an - * older server and then reload into that old version. This can go away - * once 8.3 is so old as to not be of interest to anyone. */ - if (fout->remoteVersion >= 90100) - { - appendPQExpBuffer(query, "SELECT amopstrategy, false AS amopreqcheck, " - "amopopr::pg_catalog.regoperator, " - "opfname AS sortfamily, " - "nspname AS sortfamilynsp " - "FROM pg_catalog.pg_amop ao JOIN pg_catalog.pg_depend ON " - "(classid = 'pg_catalog.pg_amop'::pg_catalog.regclass AND objid = ao.oid) " - "LEFT JOIN pg_catalog.pg_opfamily f ON f.oid = amopsortfamily " - "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = opfnamespace " - "WHERE refclassid = 'pg_catalog.pg_opfamily'::pg_catalog.regclass " - "AND refobjid = '%u'::pg_catalog.oid " - "AND amopfamily = '%u'::pg_catalog.oid " - "ORDER BY amopstrategy", - opfinfo->dobj.catId.oid, - opfinfo->dobj.catId.oid); - } - else if (fout->remoteVersion >= 80400) - { - appendPQExpBuffer(query, "SELECT amopstrategy, false AS amopreqcheck, " - "amopopr::pg_catalog.regoperator, " - "NULL AS sortfamily, " - "NULL AS sortfamilynsp " - "FROM pg_catalog.pg_amop ao, pg_catalog.pg_depend " - "WHERE refclassid = 'pg_catalog.pg_opfamily'::pg_catalog.regclass " - "AND refobjid = '%u'::pg_catalog.oid " - "AND classid = 'pg_catalog.pg_amop'::pg_catalog.regclass " - "AND objid = ao.oid " - "ORDER BY amopstrategy", - opfinfo->dobj.catId.oid); - } - else - { - appendPQExpBuffer(query, "SELECT amopstrategy, amopreqcheck, " - "amopopr::pg_catalog.regoperator, " - "NULL AS sortfamily, " - "NULL AS sortfamilynsp " - "FROM pg_catalog.pg_amop ao, pg_catalog.pg_depend " - "WHERE refclassid = 'pg_catalog.pg_opfamily'::pg_catalog.regclass " - "AND refobjid = '%u'::pg_catalog.oid " - "AND classid = 'pg_catalog.pg_amop'::pg_catalog.regclass " - "AND objid = ao.oid " - "ORDER BY amopstrategy", - opfinfo->dobj.catId.oid); - } + appendPQExpBuffer(query, "SELECT amopstrategy, " + "amopopr::pg_catalog.regoperator, " + "opfname AS sortfamily, " + "nspname AS sortfamilynsp " + "FROM pg_catalog.pg_amop ao JOIN pg_catalog.pg_depend ON " + "(classid = 'pg_catalog.pg_amop'::pg_catalog.regclass AND objid = ao.oid) " + "LEFT JOIN pg_catalog.pg_opfamily f ON f.oid = amopsortfamily " + "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = opfnamespace " + "WHERE refclassid = 'pg_catalog.pg_opfamily'::pg_catalog.regclass " + "AND refobjid = '%u'::pg_catalog.oid " + "AND amopfamily = '%u'::pg_catalog.oid " + "ORDER BY amopstrategy", + opfinfo->dobj.catId.oid, + opfinfo->dobj.catId.oid); res_ops = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -13864,7 +12794,6 @@ dumpOpfamily(Archive *fout, const OpfamilyInfo *opfinfo) ntups = PQntuples(res_ops); i_amopstrategy = PQfnumber(res_ops, "amopstrategy"); - i_amopreqcheck = PQfnumber(res_ops, "amopreqcheck"); i_amopopr = PQfnumber(res_ops, "amopopr"); i_sortfamily = PQfnumber(res_ops, "sortfamily"); i_sortfamilynsp = PQfnumber(res_ops, "sortfamilynsp"); @@ -13872,7 +12801,6 @@ dumpOpfamily(Archive *fout, const OpfamilyInfo *opfinfo) for (i = 0; i < ntups; i++) { amopstrategy = PQgetvalue(res_ops, i, i_amopstrategy); - amopreqcheck = PQgetvalue(res_ops, i, i_amopreqcheck); amopopr = PQgetvalue(res_ops, i, i_amopopr); sortfamily = PQgetvalue(res_ops, i, i_sortfamily); sortfamilynsp = PQgetvalue(res_ops, i, i_sortfamilynsp); @@ -13890,9 +12818,6 @@ dumpOpfamily(Archive *fout, const OpfamilyInfo *opfinfo) appendPQExpBufferStr(q, fmtId(sortfamily)); } - if (strcmp(amopreqcheck, "t") == 0) - appendPQExpBufferStr(q, " RECHECK"); - needComma = true; } @@ -14301,19 +13226,10 @@ dumpAgg(Archive *fout, const AggInfo *agginfo) "aggtransfn,\n" "aggfinalfn,\n" "aggtranstype::pg_catalog.regtype,\n" - "agginitval,\n"); - - if (fout->remoteVersion >= 80100) - appendPQExpBufferStr(query, - "aggsortop,\n"); - else - appendPQExpBufferStr(query, - "0 AS aggsortop,\n"); - - if (fout->remoteVersion >= 80400) - appendPQExpBufferStr(query, - "pg_catalog.pg_get_function_arguments(p.oid) AS funcargs,\n" - "pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs,\n"); + "agginitval,\n" + "aggsortop,\n" + "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, @@ -14403,9 +13319,7 @@ dumpAgg(Archive *fout, const AggInfo *agginfo) aggminitval = PQgetvalue(res, 0, i_aggminitval); proparallel = PQgetvalue(res, 0, PQfnumber(res, "proparallel")); - if (fout->remoteVersion >= 80400) { - /* 8.4 or later; we rely on server-side code for most of the work */ char *funcargs; char *funciargs; @@ -14414,9 +13328,6 @@ dumpAgg(Archive *fout, const AggInfo *agginfo) aggfullsig = format_function_arguments(&agginfo->aggfn, funcargs, true); aggsig = format_function_arguments(&agginfo->aggfn, funciargs, true); } - else - /* pre-8.4, do it ourselves */ - aggsig = format_aggregate_signature(agginfo, fout, true); aggsig_tag = format_aggregate_signature(agginfo, fout, false); @@ -17492,29 +16403,6 @@ dumpTableConstraintComment(Archive *fout, const ConstraintInfo *coninfo) free(qtabname); } -/* - * findLastBuiltinOid_V71 - - * - * find the last built in oid - * - * For 7.1 through 8.0, we do this by retrieving datlastsysoid from the - * pg_database entry for the current database. (Note: current_database() - * requires 7.3; pg_dump requires 8.0 now.) - */ -static Oid -findLastBuiltinOid_V71(Archive *fout) -{ - PGresult *res; - Oid last_oid; - - res = ExecuteSqlQueryForSingleRow(fout, - "SELECT datlastsysoid FROM pg_database WHERE datname = current_database()"); - last_oid = atooid(PQgetvalue(res, 0, PQfnumber(res, "datlastsysoid"))); - PQclear(res); - - return last_oid; -} - /* * dumpSequence * write the declaration (not data) of one user-defined sequence @@ -17553,7 +16441,7 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo) "WHERE seqrelid = '%u'::oid", tbinfo->dobj.catId.oid); } - else if (fout->remoteVersion >= 80400) + else { /* * Before PostgreSQL 10, sequence metadata is in the sequence itself. @@ -17567,14 +16455,6 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo) "cache_value, is_cycled FROM %s", fmtQualifiedDumpable(tbinfo)); } - else - { - appendPQExpBuffer(query, - "SELECT 'bigint' AS sequence_type, " - "0 AS start_value, increment_by, max_value, min_value, " - "cache_value, is_cycled FROM %s", - fmtQualifiedDumpable(tbinfo)); - } res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -17680,8 +16560,7 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo) appendPQExpBuffer(query, " AS %s\n", seqtype); } - if (fout->remoteVersion >= 80400) - appendPQExpBuffer(query, " START WITH %s\n", startv); + appendPQExpBuffer(query, " START WITH %s\n", startv); appendPQExpBuffer(query, " INCREMENT BY %s\n", incby); @@ -18644,28 +17523,21 @@ getDependencies(Archive *fout) * entries will have dependencies on their parent opfamily, which we * should drop since they'd likewise become useless self-dependencies. * (But be sure to keep deps on *other* opfamilies; see amopsortfamily.) - * - * Skip this for pre-8.3 source servers: pg_opfamily doesn't exist there, - * and the (known) cases where it would matter to have these dependencies - * can't arise anyway. */ - if (fout->remoteVersion >= 80300) - { - appendPQExpBufferStr(query, "UNION ALL\n" - "SELECT 'pg_opfamily'::regclass AS classid, amopfamily AS objid, refclassid, refobjid, deptype " - "FROM pg_depend d, pg_amop o " - "WHERE deptype NOT IN ('p', 'e', 'i') AND " - "classid = 'pg_amop'::regclass AND objid = o.oid " - "AND NOT (refclassid = 'pg_opfamily'::regclass AND amopfamily = refobjid)\n"); + appendPQExpBufferStr(query, "UNION ALL\n" + "SELECT 'pg_opfamily'::regclass AS classid, amopfamily AS objid, refclassid, refobjid, deptype " + "FROM pg_depend d, pg_amop o " + "WHERE deptype NOT IN ('p', 'e', 'i') AND " + "classid = 'pg_amop'::regclass AND objid = o.oid " + "AND NOT (refclassid = 'pg_opfamily'::regclass AND amopfamily = refobjid)\n"); - /* Likewise for pg_amproc entries */ - appendPQExpBufferStr(query, "UNION ALL\n" - "SELECT 'pg_opfamily'::regclass AS classid, amprocfamily AS objid, refclassid, refobjid, deptype " - "FROM pg_depend d, pg_amproc p " - "WHERE deptype NOT IN ('p', 'e', 'i') AND " - "classid = 'pg_amproc'::regclass AND objid = p.oid " - "AND NOT (refclassid = 'pg_opfamily'::regclass AND amprocfamily = refobjid)\n"); - } + /* Likewise for pg_amproc entries */ + appendPQExpBufferStr(query, "UNION ALL\n" + "SELECT 'pg_opfamily'::regclass AS classid, amprocfamily AS objid, refclassid, refobjid, deptype " + "FROM pg_depend d, pg_amproc p " + "WHERE deptype NOT IN ('p', 'e', 'i') AND " + "classid = 'pg_amproc'::regclass AND objid = p.oid " + "AND NOT (refclassid = 'pg_opfamily'::regclass AND amprocfamily = refobjid)\n"); /* Sort the output for efficiency below */ appendPQExpBufferStr(query, "ORDER BY 1,2"); diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index 27b95732c8..9ff0c091a9 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -36,7 +36,6 @@ static void help(void); static void dropRoles(PGconn *conn); static void dumpRoles(PGconn *conn); static void dumpRoleMembership(PGconn *conn); -static void dumpGroups(PGconn *conn); static void dropTablespaces(PGconn *conn); static void dumpTablespaces(PGconn *conn); static void dropDBs(PGconn *conn); @@ -440,8 +439,7 @@ main(int argc, char *argv[]) /* * If there was a database specified on the command line, use that, * otherwise try to connect to database "postgres", and failing that - * "template1". "postgres" is the preferred choice for 8.1 and later - * servers, but it usually will not exist on older ones. + * "template1". */ if (pgdb) { @@ -517,7 +515,7 @@ main(int argc, char *argv[]) std_strings = "off"; /* Set the role if requested */ - if (use_role && server_version >= 80100) + if (use_role) { PQExpBuffer query = createPQExpBuffer(); @@ -527,7 +525,7 @@ main(int argc, char *argv[]) } /* Force quoting of all identifiers if requested. */ - if (quote_all_identifiers && server_version >= 90100) + if (quote_all_identifiers) executeCommand(conn, "SET quote_all_identifiers = true"); fprintf(OPF, "--\n-- PostgreSQL database cluster dump\n--\n\n"); @@ -581,11 +579,8 @@ main(int argc, char *argv[]) /* Dump roles (users) */ dumpRoles(conn); - /* Dump role memberships --- need different method for pre-8.1 */ - if (server_version >= 80100) - dumpRoleMembership(conn); - else - dumpGroups(conn); + /* Dump role memberships */ + dumpRoleMembership(conn); } /* Dump tablespaces */ @@ -698,19 +693,11 @@ dropRoles(PGconn *conn) "FROM %s " "WHERE rolname !~ '^pg_' " "ORDER BY 1", role_catalog); - else if (server_version >= 80100) + else printfPQExpBuffer(buf, "SELECT rolname " "FROM %s " "ORDER BY 1", role_catalog); - else - printfPQExpBuffer(buf, - "SELECT usename as rolname " - "FROM pg_shadow " - "UNION " - "SELECT groname as rolname " - "FROM pg_group " - "ORDER BY 1"); res = executeQuery(conn, buf->data); @@ -782,7 +769,7 @@ dumpRoles(PGconn *conn) "rolname = current_user AS is_current_user " "FROM %s " "ORDER BY 2", role_catalog, role_catalog); - else if (server_version >= 90100) + else printfPQExpBuffer(buf, "SELECT oid, rolname, rolsuper, rolinherit, " "rolcreaterole, rolcreatedb, " @@ -793,62 +780,6 @@ dumpRoles(PGconn *conn) "rolname = current_user AS is_current_user " "FROM %s " "ORDER BY 2", role_catalog, role_catalog); - else if (server_version >= 80200) - printfPQExpBuffer(buf, - "SELECT oid, rolname, rolsuper, rolinherit, " - "rolcreaterole, rolcreatedb, " - "rolcanlogin, rolconnlimit, rolpassword, " - "rolvaliduntil, false as rolreplication, " - "false as rolbypassrls, " - "pg_catalog.shobj_description(oid, '%s') as rolcomment, " - "rolname = current_user AS is_current_user " - "FROM %s " - "ORDER BY 2", role_catalog, role_catalog); - else if (server_version >= 80100) - printfPQExpBuffer(buf, - "SELECT oid, rolname, rolsuper, rolinherit, " - "rolcreaterole, rolcreatedb, " - "rolcanlogin, rolconnlimit, rolpassword, " - "rolvaliduntil, false as rolreplication, " - "false as rolbypassrls, " - "null as rolcomment, " - "rolname = current_user AS is_current_user " - "FROM %s " - "ORDER BY 2", role_catalog); - else - printfPQExpBuffer(buf, - "SELECT 0 as oid, usename as rolname, " - "usesuper as rolsuper, " - "true as rolinherit, " - "usesuper as rolcreaterole, " - "usecreatedb as rolcreatedb, " - "true as rolcanlogin, " - "-1 as rolconnlimit, " - "passwd as rolpassword, " - "valuntil as rolvaliduntil, " - "false as rolreplication, " - "false as rolbypassrls, " - "null as rolcomment, " - "usename = current_user AS is_current_user " - "FROM pg_shadow " - "UNION ALL " - "SELECT 0 as oid, groname as rolname, " - "false as rolsuper, " - "true as rolinherit, " - "false as rolcreaterole, " - "false as rolcreatedb, " - "false as rolcanlogin, " - "-1 as rolconnlimit, " - "null::text as rolpassword, " - "null::timestamptz as rolvaliduntil, " - "false as rolreplication, " - "false as rolbypassrls, " - "null as rolcomment, " - "false AS is_current_user " - "FROM pg_group " - "WHERE NOT EXISTS (SELECT 1 FROM pg_shadow " - " WHERE usename = groname) " - "ORDER BY 2"); res = executeQuery(conn, buf->data); @@ -967,7 +898,7 @@ dumpRoles(PGconn *conn) appendPQExpBufferStr(buf, ";\n"); } - if (!no_security_labels && server_version >= 90200) + if (!no_security_labels) buildShSecLabels(conn, "pg_authid", auth_oid, "ROLE", rolename, buf); @@ -980,6 +911,9 @@ dumpRoles(PGconn *conn) * We do it this way because config settings for roles could mention the * names of other roles. */ + if (PQntuples(res) > 0) + fprintf(OPF, "\n--\n-- User Configurations\n--\n"); + for (i = 0; i < PQntuples(res); i++) dumpUserConfig(conn, PQgetvalue(res, i, i_rolname)); @@ -992,7 +926,7 @@ dumpRoles(PGconn *conn) /* - * Dump role memberships. This code is used for 8.1 and later servers. + * Dump role memberships. * * Note: we expect dumpRoles already created all the roles, but there is * no membership yet. @@ -1049,75 +983,6 @@ dumpRoleMembership(PGconn *conn) fprintf(OPF, "\n\n"); } -/* - * Dump group memberships from a pre-8.1 server. It's annoying that we - * can't share any useful amount of code with the post-8.1 case, but - * the catalog representations are too different. - * - * Note: we expect dumpRoles already created all the roles, but there is - * no membership yet. - */ -static void -dumpGroups(PGconn *conn) -{ - PQExpBuffer buf = createPQExpBuffer(); - PGresult *res; - int i; - - res = executeQuery(conn, - "SELECT groname, grolist FROM pg_group ORDER BY 1"); - - if (PQntuples(res) > 0) - fprintf(OPF, "--\n-- Role memberships\n--\n\n"); - - for (i = 0; i < PQntuples(res); i++) - { - char *groname = PQgetvalue(res, i, 0); - char *grolist = PQgetvalue(res, i, 1); - PGresult *res2; - int j; - - /* - * Array representation is {1,2,3} ... convert to (1,2,3) - */ - if (strlen(grolist) < 3) - continue; - - grolist = pg_strdup(grolist); - grolist[0] = '('; - grolist[strlen(grolist) - 1] = ')'; - printfPQExpBuffer(buf, - "SELECT usename FROM pg_shadow " - "WHERE usesysid IN %s ORDER BY 1", - grolist); - free(grolist); - - res2 = executeQuery(conn, buf->data); - - for (j = 0; j < PQntuples(res2); j++) - { - char *usename = PQgetvalue(res2, j, 0); - - /* - * Don't try to grant a role to itself; can happen if old - * installation has identically named user and group. - */ - if (strcmp(groname, usename) == 0) - continue; - - fprintf(OPF, "GRANT %s", fmtId(groname)); - fprintf(OPF, " TO %s;\n", fmtId(usename)); - } - - PQclear(res2); - } - - PQclear(res); - destroyPQExpBuffer(buf); - - fprintf(OPF, "\n\n"); -} - /* * Drop tablespaces. @@ -1167,41 +1032,15 @@ dumpTablespaces(PGconn *conn) * Get all tablespaces except built-in ones (which we assume are named * pg_xxx) */ - if (server_version >= 90200) - res = executeQuery(conn, "SELECT oid, spcname, " - "pg_catalog.pg_get_userbyid(spcowner) AS spcowner, " - "pg_catalog.pg_tablespace_location(oid), " - "spcacl, acldefault('t', spcowner) AS acldefault, " - "array_to_string(spcoptions, ', ')," - "pg_catalog.shobj_description(oid, 'pg_tablespace') " - "FROM pg_catalog.pg_tablespace " - "WHERE spcname !~ '^pg_' " - "ORDER BY 1"); - else if (server_version >= 90000) - res = executeQuery(conn, "SELECT oid, spcname, " - "pg_catalog.pg_get_userbyid(spcowner) AS spcowner, " - "spclocation, spcacl, NULL AS acldefault, " - "array_to_string(spcoptions, ', ')," - "pg_catalog.shobj_description(oid, 'pg_tablespace') " - "FROM pg_catalog.pg_tablespace " - "WHERE spcname !~ '^pg_' " - "ORDER BY 1"); - else if (server_version >= 80200) - res = executeQuery(conn, "SELECT oid, spcname, " - "pg_catalog.pg_get_userbyid(spcowner) AS spcowner, " - "spclocation, spcacl, NULL AS acldefault, null, " - "pg_catalog.shobj_description(oid, 'pg_tablespace') " - "FROM pg_catalog.pg_tablespace " - "WHERE spcname !~ '^pg_' " - "ORDER BY 1"); - else - res = executeQuery(conn, "SELECT oid, spcname, " - "pg_catalog.pg_get_userbyid(spcowner) AS spcowner, " - "spclocation, spcacl, NULL AS acldefault, " - "null, null " - "FROM pg_catalog.pg_tablespace " - "WHERE spcname !~ '^pg_' " - "ORDER BY 1"); + res = executeQuery(conn, "SELECT oid, spcname, " + "pg_catalog.pg_get_userbyid(spcowner) AS spcowner, " + "pg_catalog.pg_tablespace_location(oid), " + "spcacl, acldefault('t', spcowner) AS acldefault, " + "array_to_string(spcoptions, ', ')," + "pg_catalog.shobj_description(oid, 'pg_tablespace') " + "FROM pg_catalog.pg_tablespace " + "WHERE spcname !~ '^pg_' " + "ORDER BY 1"); if (PQntuples(res) > 0) fprintf(OPF, "--\n-- Tablespaces\n--\n\n"); @@ -1253,7 +1092,7 @@ dumpTablespaces(PGconn *conn) appendPQExpBufferStr(buf, ";\n"); } - if (!no_security_labels && server_version >= 90200) + if (!no_security_labels) buildShSecLabels(conn, "pg_tablespace", spcoid, "TABLESPACE", spcname, buf); @@ -1323,52 +1162,31 @@ static void dumpUserConfig(PGconn *conn, const char *username) { PQExpBuffer buf = createPQExpBuffer(); - int count = 1; - bool first = true; + PGresult *res; - for (;;) + printfPQExpBuffer(buf, "SELECT unnest(setconfig) FROM pg_db_role_setting " + "WHERE setdatabase = 0 AND setrole = " + "(SELECT oid FROM %s WHERE rolname = ", + role_catalog); + appendStringLiteralConn(buf, username, conn); + appendPQExpBufferChar(buf, ')'); + + res = executeQuery(conn, buf->data); + + if (PQntuples(res) > 0) + fprintf(OPF, "\n--\n-- User Config \"%s\"\n--\n\n", username); + + for (int i = 0; i < PQntuples(res); i++) { - PGresult *res; - - if (server_version >= 90000) - printfPQExpBuffer(buf, "SELECT setconfig[%d] FROM pg_db_role_setting WHERE " - "setdatabase = 0 AND setrole = " - "(SELECT oid FROM %s WHERE rolname = ", count, role_catalog); - else if (server_version >= 80100) - printfPQExpBuffer(buf, "SELECT rolconfig[%d] FROM %s WHERE rolname = ", count, role_catalog); - else - printfPQExpBuffer(buf, "SELECT useconfig[%d] FROM pg_shadow WHERE usename = ", count); - appendStringLiteralConn(buf, username, conn); - if (server_version >= 90000) - appendPQExpBufferChar(buf, ')'); - - res = executeQuery(conn, buf->data); - if (PQntuples(res) == 1 && - !PQgetisnull(res, 0, 0)) - { - /* comment at section start, only if needed */ - if (first) - { - fprintf(OPF, "--\n-- User Configurations\n--\n\n"); - first = false; - } - - fprintf(OPF, "--\n-- User Config \"%s\"\n--\n\n", username); - resetPQExpBuffer(buf); - makeAlterConfigCommand(conn, PQgetvalue(res, 0, 0), - "ROLE", username, NULL, NULL, - buf); - fprintf(OPF, "%s", buf->data); - PQclear(res); - count++; - } - else - { - PQclear(res); - break; - } + resetPQExpBuffer(buf); + makeAlterConfigCommand(conn, PQgetvalue(res, i, 0), + "ROLE", username, NULL, NULL, + buf); + fprintf(OPF, "%s", buf->data); } + PQclear(res); + destroyPQExpBuffer(buf); } @@ -1775,11 +1593,11 @@ connectDatabase(const char *dbname, const char *connection_string, my_version = PG_VERSION_NUM; /* - * We allow the server to be back to 8.4, and up to any minor release of + * We allow the server to be back to 9.2, and up to any minor release of * our own major version. (See also version check in pg_dump.c.) */ if (my_version != server_version - && (server_version < 80400 || + && (server_version < 90200 || (server_version / 100) > (my_version / 100))) { pg_log_error("server version: %s; %s version: %s",