Re: Dealing with CLUSTER failures - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Re: Dealing with CLUSTER failures |
Date | |
Msg-id | 200505100036.j4A0aSB19281@candle.pha.pa.us Whole thread Raw |
In response to | Re: Dealing with CLUSTER failures (Tom Lane <tgl@sss.pgh.pa.us>) |
List | pgsql-patches |
Tom Lane wrote: > Bruce Momjian <pgman@candle.pha.pa.us> writes: > > I looked over this item, originally posted as: > > http://archives.postgresql.org/pgsql-hackers/2005-03/msg01055.php > > I still think this is substantial complication (more than likely > introducing some bugs) to deal with a non problem. > > http://archives.postgresql.org/pgsql-hackers/2005-03/msg01058.php Well, it is a demonstrated problem, and we currently don't even report the index name that caused the cluster to fail. Here is a new patch that continues to throw an error for a failed database-wide cluster (no warning) if a single table fails. It does print the index name and it prints a hint that the user can use ALTER TABLE ... SET WITHOUT CLUSTER to avoid the failure: test=> CLUSTER test_gist_idx ON test; ERROR: cannot cluster on index "test_gist_idx" because access method does not handle null values HINT: You may be able to work around this by marking column "a" NOT NULL. test=> CLUSTER; ERROR: cannot cluster on index "test_gist_idx" because access method does not handle null values HINT: You may be able to work around this by marking column "a" NOT NULL, or use ALTER TABLE ... SET WITHOUT CLUSTER to remove the cluster specification from the table. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073 Index: src/backend/commands/cluster.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/commands/cluster.c,v retrieving revision 1.137 diff -c -c -r1.137 cluster.c *** src/backend/commands/cluster.c 6 May 2005 17:24:53 -0000 1.137 --- src/backend/commands/cluster.c 10 May 2005 00:26:48 -0000 *************** *** 292,298 **** OldHeap = heap_open(rvtc->tableOid, AccessExclusiveLock); /* Check index is valid to cluster on */ ! check_index_is_clusterable(OldHeap, rvtc->indexOid); /* rebuild_relation does all the dirty work */ rebuild_relation(OldHeap, rvtc->indexOid); --- 292,298 ---- OldHeap = heap_open(rvtc->tableOid, AccessExclusiveLock); /* Check index is valid to cluster on */ ! check_index_is_clusterable(OldHeap, rvtc->indexOid, recheck); /* rebuild_relation does all the dirty work */ rebuild_relation(OldHeap, rvtc->indexOid); *************** *** 309,315 **** * definition can't change under us. */ void ! check_index_is_clusterable(Relation OldHeap, Oid indexOid) { Relation OldIndex; --- 309,315 ---- * definition can't change under us. */ void ! check_index_is_clusterable(Relation OldHeap, Oid indexOid, bool recheck) { Relation OldIndex; *************** *** 336,342 **** if (!heap_attisnull(OldIndex->rd_indextuple, Anum_pg_index_indpred)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), ! errmsg("cannot cluster on partial index"))); if (!OldIndex->rd_am->amindexnulls) { AttrNumber colno; --- 336,344 ---- if (!heap_attisnull(OldIndex->rd_indextuple, Anum_pg_index_indpred)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), ! errmsg("cannot cluster on partial index \"%s\"", ! RelationGetRelationName(OldIndex)))); ! if (!OldIndex->rd_am->amindexnulls) { AttrNumber colno; *************** *** 354,374 **** 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)))); } 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"))); ! } } /* --- 356,380 ---- if (!OldHeap->rd_att->attrs[colno - 1]->attnotnull) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), ! 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 \"%s\" because its index access\n" ! "method does not handle null values", ! RelationGetRelationName(OldIndex)))); } /* Index: src/backend/commands/tablecmds.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v retrieving revision 1.156 diff -c -c -r1.156 tablecmds.c *** src/backend/commands/tablecmds.c 6 May 2005 17:24:53 -0000 1.156 --- src/backend/commands/tablecmds.c 10 May 2005 00:26:51 -0000 *************** *** 5464,5470 **** indexName, RelationGetRelationName(rel)))); /* Check index is valid to cluster on */ ! check_index_is_clusterable(rel, indexOid); /* And do the work */ mark_index_clustered(rel, indexOid); --- 5464,5470 ---- indexName, RelationGetRelationName(rel)))); /* Check index is valid to cluster on */ ! check_index_is_clusterable(rel, indexOid, false); /* And do the work */ mark_index_clustered(rel, indexOid); Index: src/include/commands/cluster.h =================================================================== RCS file: /cvsroot/pgsql/src/include/commands/cluster.h,v retrieving revision 1.27 diff -c -c -r1.27 cluster.h *** src/include/commands/cluster.h 31 Dec 2004 22:03:28 -0000 1.27 --- src/include/commands/cluster.h 10 May 2005 00:26:53 -0000 *************** *** 19,25 **** extern void cluster(ClusterStmt *stmt); ! extern void check_index_is_clusterable(Relation OldHeap, Oid indexOid); extern void mark_index_clustered(Relation rel, Oid indexOid); extern Oid make_new_heap(Oid OIDOldHeap, const char *NewName, Oid NewTableSpace); --- 19,26 ---- extern void cluster(ClusterStmt *stmt); ! 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);
pgsql-patches by date: