aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/commands/cluster.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c
index 208bae99bea..698609a428e 100644
--- a/src/backend/commands/cluster.c
+++ b/src/backend/commands/cluster.c
@@ -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);