Teach reindex_index() to clear pg_index.indcheckxmin when possible.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 27 Mar 2009 15:57:11 +0000 (15:57 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 27 Mar 2009 15:57:11 +0000 (15:57 +0000)
Greg Stark, slightly modified by me.

src/backend/catalog/index.c

index 2d8024a7258fd42b1f3182f9bb35bd602c0c1cdb..641270784c3625a179043b5188fcdbf2b2d8a041 100644 (file)
@@ -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);
        }