@ -2428,10 +2428,10 @@ RelationDestroyRelation(Relation relation, bool remember_tupdesc)
list_free_deep ( relation - > rd_fkeylist ) ;
list_free ( relation - > rd_indexlist ) ;
list_free ( relation - > rd_statlist ) ;
bms_free ( relation - > rd_indexattr ) ;
bms_free ( relation - > rd_keyattr ) ;
bms_free ( relation - > rd_pkattr ) ;
bms_free ( relation - > rd_idattr ) ;
bms_free ( relation - > rd_hotblockingattr ) ;
if ( relation - > rd_pubactions )
pfree ( relation - > rd_pubactions ) ;
if ( relation - > rd_options )
@ -5105,10 +5105,10 @@ RelationGetIndexPredicate(Relation relation)
Bitmapset *
RelationGetIndexAttrBitmap ( Relation relation , IndexAttrBitmapKind attrKind )
{
Bitmapset * indexattrs ; /* indexed columns */
Bitmapset * uindexattrs ; /* columns in unique indexes */
Bitmapset * pkindexattrs ; /* columns in the primary index */
Bitmapset * idindexattrs ; /* columns in the replica identity */
Bitmapset * hotblockingattrs ; /* columns with HOT blocking indexes */
List * indexoidlist ;
List * newindexoidlist ;
Oid relpkindex ;
@ -5117,18 +5117,18 @@ RelationGetIndexAttrBitmap(Relation relation, IndexAttrBitmapKind attrKind)
MemoryContext oldcxt ;
/* Quick exit if we already computed the result. */
if ( relation - > rd_indexattr ! = NULL )
if ( relation - > rd_attrsvalid )
{
switch ( attrKind )
{
case INDEX_ATTR_BITMAP_ALL :
return bms_copy ( relation - > rd_indexattr ) ;
case INDEX_ATTR_BITMAP_KEY :
return bms_copy ( relation - > rd_keyattr ) ;
case INDEX_ATTR_BITMAP_PRIMARY_KEY :
return bms_copy ( relation - > rd_pkattr ) ;
case INDEX_ATTR_BITMAP_IDENTITY_KEY :
return bms_copy ( relation - > rd_idattr ) ;
case INDEX_ATTR_BITMAP_HOT_BLOCKING :
return bms_copy ( relation - > rd_hotblockingattr ) ;
default :
elog ( ERROR , " unknown attrKind %u " , attrKind ) ;
}
@ -5159,7 +5159,7 @@ restart:
relreplindex = relation - > rd_replidindex ;
/*
* For each index , add referenced attributes to indexattr s.
* For each index , add referenced attributes to appropriate bitmap s.
*
* Note : we consider all indexes returned by RelationGetIndexList , even if
* they are not indisready or indisvalid . This is important because an
@ -5168,10 +5168,10 @@ restart:
* CONCURRENTLY is far enough along that we should ignore the index , it
* won ' t be returned at all by RelationGetIndexList .
*/
indexattrs = NULL ;
uindexattrs = NULL ;
pkindexattrs = NULL ;
idindexattrs = NULL ;
hotblockingattrs = NULL ;
foreach ( l , indexoidlist )
{
Oid indexOid = lfirst_oid ( l ) ;
@ -5236,7 +5236,8 @@ restart:
*/
if ( attrnum ! = 0 )
{
indexattrs = bms_add_member ( indexattrs ,
if ( indexDesc - > rd_indam - > amhotblocking )
hotblockingattrs = bms_add_member ( hotblockingattrs ,
attrnum - FirstLowInvalidHeapAttributeNumber ) ;
if ( isKey & & i < indexDesc - > rd_index - > indnkeyatts )
@ -5254,10 +5255,15 @@ restart:
}
/* Collect all attributes used in expressions, too */
pull_varattnos ( indexExpressions , 1 , & indexattrs ) ;
if ( indexDesc - > rd_indam - > amhotblocking )
pull_varattnos ( indexExpressions , 1 , & hotblockingattrs ) ;
/* Collect all attributes in the index predicate, too */
pull_varattnos ( indexPredicate , 1 , & indexattrs ) ;
/*
* Collect all attributes in the index predicate , too . We have to ignore
* amhotblocking flag , because the row might become indexable , in which
* case we have to add it to the index .
*/
pull_varattnos ( indexPredicate , 1 , & hotblockingattrs ) ;
index_close ( indexDesc , AccessShareLock ) ;
}
@ -5285,25 +5291,25 @@ restart:
bms_free ( uindexattrs ) ;
bms_free ( pkindexattrs ) ;
bms_free ( idindexattrs ) ;
bms_free ( index attrs) ;
bms_free ( hotblocking attrs) ;
goto restart ;
}
/* Don't leak the old values of these bitmaps, if any */
bms_free ( relation - > rd_indexattr ) ;
relation - > rd_indexattr = NULL ;
bms_free ( relation - > rd_keyattr ) ;
relation - > rd_keyattr = NULL ;
bms_free ( relation - > rd_pkattr ) ;
relation - > rd_pkattr = NULL ;
bms_free ( relation - > rd_idattr ) ;
relation - > rd_idattr = NULL ;
bms_free ( relation - > rd_hotblockingattr ) ;
relation - > rd_hotblockingattr = NULL ;
/*
* Now save copies of the bitmaps in the relcache entry . We intentionally
* set rd_index attr last , because that ' s the one t hat signals validity of
* the values ; if we run out of memory before making that copy , we won ' t
* set rd_attrsvalid last , because that ' s w hat signals validity of the
* values ; if we run out of memory before making that copy , we won ' t
* leave the relcache entry looking like the other ones are valid but
* empty .
*/
@ -5311,20 +5317,21 @@ restart:
relation - > rd_keyattr = bms_copy ( uindexattrs ) ;
relation - > rd_pkattr = bms_copy ( pkindexattrs ) ;
relation - > rd_idattr = bms_copy ( idindexattrs ) ;
relation - > rd_indexattr = bms_copy ( indexattrs ) ;
relation - > rd_hotblockingattr = bms_copy ( hotblockingattrs ) ;
relation - > rd_attrsvalid = true ;
MemoryContextSwitchTo ( oldcxt ) ;
/* We return our original working copy for caller to play with */
switch ( attrKind )
{
case INDEX_ATTR_BITMAP_ALL :
return indexattrs ;
case INDEX_ATTR_BITMAP_KEY :
return uindexattrs ;
case INDEX_ATTR_BITMAP_PRIMARY_KEY :
return pkindexattrs ;
case INDEX_ATTR_BITMAP_IDENTITY_KEY :
return idindexattrs ;
case INDEX_ATTR_BITMAP_HOT_BLOCKING :
return hotblockingattrs ;
default :
elog ( ERROR , " unknown attrKind %u " , attrKind ) ;
return NULL ;
@ -6180,10 +6187,11 @@ load_relcache_init_file(bool shared)
rel - > rd_indexlist = NIL ;
rel - > rd_pkindex = InvalidOid ;
rel - > rd_replidindex = InvalidOid ;
rel - > rd_index attr = NULL ;
rel - > rd_attrsvalid = false ;
rel - > rd_keyattr = NULL ;
rel - > rd_pkattr = NULL ;
rel - > rd_idattr = NULL ;
rel - > rd_hotblockingattr = NULL ;
rel - > rd_pubactions = NULL ;
rel - > rd_statvalid = false ;
rel - > rd_statlist = NIL ;