diff --git a/src/backend/catalog/aclchk.c b/src/backend/catalog/aclchk.c
index e06065e218fede26cc6ced77c9c9be049fd431b1..c06b42cd2acfc00f19e719b452097e00d69c73d3 100644
--- a/src/backend/catalog/aclchk.c
+++ b/src/backend/catalog/aclchk.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.72 2002/07/29 22:14:10 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.73 2002/08/05 03:29:16 tgl Exp $
  *
  * NOTES
  *	  See acl.h.
@@ -236,15 +236,8 @@ ExecuteGrantStmt_Relation(GrantStmt *stmt)
 
 		simple_heap_update(relation, &newtuple->t_self, newtuple);
 
-		{
-			/* keep the catalog indexes up to date */
-			Relation	idescs[Num_pg_class_indices];
-
-			CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices,
-							   idescs);
-			CatalogIndexInsert(idescs, Num_pg_class_indices, relation, newtuple);
-			CatalogCloseIndices(Num_pg_class_indices, idescs);
-		}
+		/* keep the catalog indexes up to date */
+		CatalogUpdateIndexes(relation, newtuple);
 
 		pfree(old_acl);
 		pfree(new_acl);
@@ -332,15 +325,8 @@ ExecuteGrantStmt_Database(GrantStmt *stmt)
 
 		simple_heap_update(relation, &newtuple->t_self, newtuple);
 
-		{
-			/* keep the catalog indexes up to date */
-			Relation	idescs[Num_pg_database_indices];
-
-			CatalogOpenIndices(Num_pg_database_indices, Name_pg_database_indices,
-							   idescs);
-			CatalogIndexInsert(idescs, Num_pg_database_indices, relation, newtuple);
-			CatalogCloseIndices(Num_pg_database_indices, idescs);
-		}
+		/* keep the catalog indexes up to date */
+		CatalogUpdateIndexes(relation, newtuple);
 
 		pfree(old_acl);
 		pfree(new_acl);
@@ -434,15 +420,8 @@ ExecuteGrantStmt_Function(GrantStmt *stmt)
 
 		simple_heap_update(relation, &newtuple->t_self, newtuple);
 
-		{
-			/* keep the catalog indexes up to date */
-			Relation	idescs[Num_pg_proc_indices];
-
-			CatalogOpenIndices(Num_pg_proc_indices, Name_pg_proc_indices,
-							   idescs);
-			CatalogIndexInsert(idescs, Num_pg_proc_indices, relation, newtuple);
-			CatalogCloseIndices(Num_pg_proc_indices, idescs);
-		}
+		/* keep the catalog indexes up to date */
+		CatalogUpdateIndexes(relation, newtuple);
 
 		pfree(old_acl);
 		pfree(new_acl);
@@ -531,15 +510,8 @@ ExecuteGrantStmt_Language(GrantStmt *stmt)
 
 		simple_heap_update(relation, &newtuple->t_self, newtuple);
 
-		{
-			/* keep the catalog indexes up to date */
-			Relation	idescs[Num_pg_language_indices];
-
-			CatalogOpenIndices(Num_pg_language_indices, Name_pg_language_indices,
-							   idescs);
-			CatalogIndexInsert(idescs, Num_pg_language_indices, relation, newtuple);
-			CatalogCloseIndices(Num_pg_language_indices, idescs);
-		}
+		/* keep the catalog indexes up to date */
+		CatalogUpdateIndexes(relation, newtuple);
 
 		pfree(old_acl);
 		pfree(new_acl);
@@ -628,15 +600,8 @@ ExecuteGrantStmt_Namespace(GrantStmt *stmt)
 
 		simple_heap_update(relation, &newtuple->t_self, newtuple);
 
-		{
-			/* keep the catalog indexes up to date */
-			Relation	idescs[Num_pg_namespace_indices];
-
-			CatalogOpenIndices(Num_pg_namespace_indices, Name_pg_namespace_indices,
-							   idescs);
-			CatalogIndexInsert(idescs, Num_pg_namespace_indices, relation, newtuple);
-			CatalogCloseIndices(Num_pg_namespace_indices, idescs);
-		}
+		/* keep the catalog indexes up to date */
+		CatalogUpdateIndexes(relation, newtuple);
 
 		pfree(old_acl);
 		pfree(new_acl);
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 65f7dc097a0a60f0eb1ba1462ea21a4f41017b52..b61ad73212721e203786d1620540a810f1fab7b8 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.217 2002/08/05 02:30:50 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.218 2002/08/05 03:29:16 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -423,23 +423,17 @@ AddNewAttributeTuples(Oid new_rel_oid,
 	int			i;
 	HeapTuple	tup;
 	Relation	rel;
-	bool		hasindex;
-	Relation	idescs[Num_pg_attr_indices];
+	CatalogIndexState indstate;
 	int			natts = tupdesc->natts;
 	ObjectAddress	myself,
 					referenced;
 
 	/*
-	 * open pg_attribute
+	 * open pg_attribute and its indexes.
 	 */
 	rel = heap_openr(AttributeRelationName, RowExclusiveLock);
 
-	/*
-	 * Check if we have any indices defined on pg_attribute.
-	 */
-	hasindex = RelationGetForm(rel)->relhasindex;
-	if (hasindex)
-		CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, idescs);
+	indstate = CatalogOpenIndexes(rel);
 
 	/*
 	 * First we add the user attributes.  This is also a convenient place
@@ -461,8 +455,7 @@ AddNewAttributeTuples(Oid new_rel_oid,
 
 		simple_heap_insert(rel, tup);
 
-		if (hasindex)
-			CatalogIndexInsert(idescs, Num_pg_attr_indices, rel, tup);
+		CatalogIndexInsert(indstate, tup);
 
 		heap_freetuple(tup);
 
@@ -509,8 +502,7 @@ AddNewAttributeTuples(Oid new_rel_oid,
 
 				simple_heap_insert(rel, tup);
 
-				if (hasindex)
-					CatalogIndexInsert(idescs, Num_pg_attr_indices, rel, tup);
+				CatalogIndexInsert(indstate, tup);
 
 				heap_freetuple(tup);
 			}
@@ -521,8 +513,7 @@ AddNewAttributeTuples(Oid new_rel_oid,
 	/*
 	 * clean up
 	 */
-	if (hasindex)
-		CatalogCloseIndices(Num_pg_attr_indices, idescs);
+	CatalogCloseIndexes(indstate);
 
 	heap_close(rel, RowExclusiveLock);
 }
@@ -543,7 +534,6 @@ AddNewRelationTuple(Relation pg_class_desc,
 {
 	Form_pg_class new_rel_reltup;
 	HeapTuple	tup;
-	Relation	idescs[Num_pg_class_indices];
 
 	/*
 	 * first we update some of the information in our uncataloged
@@ -606,20 +596,11 @@ AddNewRelationTuple(Relation pg_class_desc,
 	HeapTupleSetOid(tup, new_rel_oid);
 
 	/*
-	 * finally insert the new tuple and free it.
+	 * finally insert the new tuple, update the indexes, and clean up.
 	 */
 	simple_heap_insert(pg_class_desc, tup);
 
-	if (!IsIgnoringSystemIndexes())
-	{
-		/*
-		 * First, open the catalog indices and insert index tuples for the
-		 * new relation.
-		 */
-		CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_class_indices, pg_class_desc, tup);
-		CatalogCloseIndices(Num_pg_class_indices, idescs);
-	}
+	CatalogUpdateIndexes(pg_class_desc, tup);
 
 	heap_freetuple(tup);
 }
@@ -953,15 +934,8 @@ RemoveAttributeById(Oid relid, AttrNumber attnum)
 
 	simple_heap_update(attr_rel, &tuple->t_self, tuple);
 
-	/* keep the system catalog indices current */
-	if (RelationGetForm(attr_rel)->relhasindex)
-	{
-		Relation	idescs[Num_pg_attr_indices];
-
-		CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_attr_indices, attr_rel, tuple);
-		CatalogCloseIndices(Num_pg_attr_indices, idescs);
-	}
+	/* keep the system catalog indexes current */
+	CatalogUpdateIndexes(attr_rel, tuple);
 
 	/*
 	 * Because updating the pg_attribute row will trigger a relcache flush
@@ -1087,15 +1061,8 @@ RemoveAttrDefaultById(Oid attrdefId)
 
 	simple_heap_update(attr_rel, &tuple->t_self, tuple);
 
-	/* keep the system catalog indices current */
-	if (RelationGetForm(attr_rel)->relhasindex)
-	{
-		Relation	idescs[Num_pg_attr_indices];
-
-		CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_attr_indices, attr_rel, tuple);
-		CatalogCloseIndices(Num_pg_attr_indices, idescs);
-	}
+	/* keep the system catalog indexes current */
+	CatalogUpdateIndexes(attr_rel, tuple);
 
 	/*
 	 * Our update of the pg_attribute row will force a relcache rebuild,
@@ -1195,12 +1162,10 @@ StoreAttrDefault(Relation rel, AttrNumber attnum, char *adbin)
 	Node	   *expr;
 	char	   *adsrc;
 	Relation	adrel;
-	Relation	idescs[Num_pg_attrdef_indices];
 	HeapTuple	tuple;
 	Datum		values[4];
 	static char nulls[4] = {' ', ' ', ' ', ' '};
 	Relation	attrrel;
-	Relation	attridescs[Num_pg_attr_indices];
 	HeapTuple	atttup;
 	Form_pg_attribute attStruct;
 	Oid			attrdefOid;
@@ -1235,10 +1200,7 @@ StoreAttrDefault(Relation rel, AttrNumber attnum, char *adbin)
 	tuple = heap_formtuple(adrel->rd_att, values, nulls);
 	attrdefOid = simple_heap_insert(adrel, tuple);
 
-	CatalogOpenIndices(Num_pg_attrdef_indices, Name_pg_attrdef_indices,
-					   idescs);
-	CatalogIndexInsert(idescs, Num_pg_attrdef_indices, adrel, tuple);
-	CatalogCloseIndices(Num_pg_attrdef_indices, idescs);
+	CatalogUpdateIndexes(adrel, tuple);
 
 	defobject.classId = RelationGetRelid(adrel);
 	defobject.objectId = attrdefOid;
@@ -1269,11 +1231,8 @@ StoreAttrDefault(Relation rel, AttrNumber attnum, char *adbin)
 	{
 		attStruct->atthasdef = true;
 		simple_heap_update(attrrel, &atttup->t_self, atttup);
-		/* keep catalog indices current */
-		CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices,
-						   attridescs);
-		CatalogIndexInsert(attridescs, Num_pg_attr_indices, attrrel, atttup);
-		CatalogCloseIndices(Num_pg_attr_indices, attridescs);
+		/* keep catalog indexes current */
+		CatalogUpdateIndexes(attrrel, atttup);
 	}
 	heap_close(attrrel, RowExclusiveLock);
 	heap_freetuple(atttup);
@@ -1655,7 +1614,6 @@ SetRelationNumChecks(Relation rel, int numchecks)
 	Relation	relrel;
 	HeapTuple	reltup;
 	Form_pg_class relStruct;
