]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Revert "pg_dump: Lock all relations, not just plain tables".
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 6 Nov 2020 20:48:21 +0000 (15:48 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 6 Nov 2020 20:48:21 +0000 (15:48 -0500)
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
src/bin/pg_dump/pg_backup_db.c
src/bin/pg_dump/pg_backup_db.h
src/bin/pg_dump/pg_dump.c

index 4f0844255720d59819f4ea2f042b80438b21d9d8..cbd7541577d215182412ccf5cee495bdd5fae792 100644 (file)
@@ -188,8 +188,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 */
index ec085611711c51f94f0e7b1f5da4975cf37d176e..944d68a53c8d8f581e0eddf4c1332005df564ebb 100644 (file)
@@ -552,73 +552,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)
 {
index 9e7a84fdee907eb91181d2260473037018825467..527449e04401314006c00631d81b377663cf1e08 100644 (file)
@@ -20,8 +20,6 @@ extern PGresult *ExecuteSqlQueryForSingleRow(Archive *fout, 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);
 
index b2b3a0fc817c1e344549600998ed71e9c7f8971c..cda9f490a288e8f0897df0e2a89ea778165928fd 100644 (file)
@@ -1081,9 +1081,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.
         */
@@ -6200,15 +6197,13 @@ 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 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_RELATION) &&
+               if (tblinfo[i].dobj.dump && tblinfo[i].relkind == RELKIND_RELATION &&
                        (tblinfo[i].dobj.dump & DUMP_COMPONENTS_REQUIRING_LOCK))
                {
                        resetPQExpBuffer(query);