|
|
|
@ -1423,13 +1423,6 @@ index_build(Relation heapRelation, |
|
|
|
HeapTuple indexTuple; |
|
|
|
HeapTuple indexTuple; |
|
|
|
Form_pg_index indexForm; |
|
|
|
Form_pg_index indexForm; |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
* Broken HOT chains should not get reported in system catalogs; in |
|
|
|
|
|
|
|
* particular it would be quite dangerous to try to modify the index's |
|
|
|
|
|
|
|
* pg_index entry if we are reindexing pg_index itself. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
Assert(!IsSystemRelation(heapRelation)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pg_index = heap_open(IndexRelationId, RowExclusiveLock); |
|
|
|
pg_index = heap_open(IndexRelationId, RowExclusiveLock); |
|
|
|
|
|
|
|
|
|
|
|
indexTuple = SearchSysCacheCopy(INDEXRELID, |
|
|
|
indexTuple = SearchSysCacheCopy(INDEXRELID, |
|
|
|
@ -1489,13 +1482,7 @@ index_build(Relation heapRelation, |
|
|
|
* A side effect is to set indexInfo->ii_BrokenHotChain to true if we detect |
|
|
|
* A side effect is to set indexInfo->ii_BrokenHotChain to true if we detect |
|
|
|
* any potentially broken HOT chains. Currently, we set this if there are |
|
|
|
* any potentially broken HOT chains. Currently, we set this if there are |
|
|
|
* any RECENTLY_DEAD entries in a HOT chain, without trying very hard to |
|
|
|
* any RECENTLY_DEAD entries in a HOT chain, without trying very hard to |
|
|
|
* detect whether they're really incompatible with the chain tip. However, |
|
|
|
* detect whether they're really incompatible with the chain tip. |
|
|
|
* we do not ever set ii_BrokenHotChain true when the relation is a system |
|
|
|
|
|
|
|
* catalog. This is to avoid problematic behavior when reindexing pg_index |
|
|
|
|
|
|
|
* itself: we can't safely change the index's indcheckxmin field when we're |
|
|
|
|
|
|
|
* partway through such an operation. It should be okay since the set of |
|
|
|
|
|
|
|
* indexes on a system catalog ought not change during concurrent operations, |
|
|
|
|
|
|
|
* so that no HOT chain in it could ever become broken. |
|
|
|
|
|
|
|
*/ |
|
|
|
*/ |
|
|
|
double |
|
|
|
double |
|
|
|
IndexBuildHeapScan(Relation heapRelation, |
|
|
|
IndexBuildHeapScan(Relation heapRelation, |
|
|
|
@ -1505,7 +1492,6 @@ IndexBuildHeapScan(Relation heapRelation, |
|
|
|
IndexBuildCallback callback, |
|
|
|
IndexBuildCallback callback, |
|
|
|
void *callback_state) |
|
|
|
void *callback_state) |
|
|
|
{ |
|
|
|
{ |
|
|
|
bool is_system_catalog; |
|
|
|
|
|
|
|
HeapScanDesc scan; |
|
|
|
HeapScanDesc scan; |
|
|
|
HeapTuple heapTuple; |
|
|
|
HeapTuple heapTuple; |
|
|
|
Datum values[INDEX_MAX_KEYS]; |
|
|
|
Datum values[INDEX_MAX_KEYS]; |
|
|
|
@ -1525,9 +1511,6 @@ IndexBuildHeapScan(Relation heapRelation, |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
Assert(OidIsValid(indexRelation->rd_rel->relam)); |
|
|
|
Assert(OidIsValid(indexRelation->rd_rel->relam)); |
|
|
|
|
|
|
|
|
|
|
|
/* Remember if it's a system catalog */ |
|
|
|
|
|
|
|
is_system_catalog = IsSystemRelation(heapRelation); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|
* Need an EState for evaluation of index expressions and partial-index |
|
|
|
* Need an EState for evaluation of index expressions and partial-index |
|
|
|
* predicates. Also a slot to hold the current tuple. |
|
|
|
* predicates. Also a slot to hold the current tuple. |
|
|
|
@ -1666,7 +1649,6 @@ IndexBuildHeapScan(Relation heapRelation, |
|
|
|
{ |
|
|
|
{ |
|
|
|
indexIt = false; |
|
|
|
indexIt = false; |
|
|
|
/* mark the index as unsafe for old snapshots */ |
|
|
|
/* mark the index as unsafe for old snapshots */ |
|
|
|
if (!is_system_catalog) |
|
|
|
|
|
|
|
indexInfo->ii_BrokenHotChain = true; |
|
|
|
indexInfo->ii_BrokenHotChain = true; |
|
|
|
} |
|
|
|
} |
|
|
|
else if (indexInfo->ii_BrokenHotChain) |
|
|
|
else if (indexInfo->ii_BrokenHotChain) |
|
|
|
@ -1756,7 +1738,6 @@ IndexBuildHeapScan(Relation heapRelation, |
|
|
|
{ |
|
|
|
{ |
|
|
|
indexIt = false; |
|
|
|
indexIt = false; |
|
|
|
/* mark the index as unsafe for old snapshots */ |
|
|
|
/* mark the index as unsafe for old snapshots */ |
|
|
|
if (!is_system_catalog) |
|
|
|
|
|
|
|
indexInfo->ii_BrokenHotChain = true; |
|
|
|
indexInfo->ii_BrokenHotChain = true; |
|
|
|
} |
|
|
|
} |
|
|
|
else if (indexInfo->ii_BrokenHotChain) |
|
|
|
else if (indexInfo->ii_BrokenHotChain) |
|
|
|
@ -2371,14 +2352,7 @@ reindex_index(Oid indexId) |
|
|
|
* We can also reset indcheckxmin, because we have now done a |
|
|
|
* We can also reset indcheckxmin, because we have now done a |
|
|
|
* non-concurrent index build, *except* in the case where index_build |
|
|
|
* non-concurrent index build, *except* in the case where index_build |
|
|
|
* found some still-broken HOT chains. |
|
|
|
* found some still-broken HOT chains. |
|
|
|
* |
|
|
|
|
|
|
|
* When reindexing a system catalog, don't do any of this --- it would be |
|
|
|
|
|
|
|
* particularly risky to try to modify pg_index while we are reindexing |
|
|
|
|
|
|
|
* pg_index itself. We don't support CREATE INDEX CONCURRENTLY on system |
|
|
|
|
|
|
|
* catalogs anyway, and they should never have indcheckxmin set either. |
|
|
|
|
|
|
|
*/ |
|
|
|
*/ |
|
|
|
if (!IsSystemRelation(heapRelation)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
pg_index = heap_open(IndexRelationId, RowExclusiveLock); |
|
|
|
pg_index = heap_open(IndexRelationId, RowExclusiveLock); |
|
|
|
|
|
|
|
|
|
|
|
indexTuple = SearchSysCacheCopy(INDEXRELID, |
|
|
|
indexTuple = SearchSysCacheCopy(INDEXRELID, |
|
|
|
@ -2399,7 +2373,6 @@ reindex_index(Oid indexId) |
|
|
|
CatalogUpdateIndexes(pg_index, indexTuple); |
|
|
|
CatalogUpdateIndexes(pg_index, indexTuple); |
|
|
|
} |
|
|
|
} |
|
|
|
heap_close(pg_index, RowExclusiveLock); |
|
|
|
heap_close(pg_index, RowExclusiveLock); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Close rels, but keep locks */ |
|
|
|
/* Close rels, but keep locks */ |
|
|
|
index_close(iRel, NoLock); |
|
|
|
index_close(iRel, NoLock); |
|
|
|
|