<!--
Documentation of the system catalogs, directed toward PostgreSQL developers
- $Header: /cvsroot/pgsql/doc/src/sgml/catalogs.sgml,v 2.58 2002/09/02 05:52:34 momjian Exp $
+ $Header: /cvsroot/pgsql/doc/src/sgml/catalogs.sgml,v 2.59 2002/09/03 01:04:40 tgl Exp $
-->
<chapter id="catalogs">
<entry>indisclustered</entry>
<entry><type>bool</type></entry>
<entry></entry>
- <entry>unused</entry>
+ <entry>If true, the table was last clustered on this index.</entry>
</row>
<row>
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.193 2002/09/02 01:05:04 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.194 2002/09/03 01:04:41 tgl Exp $
*
*
* INTERFACE ROUTINES
indexForm->indexrelid = indexoid;
indexForm->indrelid = heapoid;
indexForm->indproc = indexInfo->ii_FuncOid;
- indexForm->indisclustered = false; /* not used */
+ indexForm->indisclustered = false; /* not clustered, yet */
indexForm->indisunique = indexInfo->ii_Unique;
indexForm->indisprimary = primary;
memcpy((char *) &indexForm->indpred, (char *) predText, predLen);
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.88 2002/09/02 01:05:04 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.89 2002/09/03 01:04:41 tgl Exp $
*
*-------------------------------------------------------------------------
*/
palloc(sizeof(Oid) * attrs->indexInfo->ii_NumIndexAttrs);
memcpy(attrs->classOID, indexForm->indclass,
sizeof(Oid) * attrs->indexInfo->ii_NumIndexAttrs);
-
- /* We'll set indisclustered at index creation time on the
- * index we are currently clustering, and reset it on other
- * indexes.
- */
- attrs->isclustered = (OldIndex == indexOID ? true : false);
+ attrs->isclustered = (OldIndex == indexOID);
/* Name and access method of each index come from pg_class */
classTuple = SearchSysCache(RELOID,
CommandCounterIncrement();
- /* Set indisclustered to the correct value. Only one index is
- * allowed to be clustered.
+ /*
+ * Make sure that indisclustered is correct: it should be set
+ * only for the index we just clustered on.
*/
pg_index = heap_openr(IndexRelationName, RowExclusiveLock);
tuple = SearchSysCacheCopy(INDEXRELID,
- ObjectIdGetDatum(attrs->indexOID),
- 0, 0, 0);
+ ObjectIdGetDatum(attrs->indexOID),
+ 0, 0, 0);
+ if (!HeapTupleIsValid(tuple))
+ elog(ERROR, "cache lookup failed for index %u", attrs->indexOID);
index = (Form_pg_index) GETSTRUCT(tuple);
- index->indisclustered = attrs->isclustered;
- simple_heap_update(pg_index, &tuple->t_self, tuple);
- CatalogUpdateIndexes(pg_index, tuple);
+ if (index->indisclustered != attrs->isclustered)
+ {
+ index->indisclustered = attrs->isclustered;
+ simple_heap_update(pg_index, &tuple->t_self, tuple);
+ CatalogUpdateIndexes(pg_index, tuple);
+ }
heap_freetuple(tuple);
- heap_close(pg_index, NoLock);
+ heap_close(pg_index, RowExclusiveLock);
/* Destroy new index with old filenode */
object.classId = RelOid_pg_class;
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: pg_index.h,v 1.28 2002/06/20 20:29:44 momjian Exp $
+ * $Id: pg_index.h,v 1.29 2002/09/03 01:04:41 tgl Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
regproc indproc; /* OID of function for functional index */
int2vector indkey; /* column numbers of indexed attributes */
oidvector indclass; /* opclass identifiers */
- bool indisclustered; /* presently unused */
+ bool indisclustered; /* is this the index last clustered by? */
bool indisunique; /* is this a unique index? */
bool indisprimary; /* is this index for primary key? */
Oid indreference; /* oid of index of referenced relation (ie