-	Relation	relidescs[Num_pg_class_indices];
 
 	relrel = heap_openr(RelationRelationName, RowExclusiveLock);
 	reltup = SearchSysCacheCopy(RELOID,
@@ -1672,11 +1630,8 @@ SetRelationNumChecks(Relation rel, int numchecks)
 
 		simple_heap_update(relrel, &reltup->t_self, reltup);
 
-		/* keep catalog indices current */
-		CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices,
-						   relidescs);
-		CatalogIndexInsert(relidescs, Num_pg_class_indices, relrel, reltup);
-		CatalogCloseIndices(Num_pg_class_indices, relidescs);
+		/* keep catalog indexes current */
+		CatalogUpdateIndexes(relrel, reltup);
 	}
 	else
 	{
@@ -1866,9 +1821,9 @@ RemoveStatistics(Relation rel)
 
 /*
  * RelationTruncateIndexes - truncate all
- * indices associated with the heap relation to zero tuples.
+ * indexes associated with the heap relation to zero tuples.
  *
- * The routine will truncate and then reconstruct the indices on
+ * The routine will truncate and then reconstruct the indexes on
  * the relation specified by the heapId parameter.
  */
 static void
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 38fe5cd8924076391fffa9a739f40c788476ed33..e75df632a8c6983742bb3b974d278ee97dff3648 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.187 2002/07/29 22:14:10 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.188 2002/08/05 03:29:16 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -314,7 +314,6 @@ UpdateRelationRelation(Relation indexRelation)
 {
 	Relation	pg_class;
 	HeapTuple	tuple;
-	Relation	idescs[Num_pg_class_indices];
 
 	pg_class = heap_openr(RelationRelationName, RowExclusiveLock);
 
@@ -332,18 +331,8 @@ UpdateRelationRelation(Relation indexRelation)
 	HeapTupleSetOid(tuple, RelationGetRelid(indexRelation));
 	simple_heap_insert(pg_class, tuple);
 
-	/*
-	 * During normal processing, we need to make sure that the system
-	 * catalog indices are correct.  Bootstrap (initdb) time doesn't
-	 * require this, because we make sure that the indices are correct
-	 * just before exiting.
-	 */
-	if (!IsIgnoringSystemIndexes())
-	{
-		CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_class_indices, pg_class, tuple);
-		CatalogCloseIndices(Num_pg_class_indices, idescs);
-	}
+	/* update the system catalog indexes */
+	CatalogUpdateIndexes(pg_class, tuple);
 
 	heap_freetuple(tuple);
 	heap_close(pg_class, RowExclusiveLock);
@@ -375,23 +364,17 @@ static void
 AppendAttributeTuples(Relation indexRelation, int numatts)
 {
 	Relation	pg_attribute;
-	bool		hasind;
-	Relation	idescs[Num_pg_attr_indices];
+	CatalogIndexState indstate;
 	TupleDesc	indexTupDesc;
 	HeapTuple	new_tuple;
 	int			i;
 
 	/*
-	 * open the attribute relation
+	 * open the attribute relation and its indexes
 	 */
 	pg_attribute = heap_openr(AttributeRelationName, RowExclusiveLock);
 
-	hasind = false;
-	if (!IsIgnoringSystemIndexes() && pg_attribute->rd_rel->relhasindex)
-	{
-		hasind = true;
-		CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, idescs);
-	}
+	indstate = CatalogOpenIndexes(pg_attribute);
 
 	/*
 	 * insert data from new index's tupdesc into pg_attribute
@@ -414,14 +397,12 @@ AppendAttributeTuples(Relation indexRelation, int numatts)
 
 		simple_heap_insert(pg_attribute, new_tuple);
 
-		if (hasind)
-			CatalogIndexInsert(idescs, Num_pg_attr_indices, pg_attribute, new_tuple);
+		CatalogIndexInsert(indstate, new_tuple);
 
 		heap_freetuple(new_tuple);
 	}
 
-	if (hasind)
-		CatalogCloseIndices(Num_pg_attr_indices, idescs);
+	CatalogCloseIndexes(indstate);
 
 	heap_close(pg_attribute, RowExclusiveLock);
 }
@@ -445,7 +426,6 @@ UpdateIndexRelation(Oid indexoid,
 	Relation	pg_index;
 	HeapTuple	tuple;
 	int			i;
-	Relation	idescs[Num_pg_index_indices];
 
 	/*
 	 * allocate a Form_pg_index big enough to hold the index-predicate (if
@@ -503,19 +483,12 @@ UpdateIndexRelation(Oid indexoid,
 						   (void *) indexForm);
 
 	/*
-	 * insert the tuple into the pg_index
+	 * insert the tuple into the pg_index catalog
 	 */
 	simple_heap_insert(pg_index, tuple);
 
-	/*
-	 * add index tuples for it
-	 */
-	if (!IsIgnoringSystemIndexes())
-	{
-		CatalogOpenIndices(Num_pg_index_indices, Name_pg_index_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_index_indices, pg_index, tuple);
-		CatalogCloseIndices(Num_pg_index_indices, idescs);
-	}
+	/* update the indexes on pg_index */
+	CatalogUpdateIndexes(pg_index, tuple);
 
 	/*
 	 * close the relation and free the tuple
@@ -774,7 +747,7 @@ index_create(Oid heapRelationId,
 
 	/*
 	 * If this is bootstrap (initdb) time, then we don't actually fill in
-	 * the index yet.  We'll be creating more indices and classes later,
+	 * the index yet.  We'll be creating more indexes and classes later,
 	 * so we delay filling them in until just before we're done with
 	 * bootstrapping.  Otherwise, we call the routine that constructs the
 	 * index.
@@ -1245,16 +1218,8 @@ setRelhasindex(Oid relid, bool hasindex, bool isprimary, Oid reltoastidxid)
 	{
 		simple_heap_update(pg_class, &tuple->t_self, tuple);
 
-		/* Keep the catalog indices up to date */
-		if (!IsIgnoringSystemIndexes())
-		{
-			Relation	idescs[Num_pg_class_indices];
-
-			CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices,
-							   idescs);
-			CatalogIndexInsert(idescs, Num_pg_class_indices, pg_class, tuple);
-			CatalogCloseIndices(Num_pg_class_indices, idescs);
-		}
+		/* Keep the catalog indexes up to date */
+		CatalogUpdateIndexes(pg_class, tuple);
 	}
 	else
 	{
@@ -1273,8 +1238,7 @@ setRelhasindex(Oid relid, bool hasindex, bool isprimary, Oid reltoastidxid)
 void
 setNewRelfilenode(Relation relation)
 {
-	Relation	pg_class,
-				idescs[Num_pg_class_indices];
+	Relation	pg_class;
 	Oid			newrelfilenode;
 	bool		in_place_update = false;
 	HeapTupleData lockTupleData;
@@ -1321,14 +1285,10 @@ setNewRelfilenode(Relation relation)
 		WriteBuffer(buffer);
 		BufferSync();
 	}
-	/* Keep the catalog indices up to date */
-	if (!in_place_update && pg_class->rd_rel->relhasindex)
-	{
-		CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices,
-						   idescs);
-		CatalogIndexInsert(idescs, Num_pg_class_indices, pg_class, classTuple);
-		CatalogCloseIndices(Num_pg_class_indices, idescs);
-	}
+	/* Keep the catalog indexes up to date */
+	if (!in_place_update)
+		CatalogUpdateIndexes(pg_class, classTuple);
+
 	heap_close(pg_class, NoLock);
 	if (!in_place_update)
 		heap_freetuple(classTuple);
@@ -1355,7 +1315,6 @@ UpdateStats(Oid relid, double reltuples)
 	BlockNumber relpages;
 	int			i;
 	Form_pg_class rd_rel;
-	Relation	idescs[Num_pg_class_indices];
 	Datum		values[Natts_pg_class];
 	char		nulls[Natts_pg_class];
 	char		replace[Natts_pg_class];
@@ -1494,12 +1453,7 @@ UpdateStats(Oid relid, double reltuples)
 		values[Anum_pg_class_reltuples - 1] = Float4GetDatum((float4) reltuples);
 		newtup = heap_modifytuple(tuple, pg_class, values, nulls, replace);
 		simple_heap_update(pg_class, &tuple->t_self, newtup);
-		if (!IsIgnoringSystemIndexes())
-		{
-			CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
-			CatalogIndexInsert(idescs, Num_pg_class_indices, pg_class, newtup);
-			CatalogCloseIndices(Num_pg_class_indices, idescs);
-		}
+		CatalogUpdateIndexes(pg_class, newtup);
 		heap_freetuple(newtup);
 	}
 
diff --git a/src/backend/catalog/indexing.c b/src/backend/catalog/indexing.c
index 928949d4343a821e380003b859b8ecbfb831226e..7f558b4d9deeda50df687fa1ab1d24d1cfed8433 100644
--- a/src/backend/catalog/indexing.c
+++ b/src/backend/catalog/indexing.c
@@ -1,7 +1,7 @@
 /*-------------------------------------------------------------------------
  *
  * indexing.c
- *	  This file contains routines to support indices defined on system
+ *	  This file contains routines to support indexes defined on system
  *	  catalogs.
  *
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
@@ -9,155 +9,103 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.99 2002/07/22 20:23:19 petere Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.100 2002/08/05 03:29:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
-
 #include "postgres.h"
 
 #include "access/genam.h"
-#include "access/heapam.h"
-#include "catalog/catalog.h"
-#include "catalog/catname.h"
 #include "catalog/index.h"
 #include "catalog/indexing.h"
-#include "catalog/pg_index.h"
-#include "miscadmin.h"
-#include "utils/fmgroids.h"
-#include "utils/syscache.h"
-
-/*
- * Names of indices for each system catalog.
- */
-
-char	   *Name_pg_aggregate_indices[Num_pg_aggregate_indices] =
-{AggregateFnoidIndex};
-char	   *Name_pg_am_indices[Num_pg_am_indices] =
-{AmNameIndex, AmOidIndex};
-char	   *Name_pg_amop_indices[Num_pg_amop_indices] =
-{AccessMethodOperatorIndex, AccessMethodStrategyIndex};
-char	   *Name_pg_amproc_indices[Num_pg_amproc_indices] =
-{AccessMethodProcedureIndex};
-char	   *Name_pg_attr_indices[Num_pg_attr_indices] =
-{AttributeRelidNameIndex, AttributeRelidNumIndex};
-char	   *Name_pg_attrdef_indices[Num_pg_attrdef_indices] =
-{AttrDefaultIndex, AttrDefaultOidIndex};
-char	   *Name_pg_cast_indices[Num_pg_cast_indices] =
-{CastOidIndex, CastSourceTargetIndex};
-char	   *Name_pg_class_indices[Num_pg_class_indices] =
-{ClassNameNspIndex, ClassOidIndex};
-char	   *Name_pg_constraint_indices[Num_pg_constraint_indices] =
-{ConstraintNameNspIndex, ConstraintOidIndex, ConstraintRelidIndex};
-char	   *Name_pg_conversion_indices[Num_pg_conversion_indices] =
-{ConversionDefaultIndex, ConversionNameNspIndex, ConversionOidIndex};
-char	   *Name_pg_database_indices[Num_pg_database_indices] =
-{DatabaseNameIndex, DatabaseOidIndex};
-char	   *Name_pg_depend_indices[Num_pg_depend_indices] =
-{DependDependerIndex, DependReferenceIndex};
-char	   *Name_pg_group_indices[Num_pg_group_indices] =
-{GroupNameIndex, GroupSysidIndex};
-char	   *Name_pg_index_indices[Num_pg_index_indices] =
-{IndexRelidIndex, IndexIndrelidIndex};
-char	   *Name_pg_inherits_indices[Num_pg_inherits_indices] =
-{InheritsRelidSeqnoIndex};
-char	   *Name_pg_language_indices[Num_pg_language_indices] =
-{LanguageOidIndex, LanguageNameIndex};
-char	   *Name_pg_largeobject_indices[Num_pg_largeobject_indices] =
-{LargeObjectLOidPNIndex};
-char	   *Name_pg_namespace_indices[Num_pg_namespace_indices] =
-{NamespaceNameIndex, NamespaceOidIndex};
-char	   *Name_pg_opclass_indices[Num_pg_opclass_indices] =
-{OpclassAmNameNspIndex, OpclassOidIndex};
-char	   *Name_pg_operator_indices[Num_pg_operator_indices] =
-{OperatorOidIndex, OperatorNameNspIndex};
-char	   *Name_pg_proc_indices[Num_pg_proc_indices] =
-{ProcedureOidIndex, ProcedureNameNspIndex};
-char	   *Name_pg_rewrite_indices[Num_pg_rewrite_indices] =
-{RewriteOidIndex, RewriteRelRulenameIndex};
-char	   *Name_pg_shadow_indices[Num_pg_shadow_indices] =
-{ShadowNameIndex, ShadowSysidIndex};
-char	   *Name_pg_statistic_indices[Num_pg_statistic_indices] =
-{StatisticRelidAttnumIndex};
-char	   *Name_pg_trigger_indices[Num_pg_trigger_indices] =
-{TriggerRelidNameIndex, TriggerConstrNameIndex, TriggerConstrRelidIndex, TriggerOidIndex};
-char	   *Name_pg_type_indices[Num_pg_type_indices] =
-{TypeNameNspIndex, TypeOidIndex};
-char	   *Name_pg_description_indices[Num_pg_description_indices] =
-{DescriptionObjIndex};
-
+#include "executor/executor.h"
 
 
 /*
- * Changes (appends) to catalogs can and do happen at various places
- * throughout the code.  We need a generic routine that will open all of
- * the indices defined on a given catalog and return the relation descriptors
- * associated with them.
+ * CatalogOpenIndexes - open the indexes on a system catalog.
+ *
+ * When inserting or updating tuples in a system catalog, call this
+ * to prepare to update the indexes for the catalog.
+ *
+ * In the current implementation, we share code for opening/closing the
+ * indexes with execUtils.c.  But we do not use ExecInsertIndexTuples,
+ * because we don't want to create an EState.  This implies that we
+ * do not support partial indexes on system catalogs.  Nor do we handle
+ * functional indexes very well (the code will work, but will leak memory
+ * intraquery, because the index function is called in the per-query context
+ * that we are invoked in).  This could be fixed with localized changes here
+ * if we wanted to pay the extra overhead of building an EState.
  */
