88 *
99 *
1010 * IDENTIFICATION
11- * $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.313 2009/03/24 20:17:12 tgl Exp $
11+ * $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.314 2009/03/27 15:57:11 tgl Exp $
1212 *
1313 *
1414 * INTERFACE ROUTINES
@@ -2243,6 +2243,7 @@ reindex_index(Oid indexId)
22432243pg_index ;
22442244Oid heapId ;
22452245bool inplace ;
2246+ IndexInfo * indexInfo ;
22462247HeapTuple indexTuple ;
22472248Form_pg_index indexForm ;
22482249
@@ -2293,8 +2294,6 @@ reindex_index(Oid indexId)
22932294
22942295PG_TRY ();
22952296{
2296- IndexInfo * indexInfo ;
2297-
22982297/* Suppress use of the target index while rebuilding it */
22992298SetReindexProcessing (heapId ,indexId );
23002299
@@ -2333,6 +2332,10 @@ reindex_index(Oid indexId)
23332332 * If the index is marked invalid or not ready (ie, it's from a failed
23342333 * CREATE INDEX CONCURRENTLY), we can now mark it valid. This allows
23352334 * REINDEX to be used to clean up in such cases.
2335+ *
2336+ * We can also reset indcheckxmin, because we have now done a
2337+ * non-concurrent index build, *except* in the case where index_build
2338+ * found some still-broken HOT chains.
23362339 */
23372340pg_index = heap_open (IndexRelationId ,RowExclusiveLock );
23382341
@@ -2343,10 +2346,13 @@ reindex_index(Oid indexId)
23432346elog (ERROR ,"cache lookup failed for index %u" ,indexId );
23442347indexForm = (Form_pg_index )GETSTRUCT (indexTuple );
23452348
2346- if (!indexForm -> indisvalid || !indexForm -> indisready )
2349+ if (!indexForm -> indisvalid || !indexForm -> indisready ||
2350+ (indexForm -> indcheckxmin && !indexInfo -> ii_BrokenHotChain ))
23472351{
23482352indexForm -> indisvalid = true;
23492353indexForm -> indisready = true;
2354+ if (!indexInfo -> ii_BrokenHotChain )
2355+ indexForm -> indcheckxmin = false;
23502356simple_heap_update (pg_index ,& indexTuple -> t_self ,indexTuple );
23512357CatalogUpdateIndexes (pg_index ,indexTuple );
23522358}