From a95307b639ad94fb94c898eb6b4a3c95c407bf44 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 27 Mar 2009 15:57:11 +0000
Subject: [PATCH] Teach reindex_index() to clear pg_index.indcheckxmin when
 possible. Greg Stark, slightly modified by me.

---
 src/backend/catalog/index.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index d1889e16c2c..86ff1f7929e 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.313 2009/03/24 20:17:12 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.314 2009/03/27 15:57:11 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -2243,6 +2243,7 @@ reindex_index(Oid indexId)
 				pg_index;
 	Oid			heapId;
 	bool		inplace;
+	IndexInfo  *indexInfo;
 	HeapTuple	indexTuple;
 	Form_pg_index indexForm;
 
@@ -2293,8 +2294,6 @@ reindex_index(Oid indexId)
 
 	PG_TRY();
 	{
-		IndexInfo  *indexInfo;
-
 		/* Suppress use of the target index while rebuilding it */
 		SetReindexProcessing(heapId, indexId);
 
@@ -2333,6 +2332,10 @@ reindex_index(Oid indexId)
 	 * If the index is marked invalid or not ready (ie, it's from a failed
 	 * CREATE INDEX CONCURRENTLY), we can now mark it valid.  This allows
 	 * REINDEX to be used to clean up in such cases.
+	 *
+	 * We can also reset indcheckxmin, because we have now done a
+	 * non-concurrent index build, *except* in the case where index_build
+	 * found some still-broken HOT chains.
 	 */
 	pg_index = heap_open(IndexRelationId, RowExclusiveLock);
 
@@ -2343,10 +2346,13 @@ reindex_index(Oid indexId)
 		elog(ERROR, "cache lookup failed for index %u", indexId);
 	indexForm = (Form_pg_index) GETSTRUCT(indexTuple);
 
-	if (!indexForm->indisvalid || !indexForm->indisready)
+	if (!indexForm->indisvalid || !indexForm->indisready ||
+		(indexForm->indcheckxmin && !indexInfo->ii_BrokenHotChain))
 	{
 		indexForm->indisvalid = true;
 		indexForm->indisready = true;
+		if (!indexInfo->ii_BrokenHotChain)
+			indexForm->indcheckxmin = false;
 		simple_heap_update(pg_index, &indexTuple->t_self, indexTuple);
 		CatalogUpdateIndexes(pg_index, indexTuple);
 	}
-- 
GitLab