-void
-CatalogOpenIndices(int nIndices, char **names, Relation *idescs)
+CatalogIndexState
+CatalogOpenIndexes(Relation heapRel)
 {
-	int			i;
+	ResultRelInfo *resultRelInfo;
 
-	if (IsIgnoringSystemIndexes())
-		return;
-	for (i = 0; i < nIndices; i++)
-		idescs[i] = index_openr(names[i]);
+	resultRelInfo = makeNode(ResultRelInfo);
+	resultRelInfo->ri_RangeTableIndex = 1;		/* dummy */
+	resultRelInfo->ri_RelationDesc = heapRel;
+	resultRelInfo->ri_TrigDesc = NULL; /* we don't fire triggers */
+
+	ExecOpenIndices(resultRelInfo);
+
+	return resultRelInfo;
 }
 
 /*
- * This is the inverse routine to CatalogOpenIndices()
+ * CatalogCloseIndexes - clean up resources allocated by CatalogOpenIndexes
  */
 void
-CatalogCloseIndices(int nIndices, Relation *idescs)
+CatalogCloseIndexes(CatalogIndexState indstate)
 {
-	int			i;
-
-	if (IsIgnoringSystemIndexes())
-		return;
-	for (i = 0; i < nIndices; i++)
-		index_close(idescs[i]);
+	ExecCloseIndices(indstate);
+	pfree(indstate);
 }
 
-
 /*
- * For the same reasons outlined above for CatalogOpenIndices(), we need a
- * routine that takes a new catalog tuple and inserts an associated index
- * tuple into each catalog index.
+ * CatalogIndexInsert - insert index entries for one catalog tuple
  *
- * NOTE: since this routine looks up all the pg_index data on each call,
- * it's relatively inefficient for inserting a large number of tuples into
- * the same catalog.  We use it only for inserting one or a few tuples
- * in a given command.	See ExecOpenIndices() and related routines if you
- * are inserting tuples in bulk.
+ * This should be called for each inserted or updated catalog tuple.
  *
- * NOTE: we do not bother to handle partial indices.  Nor do we try to
- * be efficient for functional indices (the code should work for them,
- * but may leak memory intraquery).  This should be OK for system catalogs,
- * but don't use this routine for user tables!
+ * This is effectively a cut-down version of ExecInsertIndexTuples.
  */
 void
