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:
@ -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);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user