From 3acca18d2869282890c180d176259d5e5fcbdd62 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sat, 25 Jun 2005 16:53:49 +0000
Subject: [PATCH] Fix ancient memory leak in index_create():
 RelationInitIndexAccessInfo was being called twice in normal operation,
 leading to a leak of one set of relcache subsidiary info.  Per report from
 Jeff Gold.

---
 src/backend/catalog/index.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index b7ad416c2b3..89ba99c4484 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.257 2005/06/20 02:07:47 neilc Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.258 2005/06/25 16:53:49 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -704,13 +704,21 @@ index_create(Oid heapRelationId,
 	}
 
 	/*
-	 * Fill in the index strategy structure with information from the
-	 * catalogs.  First we must advance the command counter so that we
-	 * will see the newly-entered index catalog tuples.
+	 * Advance the command counter so that we can see the newly-entered
+	 * catalog tuples for the index.
 	 */
 	CommandCounterIncrement();
 
-	RelationInitIndexAccessInfo(indexRelation);
+	/*
+	 * In bootstrap mode, we have to fill in the index strategy structure
+	 * with information from the catalogs.  If we aren't bootstrapping,
+	 * then the relcache entry has already been rebuilt thanks to sinval
+	 * update during CommandCounterIncrement.
+	 */
+	if (IsBootstrapProcessingMode())
+		RelationInitIndexAccessInfo(indexRelation);
+	else
+		Assert(indexRelation->rd_indexcxt != NULL);
 
 	/*
 	 * If this is bootstrap (initdb) time, then we don't actually fill in
-- 
GitLab