-CatalogIndexInsert(Relation *idescs,
-				   int nIndices,
-				   Relation heapRelation,
-				   HeapTuple heapTuple)
+CatalogIndexInsert(CatalogIndexState indstate, HeapTuple heapTuple)
 {
+	int			i;
+	int			numIndexes;
+	RelationPtr relationDescs;
+	Relation	heapRelation;
 	TupleDesc	heapDescriptor;
+	IndexInfo **indexInfoArray;
 	Datum		datum[INDEX_MAX_KEYS];
 	char		nullv[INDEX_MAX_KEYS];
-	int			i;
 
-	if (IsIgnoringSystemIndexes() || (!heapRelation->rd_rel->relhasindex))
-		return;
+	/*
+	 * Get information from the state structure.
+	 */
+	numIndexes = indstate->ri_NumIndices;
+	relationDescs = indstate->ri_IndexRelationDescs;
+	indexInfoArray = indstate->ri_IndexRelationInfo;
+	heapRelation = indstate->ri_RelationDesc;
 	heapDescriptor = RelationGetDescr(heapRelation);
 
-	for (i = 0; i < nIndices; i++)
+	/*
+	 * for each index, form and insert the index tuple
+	 */
+	for (i = 0; i < numIndexes; i++)
 	{
 		IndexInfo  *indexInfo;
-		InsertIndexResult indexRes;
+		InsertIndexResult result;
 
-		indexInfo = BuildIndexInfo(idescs[i]->rd_index);
+		indexInfo = indexInfoArray[i];
 
+		/* Partial indexes on system catalogs are not supported */
+		Assert(indexInfo->ii_Predicate == NIL);
+
+		/*
+		 * FormIndexDatum fills in its datum and null parameters with
+		 * attribute information taken from the given heap tuple.
+		 */
 		FormIndexDatum(indexInfo,
 					   heapTuple,
 					   heapDescriptor,
@@ -165,11 +113,35 @@ CatalogIndexInsert(Relation *idescs,
 					   datum,
 					   nullv);
 
-		indexRes = index_insert(idescs[i], datum, nullv,
-								&heapTuple->t_self, heapRelation,
-								idescs[i]->rd_uniqueindex);
-		if (indexRes)
-			pfree(indexRes);
-		pfree(indexInfo);
+		/*
+		 * The index AM does the rest.
+		 */
+		result = index_insert(relationDescs[i], /* index relation */
+							  datum,	/* array of heaptuple Datums */
+							  nullv,	/* info on nulls */
+							  &(heapTuple->t_self),		/* tid of heap tuple */
+							  heapRelation,
+							  relationDescs[i]->rd_uniqueindex);
+
+		if (result)
+			pfree(result);
 	}
 }
+
+/*
+ * CatalogUpdateIndexes - do all the indexing work for a new catalog tuple
+ *
+ * This is a convenience routine for the common case where we only need
+ * to insert or update a single tuple in a system catalog.  Avoid using it for
+ * multiple tuples, since opening the indexes and building the index info
+ * structures is moderately expensive.
+ */
+void
+CatalogUpdateIndexes(Relation heapRel, HeapTuple heapTuple)
+{
+	CatalogIndexState	indstate;
+
+	indstate = CatalogOpenIndexes(heapRel);
+	CatalogIndexInsert(indstate, heapTuple);
+	CatalogCloseIndexes(indstate);
+}
diff --git a/src/backend/catalog/pg_aggregate.c b/src/backend/catalog/pg_aggregate.c
index f6a54abe0419846eaf56af01de9fd060289675b4..2f9f83dc78fde341faed7a7a8883f1470e013e2d 100644
--- a/src/backend/catalog/pg_aggregate.c
+++ b/src/backend/catalog/pg_aggregate.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_aggregate.c,v 1.52 2002/07/24 19:11:07 petere Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_aggregate.c,v 1.53 2002/08/05 03:29:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -175,14 +175,7 @@ AggregateCreate(const char *aggName,
 	tup = heap_formtuple(tupDesc, values, nulls);
 	simple_heap_insert(aggdesc, tup);
 
-	if (RelationGetForm(aggdesc)->relhasindex)
-	{
-		Relation	idescs[Num_pg_aggregate_indices];
-
-		CatalogOpenIndices(Num_pg_aggregate_indices, Name_pg_aggregate_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_aggregate_indices, aggdesc, tup);
-		CatalogCloseIndices(Num_pg_aggregate_indices, idescs);
-	}
+	CatalogUpdateIndexes(aggdesc, tup);
 
 	heap_close(aggdesc, RowExclusiveLock);
 
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 96784e73e36f164415ff8a9a49621c17c4622a42..1ac4edbf0b377db94bf30fb94f7ad850649f6b51 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_constraint.c,v 1.3 2002/07/16 22:12:18 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_constraint.c,v 1.4 2002/08/05 03:29:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -152,15 +152,8 @@ CreateConstraintEntry(const char *constraintName,
 
 	conOid = simple_heap_insert(conDesc, tup);
 
-	/* Handle Indices */
-	if (RelationGetForm(conDesc)->relhasindex)
-	{
-		Relation	idescs[Num_pg_constraint_indices];
-
-		CatalogOpenIndices(Num_pg_constraint_indices, Name_pg_constraint_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_constraint_indices, conDesc, tup);
-		CatalogCloseIndices(Num_pg_constraint_indices, idescs);
-	}
+	/* update catalog indexes */
+	CatalogUpdateIndexes(conDesc, tup);
 
 	conobject.classId = RelationGetRelid(conDesc);
 	conobject.objectId = conOid;
@@ -426,7 +419,6 @@ RemoveConstraintById(Oid conId)
 			Relation		pgrel;
 			HeapTuple		relTup;
 			Form_pg_class	classForm;
-			Relation		ridescs[Num_pg_class_indices];
 		
 			pgrel = heap_openr(RelationRelationName, RowExclusiveLock);
 			relTup = SearchSysCacheCopy(RELOID,
@@ -444,9 +436,7 @@ RemoveConstraintById(Oid conId)
 
 			simple_heap_update(pgrel, &relTup->t_self, relTup);
 
-			CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs);
-			CatalogIndexInsert(ridescs, Num_pg_class_indices, pgrel, relTup);
-			CatalogCloseIndices(Num_pg_class_indices, ridescs);
+			CatalogUpdateIndexes(pgrel, relTup);
 
 			heap_freetuple(relTup);
 
diff --git a/src/backend/catalog/pg_conversion.c b/src/backend/catalog/pg_conversion.c
index 3e316e3a291911d75c3a49b4af6a4cc48a4cf38e..c422e33e3178866df628e6d8862aac36b0838265 100644
--- a/src/backend/catalog/pg_conversion.c
+++ b/src/backend/catalog/pg_conversion.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_conversion.c,v 1.3 2002/07/25 10:07:10 ishii Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_conversion.c,v 1.4 2002/08/05 03:29:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -105,14 +105,7 @@ Oid	ConversionCreate(const char *conname, Oid connamespace,
 	Assert(OidIsValid(oid));
 
 	/* update the index if any */
-	if (RelationGetForm(rel)->relhasindex)
-	{
-		Relation	idescs[Num_pg_conversion_indices];
-
-		CatalogOpenIndices(Num_pg_conversion_indices, Name_pg_conversion_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_conversion_indices, rel, tup);
-		CatalogCloseIndices(Num_pg_conversion_indices, idescs);
-	}
+	CatalogUpdateIndexes(rel, tup);
 
 	myself.classId = get_system_catalog_relid(ConversionRelationName);
 	myself.objectId = HeapTupleGetOid(tup);
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 7319cec682e24bcb8518a188c0d4d2a6d2b48be1..44a0842da55e437328146937af81352584cb31fc 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_depend.c,v 1.3 2002/07/16 22:12:18 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_depend.c,v 1.4 2002/08/05 03:29:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -53,12 +53,11 @@ recordMultipleDependencies(const ObjectAddress *depender,
 						   DependencyType behavior)
 {
 	Relation	dependDesc;
+	CatalogIndexState indstate;
 	HeapTuple	tup;
 	int			i;
 	char		nulls[Natts_pg_depend];
 	Datum		values[Natts_pg_depend];
-	Relation	idescs[Num_pg_depend_indices];
-	bool		indices_opened = false;
 
 	if (nreferenced <= 0)
 		return;					/* nothing to do */
@@ -72,6 +71,9 @@ recordMultipleDependencies(const ObjectAddress *depender,
 
 	dependDesc = heap_openr(DependRelationName, RowExclusiveLock);
 
+	/* Don't open indexes unless we need to make an update */
+	indstate = NULL;
+
 	memset(nulls, ' ', sizeof(nulls));
 
 	for (i = 0; i < nreferenced; i++, referenced++)
@@ -101,22 +103,18 @@ recordMultipleDependencies(const ObjectAddress *depender,
 
 			simple_heap_insert(dependDesc, tup);
 
-			/*
-			 * Keep indices current
-			 */
-			if (!indices_opened)
-			{
-				CatalogOpenIndices(Num_pg_depend_indices, Name_pg_depend_indices, idescs);
-				indices_opened = true;
-			}
-			CatalogIndexInsert(idescs, Num_pg_depend_indices, dependDesc, tup);
+			/* keep indexes current */
+			if (indstate == NULL)
+				indstate = CatalogOpenIndexes(dependDesc);
+
+			CatalogIndexInsert(indstate, tup);
 
 			heap_freetuple(tup);
 		}
 	}
 
-	if (indices_opened)
-		CatalogCloseIndices(Num_pg_depend_indices, idescs);
+	if (indstate != NULL)
+		CatalogCloseIndexes(indstate);
 
 	heap_close(dependDesc, RowExclusiveLock);
 }
diff --git a/src/backend/catalog/pg_largeobject.c b/src/backend/catalog/pg_largeobject.c
index d78a6f2031477007430fa8fd40b64c77c42e6f15..07d5dca731ff4c6eaf7648fa6721e4f07f15ebab 100644
--- a/src/backend/catalog/pg_largeobject.c
+++ b/src/backend/catalog/pg_largeobject.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_largeobject.c,v 1.13 2002/06/20 20:29:26 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_largeobject.c,v 1.14 2002/08/05 03:29:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -36,7 +36,6 @@ LargeObjectCreate(Oid loid)
 {
 	Relation	pg_largeobject;
 	HeapTuple	ntup;
-	Relation	idescs[Num_pg_largeobject_indices];
 	Datum		values[Natts_pg_largeobject];
 	char		nulls[Natts_pg_largeobject];
 	int			i;
@@ -65,15 +64,8 @@ LargeObjectCreate(Oid loid)
 	 */
 	simple_heap_insert(pg_largeobject, ntup);
 
-	/*
-	 * Update indices
-	 */
-	if (!IsIgnoringSystemIndexes())
-	{
-		CatalogOpenIndices(Num_pg_largeobject_indices, Name_pg_largeobject_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_largeobject_indices, pg_largeobject, ntup);
-		CatalogCloseIndices(Num_pg_largeobject_indices, idescs);
-	}
+	/* Update indexes */
+	CatalogUpdateIndexes(pg_largeobject, ntup);
 
 	heap_close(pg_largeobject, RowExclusiveLock);
 
diff --git a/src/backend/catalog/pg_namespace.c b/src/backend/catalog/pg_namespace.c
index 55f8f0f4792104bdb46fd08b7f71a036c8f11f57..0831ea61e2d3953ba2fac562270caa5d994631bc 100644
--- a/src/backend/catalog/pg_namespace.c
+++ b/src/backend/catalog/pg_namespace.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_namespace.c,v 1.4 2002/06/20 20:29:26 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_namespace.c,v 1.5 2002/08/05 03:29:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -63,17 +63,11 @@ NamespaceCreate(const char *nspName, int32 ownerSysId)
 	tupDesc = nspdesc->rd_att;
 
 	tup = heap_formtuple(tupDesc, values, nulls);
+
 	nspoid = simple_heap_insert(nspdesc, tup);
 	Assert(OidIsValid(nspoid));
 
-	if (RelationGetForm(nspdesc)->relhasindex)
-	{
-		Relation	idescs[Num_pg_namespace_indices];
-
-		CatalogOpenIndices(Num_pg_namespace_indices, Name_pg_namespace_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_namespace_indices, nspdesc, tup);
-		CatalogCloseIndices(Num_pg_namespace_indices, idescs);
-	}
+	CatalogUpdateIndexes(nspdesc, tup);
 
 	heap_close(nspdesc, RowExclusiveLock);
 
diff --git a/src/backend/catalog/pg_operator.c b/src/backend/catalog/pg_operator.c
index 64af6ad3de60810385f4c601664d249a0a7c5825..620ec7360cfaf58bb04d5337f8ce987321116ecc 100644
--- a/src/backend/catalog/pg_operator.c
+++ b/src/backend/catalog/pg_operator.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.74 2002/07/24 19:11:08 petere Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.75 2002/08/05 03:29:16 tgl Exp $
  *
  * NOTES
  *	  these routines moved here from commands/define.c and somewhat cleaned up.
@@ -263,14 +263,7 @@ OperatorShellMake(const char *operatorName,
 	 */
 	operatorObjectId = simple_heap_insert(pg_operator_desc, tup);
 
-	if (RelationGetForm(pg_operator_desc)->relhasindex)
-	{
-		Relation	idescs[Num_pg_operator_indices];
-
-		CatalogOpenIndices(Num_pg_operator_indices, Name_pg_operator_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_operator_indices, pg_operator_desc, tup);
-		CatalogCloseIndices(Num_pg_operator_indices, idescs);
-	}
+	CatalogUpdateIndexes(pg_operator_desc, tup);
 
 	/* Add dependencies for the entry */
 	makeOperatorDependencies(tup, RelationGetRelid(pg_operator_desc));
@@ -646,14 +639,7 @@ OperatorCreate(const char *operatorName,
 	}
 
 	/* Must update the indexes in either case */
-	if (RelationGetForm(pg_operator_desc)->relhasindex)
-	{
-		Relation	idescs[Num_pg_operator_indices];
-
-		CatalogOpenIndices(Num_pg_operator_indices, Name_pg_operator_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_operator_indices, pg_operator_desc, tup);
-		CatalogCloseIndices(Num_pg_operator_indices, idescs);
-	}
+	CatalogUpdateIndexes(pg_operator_desc, tup);
 
 	/* Add dependencies for the entry */
 	makeOperatorDependencies(tup, RelationGetRelid(pg_operator_desc));
@@ -815,14 +801,7 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId)
 
 				simple_heap_update(pg_operator_desc, &tup->t_self, tup);
 
-				if (RelationGetForm(pg_operator_desc)->relhasindex)
-				{
-					Relation	idescs[Num_pg_operator_indices];
-
-					CatalogOpenIndices(Num_pg_operator_indices, Name_pg_operator_indices, idescs);
-					CatalogIndexInsert(idescs, Num_pg_operator_indices, pg_operator_desc, tup);
-					CatalogCloseIndices(Num_pg_operator_indices, idescs);
-				}
+				CatalogUpdateIndexes(pg_operator_desc, tup);
 			}
 		}
 
@@ -847,14 +826,7 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId)
 
 		simple_heap_update(pg_operator_desc, &tup->t_self, tup);
 
-		if (RelationGetForm(pg_operator_desc)->relhasindex)
-		{
-			Relation	idescs[Num_pg_operator_indices];
-
-			CatalogOpenIndices(Num_pg_operator_indices, Name_pg_operator_indices, idescs);
-			CatalogIndexInsert(idescs, Num_pg_operator_indices, pg_operator_desc, tup);
-			CatalogCloseIndices(Num_pg_operator_indices, idescs);
-		}
+		CatalogUpdateIndexes(pg_operator_desc, tup);
 
 		values[Anum_pg_operator_oprcom - 1] = (Datum) NULL;
 		replaces[Anum_pg_operator_oprcom - 1] = ' ';
@@ -880,14 +852,7 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId)
 
 		simple_heap_update(pg_operator_desc, &tup->t_self, tup);
 
-		if (RelationGetForm(pg_operator_desc)->relhasindex)
-		{
-			Relation	idescs[Num_pg_operator_indices];
-
-			CatalogOpenIndices(Num_pg_operator_indices, Name_pg_operator_indices, idescs);
-			CatalogIndexInsert(idescs, Num_pg_operator_indices, pg_operator_desc, tup);
-			CatalogCloseIndices(Num_pg_operator_indices, idescs);
-		}
+		CatalogUpdateIndexes(pg_operator_desc, tup);
 	}
 
 	heap_close(pg_operator_desc, RowExclusiveLock);
diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c
index 5cc863249b4aa0431d77abbcd5bd4bb1eeebc0b3..f1b437be8d1b6700db7cb703b84f009fafb97ccd 100644
--- a/src/backend/catalog/pg_proc.c
+++ b/src/backend/catalog/pg_proc.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.87 2002/08/05 02:30:50 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.88 2002/08/05 03:29:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -236,15 +236,8 @@ ProcedureCreate(const char *procedureName,
 		is_update = false;
 	}
 
-	/* Need to update indices for either the insert or update case */
-	if (RelationGetForm(rel)->relhasindex)
-	{
-		Relation	idescs[Num_pg_proc_indices];
-
-		CatalogOpenIndices(Num_pg_proc_indices, Name_pg_proc_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_proc_indices, rel, tup);
-		CatalogCloseIndices(Num_pg_proc_indices, idescs);
-	}
+	/* Need to update indexes for either the insert or update case */
+	CatalogUpdateIndexes(rel, tup);
 
 	AssertTupleDescHasOid(tupDesc);
 	retval = HeapTupleGetOid(tup);
diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c
index b3e53f9a2bfe8ca527649f0e7c3bf1b9d87e9703..d1e90c6173220e32fe418e09f2c2334d0b59cbee 100644
--- a/src/backend/catalog/pg_type.c
+++ b/src/backend/catalog/pg_type.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.76 2002/07/24 19:11:09 petere Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.77 2002/08/05 03:29:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -103,14 +103,7 @@ TypeShellMake(const char *typeName, Oid typeNamespace)
 	 */
 	typoid = simple_heap_insert(pg_type_desc, tup);
 
