aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/cluster.c
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2007-09-10 22:02:05 +0000
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2007-09-10 22:02:05 +0000
commit8f11bb191963026db6904e66c8fcf94bcd15ca51 (patch)
tree91cca5e9da37731b2c2a9535721d6f090537befa /src/backend/commands/cluster.c
parent053731ab0a3ab8dc98742a71780e52f4d39e10c4 (diff)
downloadpostgresql-8f11bb191963026db6904e66c8fcf94bcd15ca51.tar.gz
postgresql-8f11bb191963026db6904e66c8fcf94bcd15ca51.zip
Make CLUSTER and REINDEX silently skip remote temp tables in their
database-wide editions. Per report from bitsandbytes88 <at> hotmail.com and subsequent discussion.
Diffstat (limited to 'src/backend/commands/cluster.c')
-rw-r--r--src/backend/commands/cluster.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c
index 665c66cad5e..506e3d7894b 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.154 2006/10/04 00:29:50 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.154.2.1 2007/09/10 22:02:05 alvherre Exp $
*
*-------------------------------------------------------------------------
*/
@@ -102,6 +102,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;
@@ -272,6 +281,21 @@ cluster_rel(RelToCluster *rvtc, bool recheck)
}
/*
+ * 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
*/
if (!SearchSysCacheExists(RELOID,