Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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 2a5cd66ca89293e77b646b3ec9b066f195a72dfd..97941fa3fdc367ff2f25f86f815f6aef48f7957c 100644 (file)
@@ -199,8 +199,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 590a5055f3144c0999abdcc3dd38dd75811ad6b2..61f7453e63899dc597cd75c9016b43a1af36abf1 100644 (file)
@@ -534,72 +534,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, "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 355beec1f7c7f6a33dfe030164c898477f3d30ea..8888dd34b9b00994bcd03ab308ec914d9c00139d 100644 (file)
@@ -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);
 
index 081f5be7dd941aed95e42954af69d420ab0e6421..bce8d54af38d811962a62f5c2bda1a6cc6dfb4a0 100644 (file)
@@ -1168,9 +1168,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.
     */
@@ -6730,16 +6727,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);