-	if (RelationGetForm(pg_type_desc)->relhasindex)
-	{
-		Relation	idescs[Num_pg_type_indices];
-
-		CatalogOpenIndices(Num_pg_type_indices, Name_pg_type_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_type_indices, pg_type_desc, tup);
-		CatalogCloseIndices(Num_pg_type_indices, idescs);
-	}
+	CatalogUpdateIndexes(pg_type_desc, tup);
 
 	/*
 	 * clean up and return the type-oid
@@ -280,15 +273,8 @@ TypeCreate(const char *typeName,
 		typeObjectId = simple_heap_insert(pg_type_desc, tup);
 	}
 
-	/* Update indices (not necessary if bootstrapping) */
-	if (RelationGetForm(pg_type_desc)->relhasindex)
-	{
-		Relation	idescs[Num_pg_type_indices];
-
-		CatalogOpenIndices(Num_pg_type_indices, Name_pg_type_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_type_indices, pg_type_desc, tup);
-		CatalogCloseIndices(Num_pg_type_indices, idescs);
-	}
+	/* Update indexes */
+	CatalogUpdateIndexes(pg_type_desc, tup);
 
 	/*
 	 * Create dependencies.  We can/must skip this in bootstrap mode.
@@ -382,7 +368,6 @@ TypeRename(const char *oldTypeName, Oid typeNamespace,
 		   const char *newTypeName)
 {
 	Relation	pg_type_desc;
-	Relation	idescs[Num_pg_type_indices];
 	HeapTuple	tuple;
 
 	pg_type_desc = heap_openr(TypeRelationName, RowExclusiveLock);
@@ -404,10 +389,8 @@ TypeRename(const char *oldTypeName, Oid typeNamespace,
 
 	simple_heap_update(pg_type_desc, &tuple->t_self, tuple);
 
-	/* update the system catalog indices */
-	CatalogOpenIndices(Num_pg_type_indices, Name_pg_type_indices, idescs);
-	CatalogIndexInsert(idescs, Num_pg_type_indices, pg_type_desc, tuple);
-	CatalogCloseIndices(Num_pg_type_indices, idescs);
+	/* update the system catalog indexes */
+	CatalogUpdateIndexes(pg_type_desc, tuple);
 
 	heap_freetuple(tuple);
 	heap_close(pg_type_desc, RowExclusiveLock);
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index 9844a5df0a97e466b1f404e252b85cc1784b946a..5cabe21d5f927dd6b32288d5650bb3ce28a27280 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/analyze.c,v 1.40 2002/08/02 18:15:05 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/analyze.c,v 1.41 2002/08/05 03:29:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1670,7 +1670,6 @@ update_attstats(Oid relid, int natts, VacAttrStats **vacattrstats)
 		Datum		values[Natts_pg_statistic];
 		char		nulls[Natts_pg_statistic];
 		char		replaces[Natts_pg_statistic];
-		Relation	irelations[Num_pg_statistic_indices];
 
 		/* Ignore attr if we weren't able to collect stats */
 		if (!stats->stats_valid)
@@ -1784,11 +1783,8 @@ update_attstats(Oid relid, int natts, VacAttrStats **vacattrstats)
 			simple_heap_insert(sd, stup);
 		}
 
-		/* update indices too */
-		CatalogOpenIndices(Num_pg_statistic_indices, Name_pg_statistic_indices,
-						   irelations);
-		CatalogIndexInsert(irelations, Num_pg_statistic_indices, sd, stup);
-		CatalogCloseIndices(Num_pg_statistic_indices, irelations);
+		/* update indexes too */
+		CatalogUpdateIndexes(sd, stup);
 
 		heap_freetuple(stup);
 	}
diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c
index 5f40f1617b6bd770039b7d82a39f1939ba3866fd..4c7c5f211024609eec122ecfccf9edc8d2d30e36 100644
--- a/src/backend/commands/async.c
+++ b/src/backend/commands/async.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/async.c,v 1.87 2002/06/20 20:29:26 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/async.c,v 1.88 2002/08/05 03:29:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -245,14 +245,7 @@ Async_Listen(char *relname, int pid)
 	simple_heap_insert(lRel, tuple);
 
 #ifdef NOT_USED					/* currently there are no indexes */
-	if (RelationGetForm(lRel)->relhasindex)
-	{
-		Relation	idescs[Num_pg_listener_indices];
-
-		CatalogOpenIndices(Num_pg_listener_indices, Name_pg_listener_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_listener_indices, lRel, tuple);
-		CatalogCloseIndices(Num_pg_listener_indices, idescs);
-	}
+	CatalogUpdateIndexes(lRel, tuple);
 #endif
 
 	heap_freetuple(tuple);
@@ -529,14 +522,7 @@ AtCommit_Notify(void)
 				simple_heap_update(lRel, &lTuple->t_self, rTuple);
 
 #ifdef NOT_USED					/* currently there are no indexes */
-				if (RelationGetForm(lRel)->relhasindex)
-				{
-					Relation	idescs[Num_pg_listener_indices];
-
-					CatalogOpenIndices(Num_pg_listener_indices, Name_pg_listener_indices, idescs);
-					CatalogIndexInsert(idescs, Num_pg_listener_indices, lRel, rTuple);
-					CatalogCloseIndices(Num_pg_listener_indices, idescs);
-				}
+				CatalogUpdateIndexes(lRel, rTuple);
 #endif
 			}
 		}
@@ -802,14 +788,7 @@ ProcessIncomingNotify(void)
 			simple_heap_update(lRel, &lTuple->t_self, rTuple);
 
 #ifdef NOT_USED					/* currently there are no indexes */
-			if (RelationGetForm(lRel)->relhasindex)
-			{
-				Relation	idescs[Num_pg_listener_indices];
-
-				CatalogOpenIndices(Num_pg_listener_indices, Name_pg_listener_indices, idescs);
-				CatalogIndexInsert(idescs, Num_pg_listener_indices, lRel, rTuple);
-				CatalogCloseIndices(Num_pg_listener_indices, idescs);
-			}
+			CatalogUpdateIndexes(lRel, rTuple);
 #endif
 		}
 	}
diff --git a/src/backend/commands/comment.c b/src/backend/commands/comment.c
index 118c2c4b777e4fa074450be4c821a34d0d07c276..e244a82d1ad66fc405e7fce7e02c2e5632bc0867 100644
--- a/src/backend/commands/comment.c
+++ b/src/backend/commands/comment.c
@@ -7,7 +7,7 @@
  * Copyright (c) 1996-2001, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/comment.c,v 1.54 2002/08/02 18:15:05 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/comment.c,v 1.55 2002/08/05 03:29:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -206,19 +206,9 @@ CreateComments(Oid oid, Oid classoid, int32 subid, char *comment)
 	}
 
 	/* Update indexes, if necessary */
-
 	if (newtuple != NULL)
 	{
-		if (RelationGetForm(description)->relhasindex)
-		{
-			Relation	idescs[Num_pg_description_indices];
-
-			CatalogOpenIndices(Num_pg_description_indices,
-							   Name_pg_description_indices, idescs);
-			CatalogIndexInsert(idescs, Num_pg_description_indices, description,
-							   newtuple);
-			CatalogCloseIndices(Num_pg_description_indices, idescs);
-		}
+		CatalogUpdateIndexes(description, newtuple);
 		heap_freetuple(newtuple);
 	}
 
diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c
index 2c401a6dbdc1cccb2df79765260500c0117ad1f0..d043d95b784ef240ae081a6cdec16d13bb1cfd3b 100644
--- a/src/backend/commands/dbcommands.c
+++ b/src/backend/commands/dbcommands.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.97 2002/07/20 05:16:57 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.98 2002/08/05 03:29:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -347,19 +347,8 @@ createdb(const CreatedbStmt *stmt)
 
 	simple_heap_insert(pg_database_rel, tuple);
 
-	/*
-	 * Update indexes
-	 */
-	if (RelationGetForm(pg_database_rel)->relhasindex)
-	{
-		Relation	idescs[Num_pg_database_indices];
-
-		CatalogOpenIndices(Num_pg_database_indices,
-						   Name_pg_database_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_database_indices, pg_database_rel,
-						   tuple);
-		CatalogCloseIndices(Num_pg_database_indices, idescs);
-	}
+	/* Update indexes */
+	CatalogUpdateIndexes(pg_database_rel, tuple);
 
 	/* Close pg_database, but keep lock till commit */
 	heap_close(pg_database_rel, NoLock);
@@ -562,19 +551,8 @@ AlterDatabaseSet(AlterDatabaseSetStmt *stmt)
 	newtuple = heap_modifytuple(tuple, rel, repl_val, repl_null, repl_repl);
 	simple_heap_update(rel, &tuple->t_self, newtuple);
 
-	/*
-	 * Update indexes
-	 */
-	if (RelationGetForm(rel)->relhasindex)
-	{
-		Relation	idescs[Num_pg_database_indices];
-
-		CatalogOpenIndices(Num_pg_database_indices,
-						   Name_pg_database_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_database_indices, rel,
-						   newtuple);
-		CatalogCloseIndices(Num_pg_database_indices, idescs);
-	}
+	/* Update indexes */
+	CatalogUpdateIndexes(rel, newtuple);
 
 	heap_endscan(scan);
 	heap_close(rel, RowExclusiveLock);
diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c
index ea858d55716aee27bf4a28852b895e24e86e9409..944ae192a0debbf310a74a13924c784c59561b9a 100644
--- a/src/backend/commands/functioncmds.c
+++ b/src/backend/commands/functioncmds.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v 1.15 2002/07/29 23:44:44 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v 1.16 2002/08/05 03:29:16 tgl Exp $
  *
  * DESCRIPTION
  *	  These routines take the parse tree and pick out the
@@ -685,16 +685,10 @@ CreateCast(CreateCastStmt *stmt)
 		nulls[i] = ' ';
 
 	tuple = heap_formtuple(RelationGetDescr(relation), values, nulls);
-	simple_heap_insert(relation, tuple);
 
-	if (RelationGetForm(relation)->relhasindex)
-	{
-		Relation	idescs[Num_pg_cast_indices];
+	simple_heap_insert(relation, tuple);
 
-		CatalogOpenIndices(Num_pg_cast_indices, Name_pg_cast_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_cast_indices, relation, tuple);
-		CatalogCloseIndices(Num_pg_cast_indices, idescs);
-	}
+	CatalogUpdateIndexes(relation, tuple);
 
 	myself.classId = RelationGetRelid(relation);
 	myself.objectId = HeapTupleGetOid(tuple);
diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c
index c56b0e1fa84b0b5f7fcb7605dc2d5a0ed3637f03..f544dc9886c0b47e8bee19667b69dfc9ac68ac91 100644
--- a/src/backend/commands/opclasscmds.c
+++ b/src/backend/commands/opclasscmds.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/opclasscmds.c,v 1.2 2002/07/29 23:46:35 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/opclasscmds.c,v 1.3 2002/08/05 03:29:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -286,15 +286,7 @@ DefineOpClass(CreateOpClassStmt *stmt)
 
 	opclassoid = simple_heap_insert(rel, tup);
 
-	if (RelationGetForm(rel)->relhasindex)
-	{
-		Relation	idescs[Num_pg_opclass_indices];
-
-		CatalogOpenIndices(Num_pg_opclass_indices, Name_pg_opclass_indices,
-						   idescs);
-		CatalogIndexInsert(idescs, Num_pg_opclass_indices, rel, tup);
-		CatalogCloseIndices(Num_pg_opclass_indices, idescs);
-	}
+	CatalogUpdateIndexes(rel, tup);
 
 	heap_freetuple(tup);
 
@@ -395,15 +387,8 @@ storeOperators(Oid opclassoid, int numOperators,
 
 		simple_heap_insert(rel, tup);
 
-		if (RelationGetForm(rel)->relhasindex)
-		{
-			Relation	idescs[Num_pg_amop_indices];
+		CatalogUpdateIndexes(rel, tup);
 
-			CatalogOpenIndices(Num_pg_amop_indices, Name_pg_amop_indices,
-							   idescs);
-			CatalogIndexInsert(idescs, Num_pg_amop_indices, rel, tup);
-			CatalogCloseIndices(Num_pg_amop_indices, idescs);
-		}
 		heap_freetuple(tup);
 	}
 
