Fix the database-wide version of CLUSTER to silently skip temp tables of
authorAlvaro Herrera <[email protected]>
Wed, 12 Sep 2007 15:16:20 +0000 (15:16 +0000)
committerAlvaro Herrera <[email protected]>
Wed, 12 Sep 2007 15:16:20 +0000 (15:16 +0000)
remote sessions, instead of erroring out in the middle of the operation.

This is a backpatch of a previous fix applied to CLUSTER to HEAD and 8.2, all
the way back that it is relevant to.

src/backend/commands/cluster.c

index 208bae99beac357287508e1170443f7aa71eb9fb..698609a428ef01e0a8b9eb2f02671f7ba16dd465 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.141.2.1 2005/11/22 18:23:06 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.141.2.2 2007/09/12 15:16:20 alvherre Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -101,6 +101,15 @@ cluster(ClusterStmt *stmt)
            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;
@@ -291,6 +300,18 @@ cluster_rel(RelToCluster *rvtc, bool recheck)
     */
    OldHeap = heap_open(rvtc->tableOid, AccessExclusiveLock);
 
+   /*
+    * Don't allow cluster on temp tables of other backends ... their
+    * local buffer manager is not going to cope.  In the recheck case,
+    * silently skip it.  Otherwise continue -- there is a hard error
+    * in check_index_is_clusterable.
+    */
+   if (recheck && isOtherTempNamespace(RelationGetNamespace(OldHeap)))
+   {
+       heap_close(OldHeap, AccessExclusiveLock);
+       return;
+   }
+
    /* Check index is valid to cluster on */
    check_index_is_clusterable(OldHeap, rvtc->indexOid, recheck);