Report index name on CLUSTER failure. Also, suggest ALTER TABLE
authorBruce Momjian
Tue, 10 May 2005 13:16:26 +0000 (13:16 +0000)
committerBruce Momjian
Tue, 10 May 2005 13:16:26 +0000 (13:16 +0000)
WITHOUT CLUSTER for cluster failure of a single table in a full db
cluster.

src/backend/commands/cluster.c
src/backend/commands/tablecmds.c
src/include/commands/cluster.h

index 5d3382a375efde0740016febe6d3962195c06e07..aab03ea4b3359f5e40a3b283f53abd7d24e56fc2 100644 (file)
@@ -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))));
    }
 
    /*
index 279222ca1d7c68b178cc08bafe7cf927795263c9..187fb5db8e623020e87a8c453e998b69958530e5 100644 (file)
@@ -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);
index 7a72ee6dcbb5c7346e1f390dcd10faacda38d0f0..382e2bcadfe04616e7d36386cde7ad5f0fbaaa50 100644 (file)
@@ -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);