@@ -444,15 +429,8 @@ storeProcedures(Oid opclassoid, int numProcs, Oid *procedures)
 
 		simple_heap_insert(rel, tup);
 
-		if (RelationGetForm(rel)->relhasindex)
-		{
-			Relation	idescs[Num_pg_amproc_indices];
+		CatalogUpdateIndexes(rel, tup);
 
-			CatalogOpenIndices(Num_pg_amproc_indices, Name_pg_amproc_indices,
-							   idescs);
-			CatalogIndexInsert(idescs, Num_pg_amproc_indices, rel, tup);
-			CatalogCloseIndices(Num_pg_amproc_indices, idescs);
-		}
 		heap_freetuple(tup);
 	}
 
diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c
index 567b59dae80b311994481cf58798210f5c86a2bf..0c28dea73171e3550ea5f5d18589360ea831e05a 100644
--- a/src/backend/commands/proclang.c
+++ b/src/backend/commands/proclang.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/proclang.c,v 1.38 2002/07/24 19:11:09 petere Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/proclang.c,v 1.39 2002/08/05 03:29:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -119,14 +119,7 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
 
 	simple_heap_insert(rel, tup);
 
-	if (RelationGetForm(rel)->relhasindex)
-	{
-		Relation	idescs[Num_pg_language_indices];
-
-		CatalogOpenIndices(Num_pg_language_indices, Name_pg_language_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_language_indices, rel, tup);
-		CatalogCloseIndices(Num_pg_language_indices, idescs);
-	}
+	CatalogUpdateIndexes(rel, tup);
 
 	/*
 	 * Create dependencies for language
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 4972c09b4a40741a2f0726843c9f4d94da70ec7b..eedc1a9dad2dcdcff35ebb74d5e3e490eecca3d2 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.26 2002/08/02 18:15:06 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.27 2002/08/05 03:29:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -325,7 +325,7 @@ RemoveRelation(const RangeVar *relation, DropBehavior behavior)
  *				  BadArg if name is invalid
  *
  * Note:
- *				  Rows are removed, indices are truncated and reconstructed.
+ *				  Rows are removed, indexes are truncated and reconstructed.
  */
 void
 TruncateRelation(const RangeVar *relation)
@@ -832,14 +832,7 @@ StoreCatalogInheritance(Oid relationId, List *supers)
 
 		simple_heap_insert(relation, tuple);
 
-		if (RelationGetForm(relation)->relhasindex)
-		{
-			Relation	idescs[Num_pg_inherits_indices];
-
-			CatalogOpenIndices(Num_pg_inherits_indices, Name_pg_inherits_indices, idescs);
-			CatalogIndexInsert(idescs, Num_pg_inherits_indices, relation, tuple);
-			CatalogCloseIndices(Num_pg_inherits_indices, idescs);
-		}
+		CatalogUpdateIndexes(relation, tuple);
 
 		heap_freetuple(tuple);
 
@@ -969,7 +962,6 @@ setRelhassubclassInRelation(Oid relationId, bool relhassubclass)
 {
 	Relation	relationRelation;
 	HeapTuple	tuple;
-	Relation	idescs[Num_pg_class_indices];
 
 	/*
 	 * Fetch a modifiable copy of the tuple, modify it, update pg_class.
@@ -984,10 +976,8 @@ setRelhassubclassInRelation(Oid relationId, bool relhassubclass)
 	((Form_pg_class) GETSTRUCT(tuple))->relhassubclass = relhassubclass;
 	simple_heap_update(relationRelation, &tuple->t_self, tuple);
 
-	/* keep the catalog indices up to date */
-	CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
-	CatalogIndexInsert(idescs, Num_pg_class_indices, relationRelation, tuple);
-	CatalogCloseIndices(Num_pg_class_indices, idescs);
+	/* keep the catalog indexes up to date */
+	CatalogUpdateIndexes(relationRelation, tuple);
 
 	heap_freetuple(tuple);
 	heap_close(relationRelation, RowExclusiveLock);
@@ -1097,14 +1087,8 @@ renameatt(Oid relid,
 
 	simple_heap_update(attrelation, &atttup->t_self, atttup);
 
-	/* keep system catalog indices current */
-	{
-		Relation	irelations[Num_pg_attr_indices];
-
-		CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, irelations);
-		CatalogIndexInsert(irelations, Num_pg_attr_indices, attrelation, atttup);
-		CatalogCloseIndices(Num_pg_attr_indices, irelations);
-	}
+	/* keep system catalog indexes current */
+	CatalogUpdateIndexes(attrelation, atttup);
 
 	heap_freetuple(atttup);
 
@@ -1151,14 +1135,9 @@ renameatt(Oid relid,
 
 		simple_heap_update(attrelation, &atttup->t_self, atttup);
 
-		/* keep system catalog indices current */
-		{
-			Relation	irelations[Num_pg_attr_indices];
+		/* keep system catalog indexes current */
+		CatalogUpdateIndexes(attrelation, atttup);
 
-			CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, irelations);
-			CatalogIndexInsert(irelations, Num_pg_attr_indices, attrelation, atttup);
-			CatalogCloseIndices(Num_pg_attr_indices, irelations);
-		}
 		heap_freetuple(atttup);
 	}
 
@@ -1203,7 +1182,6 @@ renamerel(Oid relid, const char *newrelname)
 	char	   *oldrelname;
 	char		relkind;
 	bool		relhastriggers;
-	Relation	irelations[Num_pg_class_indices];
 
 	/*
 	 * Grab an exclusive lock on the target table or index, which we will
@@ -1247,10 +1225,8 @@ renamerel(Oid relid, const char *newrelname)
 
 	simple_heap_update(relrelation, &reltup->t_self, reltup);
 
-	/* keep the system catalog indices current */
-	CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, irelations);
-	CatalogIndexInsert(irelations, Num_pg_class_indices, relrelation, reltup);
-	CatalogCloseIndices(Num_pg_class_indices, irelations);
+	/* keep the system catalog indexes current */
+	CatalogUpdateIndexes(relrelation, reltup);
 
 	heap_close(relrelation, NoLock);
 	heap_freetuple(reltup);
@@ -1481,13 +1457,7 @@ update_ri_trigger_args(Oid relid,
 		 */
 		simple_heap_update(tgrel, &tuple->t_self, tuple);
 
-		{
-			Relation	irelations[Num_pg_attr_indices];
-
-			CatalogOpenIndices(Num_pg_trigger_indices, Name_pg_trigger_indices, irelations);
-			CatalogIndexInsert(irelations, Num_pg_trigger_indices, tgrel, tuple);
-			CatalogCloseIndices(Num_pg_trigger_indices, irelations);
-		}
+		CatalogUpdateIndexes(tgrel, tuple);
 
 		/* free up our scratch memory */
 		pfree(newtgargs);
@@ -1703,14 +1673,7 @@ AlterTableAddColumn(Oid myrelid,
 	simple_heap_insert(attrdesc, attributeTuple);
 
 	/* Update indexes on pg_attribute */
-	if (RelationGetForm(attrdesc)->relhasindex)
-	{
-		Relation	idescs[Num_pg_attr_indices];
-
-		CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_attr_indices, attrdesc, attributeTuple);
-		CatalogCloseIndices(Num_pg_attr_indices, idescs);
-	}
+	CatalogUpdateIndexes(attrdesc, attributeTuple);
 
 	heap_close(attrdesc, RowExclusiveLock);
 
@@ -1723,15 +1686,8 @@ AlterTableAddColumn(Oid myrelid,
 	AssertTupleDescHasOid(pgclass->rd_att);
 	simple_heap_update(pgclass, &newreltup->t_self, newreltup);
 
-	/* keep catalog indices current */
-	if (RelationGetForm(pgclass)->relhasindex)
-	{
-		Relation	ridescs[Num_pg_class_indices];
-
-		CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs);
-		CatalogIndexInsert(ridescs, Num_pg_class_indices, pgclass, newreltup);
-		CatalogCloseIndices(Num_pg_class_indices, ridescs);
-	}
+	/* keep catalog indexes current */
+	CatalogUpdateIndexes(pgclass, newreltup);
 
 	heap_freetuple(newreltup);
 	ReleaseSysCache(reltup);
@@ -1850,7 +1806,7 @@ AlterTableAlterColumnDropNotNull(Oid myrelid,
 	 * Check that the attribute is not in a primary key
 	 */
 
-	/* Loop over all indices on the relation */
+	/* Loop over all indexes on the relation */
 	indexoidlist = RelationGetIndexList(rel);
 
 	foreach(indexoidscan, indexoidlist)
@@ -1902,15 +1858,8 @@ AlterTableAlterColumnDropNotNull(Oid myrelid,
 
 	simple_heap_update(attr_rel, &tuple->t_self, tuple);
 
-	/* keep the system catalog indices current */
-	if (RelationGetForm(attr_rel)->relhasindex)
-	{
-		Relation	idescs[Num_pg_attr_indices];
-
-		CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_attr_indices, attr_rel, tuple);
-		CatalogCloseIndices(Num_pg_attr_indices, idescs);
-	}
+	/* keep the system catalog indexes current */
+	CatalogUpdateIndexes(attr_rel, tuple);
 
 	heap_close(attr_rel, RowExclusiveLock);
 
@@ -2023,15 +1972,8 @@ AlterTableAlterColumnSetNotNull(Oid myrelid,
 
 	simple_heap_update(attr_rel, &tuple->t_self, tuple);
 
-	/* keep the system catalog indices current */
-	if (RelationGetForm(attr_rel)->relhasindex)
-	{
-		Relation	idescs[Num_pg_attr_indices];
-
-		CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_attr_indices, attr_rel, tuple);
-		CatalogCloseIndices(Num_pg_attr_indices, idescs);
-	}
+	/* keep the system catalog indexes current */
+	CatalogUpdateIndexes(attr_rel, tuple);
 
 	heap_close(attr_rel, RowExclusiveLock);
 
@@ -2278,16 +2220,11 @@ AlterTableAlterColumnFlags(Oid myrelid,
 
 	simple_heap_update(attrelation, &tuple->t_self, tuple);
 
-	/* keep system catalog indices current */
-	{
-		Relation	irelations[Num_pg_attr_indices];
-
-		CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, irelations);
-		CatalogIndexInsert(irelations, Num_pg_attr_indices, attrelation, tuple);
-		CatalogCloseIndices(Num_pg_attr_indices, irelations);
-	}
+	/* keep system catalog indexes current */
+	CatalogUpdateIndexes(attrelation, tuple);
 
 	heap_freetuple(tuple);
+
 	heap_close(attrelation, NoLock);
 	heap_close(rel, NoLock);	/* close rel, but keep lock! */
 }
@@ -3200,7 +3137,6 @@ AlterTableOwner(Oid relationOid, int32 newOwnerSysId)
 	Relation		target_rel;
 	Relation		class_rel;
 	HeapTuple		tuple;
-	Relation		idescs[Num_pg_class_indices];
 	Form_pg_class	tuple_class;
 
 	/* Get exclusive lock till end of transaction on the target table */
@@ -3227,10 +3163,8 @@ AlterTableOwner(Oid relationOid, int32 newOwnerSysId)
 	tuple_class->relowner = newOwnerSysId;
 	simple_heap_update(class_rel, &tuple->t_self, tuple);
 
-	/* Keep the catalog indices up to date */
-	CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
-	CatalogIndexInsert(idescs, Num_pg_class_indices, class_rel, tuple);
-	CatalogCloseIndices(Num_pg_class_indices, idescs);
+	/* Keep the catalog indexes up to date */
+	CatalogUpdateIndexes(class_rel, tuple);
 
 	/*
 	 * If we are operating on a table, also change the ownership of any
@@ -3299,7 +3233,6 @@ AlterTableCreateToastTable(Oid relOid, bool silent)
 	bool		shared_relation;
 	Relation	class_rel;
 	Buffer		buffer;
-	Relation	ridescs[Num_pg_class_indices];
 	Oid			toast_relid;
 	Oid			toast_idxid;
 	char		toast_relname[NAMEDATALEN];
@@ -3481,14 +3414,11 @@ AlterTableCreateToastTable(Oid relOid, bool silent)
 	 * Store the toast table's OID in the parent relation's tuple
 	 */
 	((Form_pg_class) GETSTRUCT(reltup))->reltoastrelid = toast_relid;
+
 	simple_heap_update(class_rel, &reltup->t_self, reltup);
 
-	/*
-	 * Keep catalog indices current
-	 */
-	CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs);
-	CatalogIndexInsert(ridescs, Num_pg_class_indices, class_rel, reltup);
-	CatalogCloseIndices(Num_pg_class_indices, ridescs);
+	/* Keep catalog indexes current */
+	CatalogUpdateIndexes(class_rel, reltup);
 
 	heap_freetuple(reltup);
 
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 353d684d9039fc43f05b5078ea5fe800ed77be5b..7fa570890d59879c63407d2bf7680b7bb68ce012 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.123 2002/07/20 19:55:38 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.124 2002/08/05 03:29:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -72,8 +72,6 @@ CreateTrigger(CreateTrigStmt *stmt, bool forConstraint)
 	ScanKeyData key;
 	Relation	pgrel;
 	HeapTuple	tuple;
