From 802c460a27cc1d01f8c8b9542488bbdfde60dc58 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 6 Nov 2020 15:48:21 -0500 Subject: [PATCH] Revert "pg_dump: Lock all relations, not just plain tables". Revert 403a3d91c, as well as the followup fix 7f4235032, in all branches. We need to think a bit harder about what the behavior of LOCK TABLE on views should be, and there's no time for that before next week's releases. We'll take another crack at this later. Discussion: https://postgr.es/m/16703-e348f58aab3cf6cc@postgresql.org --- src/bin/pg_dump/pg_backup.h | 2 - src/bin/pg_dump/pg_backup_db.c | 67 ---------------------------------- src/bin/pg_dump/pg_backup_db.h | 2 - src/bin/pg_dump/pg_dump.c | 17 ++++----- 4 files changed, 7 insertions(+), 81 deletions(-) diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h index 92e6bae63e..9a9b1e1d51 100644 --- a/src/bin/pg_dump/pg_backup.h +++ b/src/bin/pg_dump/pg_backup.h @@ -200,8 +200,6 @@ typedef struct Archive int minRemoteVersion; /* allowable range */ int maxRemoteVersion; - bool hasGenericLockTable; /* can LOCK TABLE do non-table rels */ - int numWorkers; /* number of parallel processes */ char *sync_snapshot_id; /* sync snapshot id for parallel operation */ diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c index 09c0b71003..3c3a313180 100644 --- a/src/bin/pg_dump/pg_backup_db.c +++ b/src/bin/pg_dump/pg_backup_db.c @@ -537,73 +537,6 @@ EndDBCopyMode(Archive *AHX, const char *tocEntryTag) } } -/* - * Does LOCK TABLE work on non-table relations on this server? - * - * Note: assumes it is called out of any transaction - */ -bool -IsLockTableGeneric(Archive *AHX) -{ - ArchiveHandle *AH = (ArchiveHandle *) AHX; - PGresult *res; - char *sqlstate; - bool retval; - - if (AHX->remoteVersion >= 140000) - return true; - else if (AHX->remoteVersion < 90500) - return false; - - StartTransaction(AHX); - - /* - * Try a LOCK TABLE on a well-known non-table catalog; WRONG_OBJECT_TYPE - * tells us that this server doesn't support locking non-table rels, while - * LOCK_NOT_AVAILABLE and INSUFFICIENT_PRIVILEGE tell us that it does. - * Report anything else as a fatal problem. - */ -#define ERRCODE_INSUFFICIENT_PRIVILEGE "42501" -#define ERRCODE_WRONG_OBJECT_TYPE "42809" -#define ERRCODE_LOCK_NOT_AVAILABLE "55P03" - res = PQexec(AH->connection, - "LOCK TABLE pg_catalog.pg_class_tblspc_relfilenode_index IN ACCESS SHARE MODE NOWAIT"); - switch (PQresultStatus(res)) - { - case PGRES_COMMAND_OK: - retval = true; - break; - case PGRES_FATAL_ERROR: - sqlstate = PQresultErrorField(res, PG_DIAG_SQLSTATE); - if (sqlstate && - strcmp(sqlstate, ERRCODE_WRONG_OBJECT_TYPE) == 0) - { - retval = false; - break; - } - else if (sqlstate && - (strcmp(sqlstate, ERRCODE_LOCK_NOT_AVAILABLE) == 0 || - strcmp(sqlstate, ERRCODE_INSUFFICIENT_PRIVILEGE) == 0)) - { - retval = true; - break; - } - /* else, falls through */ - default: - warn_or_exit_horribly(AH, modulename, - "LOCK TABLE failed for \"%s\": %s", - "pg_catalog.pg_class_tblspc_relfilenode_index", - PQerrorMessage(AH->connection)); - retval = false; /* not reached */ - break; - } - PQclear(res); - - CommitTransaction(AHX); - - return retval; -} - void StartTransaction(Archive *AHX) { diff --git a/src/bin/pg_dump/pg_backup_db.h b/src/bin/pg_dump/pg_backup_db.h index 0943f0700e..a79f5283fe 100644 --- a/src/bin/pg_dump/pg_backup_db.h +++ b/src/bin/pg_dump/pg_backup_db.h @@ -20,8 +20,6 @@ extern PGresult *ExecuteSqlQueryForSingleRow(Archive *fout, const char *query); extern void EndDBCopyMode(Archive *AHX, const char *tocEntryTag); -extern bool IsLockTableGeneric(Archive *AHX); - extern void StartTransaction(Archive *AHX); extern void CommitTransaction(Archive *AHX); diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 8c2fef2990..ad7c0376c9 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -1115,9 +1115,6 @@ setup_connection(Archive *AH, const char *dumpencoding, ExecuteSqlStatement(AH, "SET row_security = off"); } - /* Detect whether LOCK TABLE can handle non-table relations */ - AH->hasGenericLockTable = IsLockTableGeneric(AH); - /* * Start transaction-snapshot mode transaction to dump consistent data. */ @@ -6665,16 +6662,16 @@ getTables(Archive *fout, int *numTables) * assume our lock on the child is enough to prevent schema * alterations to parent tables. * - * We only need to lock the relation for certain components; see - * pg_dump.h + * NOTE: it'd be kinda nice to lock other relations too, not only + * plain or partitioned tables, but the backend doesn't presently + * allow that. * - * On server versions that support it, we lock all relations not just - * plain tables. + * We only need to lock the table for certain components; see + * pg_dump.h */ if (tblinfo[i].dobj.dump && - (fout->hasGenericLockTable || - tblinfo[i].relkind == RELKIND_PARTITIONED_TABLE || - tblinfo[i].relkind == RELKIND_RELATION) && + (tblinfo[i].relkind == RELKIND_RELATION || + tblinfo->relkind == RELKIND_PARTITIONED_TABLE) && (tblinfo[i].dobj.dump & DUMP_COMPONENTS_REQUIRING_LOCK)) { resetPQExpBuffer(query);