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))
 		{