-	Relation	idescs[Num_pg_trigger_indices];
-	Relation	ridescs[Num_pg_class_indices];
 	Oid			fargtypes[FUNC_MAX_ARGS];
 	Oid			funcoid;
 	Oid			funclang;
@@ -302,9 +300,7 @@ CreateTrigger(CreateTrigStmt *stmt, bool forConstraint)
 	 */
 	simple_heap_insert(tgrel, tuple);
 
-	CatalogOpenIndices(Num_pg_trigger_indices, Name_pg_trigger_indices, idescs);
-	CatalogIndexInsert(idescs, Num_pg_trigger_indices, tgrel, tuple);
-	CatalogCloseIndices(Num_pg_trigger_indices, idescs);
+	CatalogUpdateIndexes(tgrel, tuple);
 
 	myself.classId = RelationGetRelid(tgrel);
 	myself.objectId = trigoid;
@@ -333,9 +329,7 @@ CreateTrigger(CreateTrigStmt *stmt, bool forConstraint)
 
 	simple_heap_update(pgrel, &tuple->t_self, tuple);
 
-	CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs);
-	CatalogIndexInsert(ridescs, Num_pg_class_indices, pgrel, tuple);
-	CatalogCloseIndices(Num_pg_class_indices, ridescs);
+	CatalogUpdateIndexes(pgrel, tuple);
 
 	heap_freetuple(tuple);
 	heap_close(pgrel, RowExclusiveLock);
@@ -447,7 +441,6 @@ RemoveTriggerById(Oid trigOid)
 	Relation	pgrel;
 	HeapTuple	tuple;
 	Form_pg_class	classForm;
-	Relation	ridescs[Num_pg_class_indices];
 
 	tgrel = heap_openr(TriggerRelationName, RowExclusiveLock);
 
@@ -514,9 +507,7 @@ RemoveTriggerById(Oid trigOid)
 
 	simple_heap_update(pgrel, &tuple->t_self, tuple);
 
-	CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs);
-	CatalogIndexInsert(ridescs, Num_pg_class_indices, pgrel, tuple);
-	CatalogCloseIndices(Num_pg_class_indices, ridescs);
+	CatalogUpdateIndexes(pgrel, tuple);
 
 	heap_freetuple(tuple);
 
