diff options
author | Bruce Momjian | 2005-05-10 13:16:26 +0000 |
---|---|---|
committer | Bruce Momjian | 2005-05-10 13:16:26 +0000 |
commit | aa54dbbf0324035f45e550ccb083f1bfa4fb8ea9 (patch) | |
tree | 58a85cbaa4119127333269a7e986d5cd7fa0fa58 | |
parent | bc5adafc69778f1092805d57ddebf3749fbc876c (diff) |
Report index name on CLUSTER failure. Also, suggest ALTER TABLE
WITHOUT CLUSTER for cluster failure of a single table in a full db
cluster.
-rw-r--r-- | src/backend/commands/cluster.c | 24 | ||||
-rw-r--r-- | src/backend/commands/tablecmds.c | 2 | ||||
-rw-r--r-- | src/include/commands/cluster.h | 3 |
3 files changed, 18 insertions, 11 deletions
diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 9979afaab8..9e31b4cba5 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -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 8ea8b25428..b76c28baef 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -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 185b324eaf..674fd6795f 100644 --- a/src/include/commands/cluster.h +++ b/src/include/commands/cluster.h @@ -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); |