diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index ded213de7e87f54e8a61aa09f422f61d39b6eada..d781f79b64132647870db9c1d7f81ab51091c3e4 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.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 */ diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 5c418f8b7a3af0abd36723640c8029edccc4e4e2..ebac5957bd255e1b8eb4530d9ca97c8d11936989 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -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)) {