@@ -549,7 +540,6 @@ renametrig(Oid relid,
 	HeapTuple	tuple;
 	SysScanDesc	tgscan;
 	ScanKeyData key[2];
-	Relation	idescs[Num_pg_trigger_indices];
 
 	/*
 	 * Grab an exclusive lock on the target table, which we will NOT
@@ -610,12 +600,8 @@ renametrig(Oid relid,
 
 		simple_heap_update(tgrel, &tuple->t_self, tuple);
 
-		/*
-		 * keep system catalog indices current
-		 */
-		CatalogOpenIndices(Num_pg_trigger_indices, Name_pg_trigger_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_trigger_indices, tgrel, tuple);
-		CatalogCloseIndices(Num_pg_trigger_indices, idescs);
+		/* keep system catalog indexes current */
+		CatalogUpdateIndexes(tgrel, tuple);
 
 		/*
 		 * Invalidate relation's relcache entry so that other backends (and
diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c
index d464b5588c78178412b7311f70b8eacbc5c8ec85..60fc4b733cb8bce1799d1b84257aa0c80987c007 100644
--- a/src/backend/commands/user.c
+++ b/src/backend/commands/user.c
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Header: /cvsroot/pgsql/src/backend/commands/user.c,v 1.106 2002/07/24 19:11:09 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/user.c,v 1.107 2002/08/05 03:29:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -597,19 +597,8 @@ CreateUser(CreateUserStmt *stmt)
 	 */
 	simple_heap_insert(pg_shadow_rel, tuple);
 
-	/*
-	 * Update indexes
-	 */
-	if (RelationGetForm(pg_shadow_rel)->relhasindex)
-	{
-		Relation	idescs[Num_pg_shadow_indices];
-
-		CatalogOpenIndices(Num_pg_shadow_indices,
-						   Name_pg_shadow_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_shadow_indices, pg_shadow_rel,
-						   tuple);
-		CatalogCloseIndices(Num_pg_shadow_indices, idescs);
-	}
+	/* Update indexes */
+	CatalogUpdateIndexes(pg_shadow_rel, tuple);
 
 	/*
 	 * Add the user to the groups specified. We'll just call the below
@@ -809,16 +798,7 @@ AlterUser(AlterUserStmt *stmt)
 	simple_heap_update(pg_shadow_rel, &tuple->t_self, new_tuple);
 
 	/* Update indexes */
-	if (RelationGetForm(pg_shadow_rel)->relhasindex)
-	{
-		Relation	idescs[Num_pg_shadow_indices];
-
-		CatalogOpenIndices(Num_pg_shadow_indices,
-						   Name_pg_shadow_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_shadow_indices, pg_shadow_rel,
-						   new_tuple);
-		CatalogCloseIndices(Num_pg_shadow_indices, idescs);
-	}
+	CatalogUpdateIndexes(pg_shadow_rel, new_tuple);
 
 	ReleaseSysCache(tuple);
 	heap_freetuple(new_tuple);
@@ -898,13 +878,7 @@ AlterUserSet(AlterUserSetStmt *stmt)
 	newtuple = heap_modifytuple(oldtuple, rel, repl_val, repl_null, repl_repl);
 	simple_heap_update(rel, &oldtuple->t_self, newtuple);
 
-	{
-		Relation	idescs[Num_pg_shadow_indices];
-
-		CatalogOpenIndices(Num_pg_shadow_indices, Name_pg_shadow_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_shadow_indices, rel, newtuple);
-		CatalogCloseIndices(Num_pg_shadow_indices, idescs);
-	}
+	CatalogUpdateIndexes(rel, newtuple);
 
 	ReleaseSysCache(oldtuple);
 	heap_close(rel, RowExclusiveLock);
@@ -1216,19 +1190,8 @@ CreateGroup(CreateGroupStmt *stmt)
 	 */
 	simple_heap_insert(pg_group_rel, tuple);
 
-	/*
-	 * Update indexes
-	 */
-	if (RelationGetForm(pg_group_rel)->relhasindex)
-	{
-		Relation	idescs[Num_pg_group_indices];
-
-		CatalogOpenIndices(Num_pg_group_indices,
-						   Name_pg_group_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_group_indices, pg_group_rel,
-						   tuple);
-		CatalogCloseIndices(Num_pg_group_indices, idescs);
-	}
+	/* Update indexes */
+	CatalogUpdateIndexes(pg_group_rel, tuple);
 
 	heap_close(pg_group_rel, NoLock);
 
@@ -1417,16 +1380,7 @@ UpdateGroupMembership(Relation group_rel, HeapTuple group_tuple,
 	simple_heap_update(group_rel, &group_tuple->t_self, tuple);
 
 	/* Update indexes */
-	if (RelationGetForm(group_rel)->relhasindex)
-	{
-		Relation	idescs[Num_pg_group_indices];
-
-		CatalogOpenIndices(Num_pg_group_indices,
-						   Name_pg_group_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_group_indices, group_rel,
-						   tuple);
-		CatalogCloseIndices(Num_pg_group_indices, idescs);
-	}
+	CatalogUpdateIndexes(group_rel, tuple);
 }
 
 
diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c
index 577ce2bd52d7c22165323f3bbca3ac5c48936bba..80952d7ddc403d56a33b844a3cc4e88fff853505 100644
--- a/src/backend/rewrite/rewriteDefine.c
+++ b/src/backend/rewrite/rewriteDefine.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.76 2002/08/02 18:15:07 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.77 2002/08/05 03:29:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -95,16 +95,7 @@ InsertRule(char *rulname,
 
 	rewriteObjectId = simple_heap_insert(pg_rewrite_desc, tup);
 
-	if (RelationGetForm(pg_rewrite_desc)->relhasindex)
-	{
-		Relation	idescs[Num_pg_rewrite_indices];
-
-		CatalogOpenIndices(Num_pg_rewrite_indices, Name_pg_rewrite_indices,
-						   idescs);
-		CatalogIndexInsert(idescs, Num_pg_rewrite_indices, pg_rewrite_desc,
-						   tup);
-		CatalogCloseIndices(Num_pg_rewrite_indices, idescs);
-	}
+	CatalogUpdateIndexes(pg_rewrite_desc, tup);
 
 	heap_freetuple(tup);
 
@@ -486,17 +477,8 @@ RenameRewriteRule(Oid owningRel, const char *oldName,
 
 	simple_heap_update(pg_rewrite_desc, &ruletup->t_self, ruletup);
 
-	/* keep system catalog indices current */
-	if (RelationGetForm(pg_rewrite_desc)->relhasindex)
-	{
-		Relation	idescs[Num_pg_rewrite_indices];
-
-		CatalogOpenIndices(Num_pg_rewrite_indices, Name_pg_rewrite_indices,
-						   idescs);
-		CatalogIndexInsert(idescs, Num_pg_rewrite_indices, pg_rewrite_desc,
-						   ruletup);
-		CatalogCloseIndices(Num_pg_rewrite_indices, idescs);
-	}
+	/* keep system catalog indexes current */
+	CatalogUpdateIndexes(pg_rewrite_desc, ruletup);
 
 	heap_freetuple(ruletup);
 	heap_close(pg_rewrite_desc, RowExclusiveLock);
diff --git a/src/backend/rewrite/rewriteSupport.c b/src/backend/rewrite/rewriteSupport.c
index 3f4c7f23871962a7b587a40982d0f784a7f5fe75..e55ceb83488f557de04745bc95360cfc5a8b33e0 100644
--- a/src/backend/rewrite/rewriteSupport.c
+++ b/src/backend/rewrite/rewriteSupport.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteSupport.c,v 1.53 2002/07/12 18:43:17 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteSupport.c,v 1.54 2002/08/05 03:29:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -55,7 +55,6 @@ SetRelationRuleStatus(Oid relationId, bool relHasRules,
 	Relation	relationRelation;
 	HeapTuple	tuple;
 	Form_pg_class classForm;
-	Relation	idescs[Num_pg_class_indices];
 
 	/*
 	 * Find the tuple to update in pg_class, using syscache for the
@@ -79,10 +78,8 @@ SetRelationRuleStatus(Oid relationId, bool relHasRules,
 
 		simple_heap_update(relationRelation, &tuple->t_self, tuple);
 
-		/* Keep the catalog indices up to date */
-		CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
-		CatalogIndexInsert(idescs, Num_pg_class_indices, relationRelation, tuple);
-		CatalogCloseIndices(Num_pg_class_indices, idescs);
+		/* Keep the catalog indexes up to date */
+		CatalogUpdateIndexes(relationRelation, tuple);
 	}
 	else
 	{
diff --git a/src/backend/storage/large_object/inv_api.c b/src/backend/storage/large_object/inv_api.c
index 0e279eed3d25a1d92c5b7dbd5bc25b3a77688901..5279190000ac8b26106cdc9d462b083244d61aa0 100644
--- a/src/backend/storage/large_object/inv_api.c
+++ b/src/backend/storage/large_object/inv_api.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.93 2002/06/20 20:29:35 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.94 2002/08/05 03:29:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -404,8 +404,7 @@ inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes)
 	Datum		values[Natts_pg_largeobject];
 	char		nulls[Natts_pg_largeobject];
 	char		replace[Natts_pg_largeobject];
-	bool		write_indices;
-	Relation	idescs[Num_pg_largeobject_indices];
+	CatalogIndexState indstate;
 
 	Assert(PointerIsValid(obj_desc));
 	Assert(buf != NULL);
@@ -413,11 +412,7 @@ inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes)
 	if (nbytes <= 0)
 		return 0;
 
-	write_indices = !IsIgnoringSystemIndexes();
-	if (write_indices)
-		CatalogOpenIndices(Num_pg_largeobject_indices,
-						   Name_pg_largeobject_indices,
-						   idescs);
+	indstate = CatalogOpenIndexes(obj_desc->heap_r);
 
 	ScanKeyEntryInitialize(&skey[0],
 						   (bits16) 0x0,
@@ -511,9 +506,7 @@ inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes)
 			newtup = heap_modifytuple(oldtuple, obj_desc->heap_r,
 									  values, nulls, replace);
 			simple_heap_update(obj_desc->heap_r, &newtup->t_self, newtup);
-			if (write_indices)
-				CatalogIndexInsert(idescs, Num_pg_largeobject_indices,
-								   obj_desc->heap_r, newtup);
+			CatalogIndexInsert(indstate, newtup);
 			heap_freetuple(newtup);
 
 			/*
@@ -556,9 +549,7 @@ inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes)
 			values[Anum_pg_largeobject_data - 1] = PointerGetDatum(&workbuf);
 			newtup = heap_formtuple(obj_desc->heap_r->rd_att, values, nulls);
 			simple_heap_insert(obj_desc->heap_r, newtup);
-			if (write_indices)
-				CatalogIndexInsert(idescs, Num_pg_largeobject_indices,
-								   obj_desc->heap_r, newtup);
+			CatalogIndexInsert(indstate, newtup);
 			heap_freetuple(newtup);
 		}
 		pageno++;
@@ -566,8 +557,7 @@ inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes)
 
 	index_endscan(sd);
 
-	if (write_indices)
-		CatalogCloseIndices(Num_pg_largeobject_indices, idescs);
+	CatalogCloseIndexes(indstate);
 
 	/*
 	 * Advance command counter so that my tuple updates will be seen by
diff --git a/src/backend/utils/adt/sets.c b/src/backend/utils/adt/sets.c
index a9a65fc389383b0d248cf3be983063dbd0ff1b4d..609e20219c21d1ff64d142a2f4f12be552c6d41f 100644
--- a/src/backend/utils/adt/sets.c
+++ b/src/backend/utils/adt/sets.c
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/sets.c,v 1.49 2002/07/24 19:11:11 petere Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/sets.c,v 1.50 2002/08/05 03:29:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -118,14 +118,8 @@ SetDefine(char *querystr, Oid elemType)
 		AssertTupleDescHasOid(procrel->rd_att);
 		setoid = HeapTupleGetOid(newtup);
 
-		if (RelationGetForm(procrel)->relhasindex)
-		{
-			Relation	idescs[Num_pg_proc_indices];
+		CatalogUpdateIndexes(procrel, newtup);
 
-			CatalogOpenIndices(Num_pg_proc_indices, Name_pg_proc_indices, idescs);
-			CatalogIndexInsert(idescs, Num_pg_proc_indices, procrel, newtup);
-			CatalogCloseIndices(Num_pg_proc_indices, idescs);
-		}
 		heap_freetuple(newtup);
 	}
 
diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c
index c9b68b1d8d42c902b21bc8e8f40dcdab444264b0..357829bee51b33f9caa5a6d6ebaba9c469264326 100644
--- a/src/backend/utils/cache/syscache.c
+++ b/src/backend/utils/cache/syscache.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.85 2002/08/02 18:15:08 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.86 2002/08/05 03:29:17 tgl Exp $
  *
  * NOTES
  *	  These routines allow the parser/planner/executor to perform
@@ -64,18 +64,16 @@
 	This is used by CatalogCacheFlushRelation() to remove the correct
 	tuples during a table drop or relcache invalidation event.
 
-	In include/catalog/indexing.h, add a define for the number of indexes
-	on the relation, add define(s) for the index name(s), add an extern
-	array to hold the index names, and use DECLARE_UNIQUE_INDEX to define
-	the index.	Cache lookups return only one row, so the index should be
-	unique in most cases.
-
-	In backend/catalog/indexing.c, initialize the relation array with
-	the index names for the relation.
+	There must be a unique index underlying each syscache (ie, an index
+	whose key is the same as that of the cache).  If there is not one
+	already, add definitions for it to include/catalog/indexing.h: you
+	need a #define for the index name and a DECLARE_UNIQUE_INDEX macro
+	with the actual declaration.  (This will require a catversion.h update,
+	while simply adding/deleting caches only requires a recompile.)
 
 	Finally, any place your relation gets heap_insert() or
-	heap_update calls, include code to do a CatalogIndexInsert() to update
-	the system indexes.  The heap_* calls do not update indexes.
+	heap_update calls, make sure there is a CatalogUpdateIndexes() or
+	similar call.  The heap_* calls do not update indexes.
 
 	bjm 1999/11/22
 
diff --git a/src/include/catalog/indexing.h b/src/include/catalog/indexing.h
index 4928eda6b652f8f8ee826785a70b0989e2ad6876..da512daffc33b03955330b4fbcb839e651cb6e02 100644
--- a/src/include/catalog/indexing.h
+++ b/src/include/catalog/indexing.h
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: indexing.h,v 1.73 2002/07/25 10:07:12 ishii Exp $
+ * $Id: indexing.h,v 1.74 2002/08/05 03:29:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -18,38 +18,10 @@
 #include "access/htup.h"
 
 /*
- * Number of indices that exist for each system catalog
- */
-#define Num_pg_aggregate_indices	1
-#define Num_pg_am_indices			2
-#define Num_pg_amop_indices			2
-#define Num_pg_amproc_indices		1
-#define Num_pg_attr_indices			2
-#define Num_pg_attrdef_indices		2
-#define Num_pg_cast_indices			2
-#define Num_pg_class_indices		2
-#define Num_pg_constraint_indices	3
-#define Num_pg_conversion_indices	3
-#define Num_pg_database_indices		2
-#define Num_pg_depend_indices		2
-#define Num_pg_description_indices	1
-#define Num_pg_group_indices		2
-#define Num_pg_index_indices		2
-#define Num_pg_inherits_indices		1
-#define Num_pg_language_indices		2
-#define Num_pg_largeobject_indices	1
-#define Num_pg_namespace_indices	2
-#define Num_pg_opclass_indices		2
-#define Num_pg_operator_indices		2
-#define Num_pg_proc_indices			2
-#define Num_pg_rewrite_indices		2
-#define Num_pg_shadow_indices		2
-#define Num_pg_statistic_indices	1
-#define Num_pg_trigger_indices		4
-#define Num_pg_type_indices			2
-
-/*
- * Names of indices on system catalogs
+ * Names of indexes on system catalogs
+ *
+ * References to specific system indexes in the C code should use these
+ * macros rather than hardwiring the actual index name.
  */
 #define AccessMethodOperatorIndex	"pg_amop_opc_opr_index"
 #define AccessMethodStrategyIndex	"pg_amop_opc_strategy_index"
@@ -104,43 +76,22 @@
 #define TypeNameNspIndex			"pg_type_typname_nsp_index"
 #define TypeOidIndex				"pg_type_oid_index"
 
-/* Arrays of names of indices for each system catalog */
-extern char *Name_pg_aggregate_indices[];
-extern char *Name_pg_am_indices[];
-extern char *Name_pg_amop_indices[];
-extern char *Name_pg_amproc_indices[];
-extern char *Name_pg_attr_indices[];
-extern char *Name_pg_attrdef_indices[];
-extern char *Name_pg_cast_indices[];
-extern char *Name_pg_class_indices[];
-extern char *Name_pg_constraint_indices[];
-extern char *Name_pg_conversion_indices[];
-extern char *Name_pg_database_indices[];
-extern char *Name_pg_depend_indices[];
-extern char *Name_pg_description_indices[];
-extern char *Name_pg_group_indices[];
-extern char *Name_pg_index_indices[];
-extern char *Name_pg_inherits_indices[];
-extern char *Name_pg_language_indices[];
-extern char *Name_pg_largeobject_indices[];
-extern char *Name_pg_namespace_indices[];
-extern char *Name_pg_opclass_indices[];
-extern char *Name_pg_operator_indices[];
-extern char *Name_pg_proc_indices[];
-extern char *Name_pg_rewrite_indices[];
-extern char *Name_pg_shadow_indices[];
-extern char *Name_pg_statistic_indices[];
-extern char *Name_pg_trigger_indices[];
-extern char *Name_pg_type_indices[];
 
+/*
+ * The state object used by CatalogOpenIndexes and friends is actually the
+ * same as the executor's ResultRelInfo, but we give it another type name
+ * to decouple callers from that fact.
+ */
+typedef struct ResultRelInfo *CatalogIndexState;
 
 /*
  * indexing.c prototypes
  */
-extern void CatalogOpenIndices(int nIndices, char **names, Relation *idescs);
-extern void CatalogCloseIndices(int nIndices, Relation *idescs);
-extern void CatalogIndexInsert(Relation *idescs, int nIndices,
-				   Relation heapRelation, HeapTuple heapTuple);
+extern CatalogIndexState CatalogOpenIndexes(Relation heapRel);
+extern void CatalogCloseIndexes(CatalogIndexState indstate);
+extern void CatalogIndexInsert(CatalogIndexState indstate,
+							   HeapTuple heapTuple);
+extern void CatalogUpdateIndexes(Relation heapRel, HeapTuple heapTuple);
 
 
 /*
@@ -221,7 +172,7 @@ DECLARE_UNIQUE_INDEX(pg_trigger_oid_index on pg_trigger using btree(oid oid_ops)
 DECLARE_UNIQUE_INDEX(pg_type_oid_index on pg_type using btree(oid oid_ops));
 DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index on pg_type using btree(typname name_ops, typnamespace oid_ops));
 
-/* last step of initialization script: build the indices declared above */
+/* last step of initialization script: build the indexes declared above */
 BUILD_INDICES
 
 #endif   /* INDEXING_H */