Make CLUSTER and REINDEX silently skip remote temp tables in their
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 10 Sep 2007 21:59:37 +0000 (21:59 +0000)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 10 Sep 2007 21:59:37 +0000 (21:59 +0000)
database-wide editions.

Per report from bitsandbytes88 <at> hotmail.com and subsequent discussion.

src/backend/commands/cluster.c
src/backend/commands/indexcmds.c

index ded213de7e87f54e8a61aa09f422f61d39b6eada..d781f79b64132647870db9c1d7f81ab51091c3e4 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.162 2007/05/19 01:02:34 alvherre Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.163 2007/09/10 21:59:37 alvherre Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -106,6 +106,15 @@ cluster(ClusterStmt *stmt, bool isTopLevel)
            aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CLASS,
                           RelationGetRelationName(rel));
 
+       /*
+        * Reject clustering a remote temp table ... their local buffer manager
+        * is not going to cope.
+        */
+       if (isOtherTempNamespace(RelationGetNamespace(rel)))
+           ereport(ERROR,
+                   (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+                    errmsg("cannot cluster temporary tables of other sessions")));
+
        if (stmt->indexname == NULL)
        {
            ListCell   *index;
@@ -275,6 +284,21 @@ cluster_rel(RelToCluster *rvtc, bool recheck)
            return;
        }
 
+       /*
+        * Silently skip a temp table for a remote session.  Only doing this
+        * check in the "recheck" case is appropriate (which currently means
+        * somebody is executing a database-wide CLUSTER), because there is
+        * another check in cluster() which will stop any attempt to cluster
+        * remote temp tables by name.  There is another check in
+        * check_index_is_clusterable which is redundant, but we leave it for
+        * extra safety.
+        */
+       if (isOtherTempNamespace(RelationGetNamespace(OldHeap)))
+       {
+           relation_close(OldHeap, AccessExclusiveLock);
+           return;
+       }
+
        /*
         * Check that the index still exists
         */
index 5c418f8b7a3af0abd36723640c8029edccc4e4e2..ebac5957bd255e1b8eb4530d9ca97c8d11936989 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/indexcmds.c,v 1.164 2007/09/07 00:58:56 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/indexcmds.c,v 1.165 2007/09/10 21:59:37 alvherre Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1313,6 +1313,10 @@ ReindexDatabase(const char *databaseName, bool do_system, bool do_user)
        if (classtuple->relkind != RELKIND_RELATION)
            continue;
 
+       /* Skip temp tables of other backends; we can't reindex them at all */
+       if (isOtherTempNamespace(classtuple->relnamespace))
+           continue;
+
        /* Check user/system classification, and optionally skip */
        if (IsSystemClass(classtuple))
        {