diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 5d3382a375efde0740016febe6d3962195c06e07..aab03ea4b3359f5e40a3b283f53abd7d24e56fc2 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.137 2005/05/06 17:24:53 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.138 2005/05/10 13:16:26 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -292,7 +292,7 @@ cluster_rel(RelToCluster *rvtc, bool recheck) OldHeap = heap_open(rvtc->tableOid, AccessExclusiveLock); /* Check index is valid to cluster on */ - check_index_is_clusterable(OldHeap, rvtc->indexOid); + check_index_is_clusterable(OldHeap, rvtc->indexOid, recheck); /* rebuild_relation does all the dirty work */ rebuild_relation(OldHeap, rvtc->indexOid); @@ -309,7 +309,7 @@ cluster_rel(RelToCluster *rvtc, bool recheck) * definition can't change under us. */ void -check_index_is_clusterable(Relation OldHeap, Oid indexOid) +check_index_is_clusterable(Relation OldHeap, Oid indexOid, bool recheck) { Relation OldIndex; @@ -336,7 +336,9 @@ check_index_is_clusterable(Relation OldHeap, Oid indexOid) if (!heap_attisnull(OldIndex->rd_indextuple, Anum_pg_index_indpred)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot cluster on partial index"))); + errmsg("cannot cluster on partial index \"%s\"", + RelationGetRelationName(OldIndex)))); + if (!OldIndex->rd_am->amindexnulls) { AttrNumber colno; @@ -354,21 +356,25 @@ check_index_is_clusterable(Relation OldHeap, Oid indexOid) if (!OldHeap->rd_att->attrs[colno - 1]->attnotnull) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot cluster when index access method does not handle null values"), - errhint("You may be able to work around this by marking column \"%s\" NOT NULL.", - NameStr(OldHeap->rd_att->attrs[colno - 1]->attname)))); + errmsg("cannot cluster on index \"%s\" because access method\n" + "does not handle null values", + RelationGetRelationName(OldIndex)), + errhint("You may be able to work around this by marking column \"%s\" NOT NULL%s", + NameStr(OldHeap->rd_att->attrs[colno - 1]->attname), + recheck ? ",\nor use ALTER TABLE ... SET WITHOUT CLUSTER to remove the cluster\n" + "specification from the table." : "."))); } else if (colno < 0) { /* system column --- okay, always non-null */ } else - { /* index expression, lose... */ ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot cluster on expressional index when index access method does not handle null values"))); - } + errmsg("cannot cluster on expressional index \"%s\" because its index access\n" + "method does not handle null values", + RelationGetRelationName(OldIndex)))); } /* diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 279222ca1d7c68b178cc08bafe7cf927795263c9..187fb5db8e623020e87a8c453e998b69958530e5 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.156 2005/05/06 17:24:53 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.157 2005/05/10 13:16:26 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -5464,7 +5464,7 @@ ATExecClusterOn(Relation rel, const char *indexName) indexName, RelationGetRelationName(rel)))); /* Check index is valid to cluster on */ - check_index_is_clusterable(rel, indexOid); + check_index_is_clusterable(rel, indexOid, false); /* And do the work */ mark_index_clustered(rel, indexOid); diff --git a/src/include/commands/cluster.h b/src/include/commands/cluster.h index 7a72ee6dcbb5c7346e1f390dcd10faacda38d0f0..382e2bcadfe04616e7d36386cde7ad5f0fbaaa50 100644 --- a/src/include/commands/cluster.h +++ b/src/include/commands/cluster.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994-5, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/commands/cluster.h,v 1.27 2004/12/31 22:03:28 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/commands/cluster.h,v 1.28 2005/05/10 13:16:26 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -19,7 +19,8 @@ extern void cluster(ClusterStmt *stmt); -extern void check_index_is_clusterable(Relation OldHeap, Oid indexOid); +extern void check_index_is_clusterable(Relation OldHeap, Oid indexOid, + bool recheck); extern void mark_index_clustered(Relation rel, Oid indexOid); extern Oid make_new_heap(Oid OIDOldHeap, const char *NewName, Oid NewTableSpace);