1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-02 09:02:37 +03:00

Fix the database-wide version of CLUSTER to silently skip temp tables of

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.
This commit is contained in:
Alvaro Herrera
2007-09-12 15:16:24 +00:00
parent 59f7d47ed7
commit 23df99783e

View File

@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.116.2.2 2005/02/06 20:19:42 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.116.2.3 2007/09/12 15:16:24 alvherre Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -308,6 +308,25 @@ cluster_rel(RelToCluster *rvtc, bool recheck)
*/ */
OldHeap = heap_open(rvtc->tableOid, AccessExclusiveLock); 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. We silently skip it in the
* "recheck" case, because it means somebody is executing a database-wide
* CLUSTER. In the single relation case, we must cause a hard error.
*/
if (isOtherTempNamespace(RelationGetNamespace(OldHeap)))
{
if (recheck)
{
heap_close(OldHeap, AccessExclusiveLock);
return;
}
else
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("cannot cluster temporary tables of other sessions")));
}
OldIndex = index_open(rvtc->indexOid); OldIndex = index_open(rvtc->indexOid);
LockRelation(OldIndex, AccessExclusiveLock); LockRelation(OldIndex, AccessExclusiveLock);
@ -379,15 +398,6 @@ cluster_rel(RelToCluster *rvtc, bool recheck)
errmsg("\"%s\" is a system catalog", errmsg("\"%s\" is a system catalog",
RelationGetRelationName(OldHeap)))); RelationGetRelationName(OldHeap))));
/*
* Don't allow cluster on temp tables of other backends ... their
* local buffer manager is not going to cope.
*/
if (isOtherTempNamespace(RelationGetNamespace(OldHeap)))
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("cannot cluster temporary tables of other sessions")));
/* Drop relcache refcnt on OldIndex, but keep lock */ /* Drop relcache refcnt on OldIndex, but keep lock */
index_close(OldIndex); index_close(OldIndex);