@ -2439,10 +2439,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_pubdesc )
pfree ( relation - > rd_pubdesc ) ;
if ( relation - > rd_options )
@ -5104,10 +5104,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 ;
@ -5116,18 +5116,18 @@ RelationGetIndexAttrBitmap(Relation relation, IndexAttrBitmapKind attrKind)
MemoryContext oldcxt ;
/* Quick exit if we already computed the result. */
if ( relation - > rd_attrsvalid )
if ( relation - > rd_indexattr ! = NULL )
{
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 ) ;
}
@ -5158,7 +5158,7 @@ restart:
relreplindex = relation - > rd_replidindex ;
/*
* For each index , add referenced attributes to appropriate bitmap s.
* For each index , add referenced attributes to indexattr s.
*
* Note : we consider all indexes returned by RelationGetIndexList , even if
* they are not indisready or indisvalid . This is important because an
@ -5167,10 +5167,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 ) ;
@ -5235,9 +5235,8 @@ restart:
*/
if ( attrnum ! = 0 )
{
if ( indexDesc - > rd_indam - > amhotblocking )
hotblockingattrs = bms_add_member ( hotblockingattrs ,
attrnum - FirstLowInvalidHeapAttributeNumber ) ;
indexattrs = bms_add_member ( indexattrs ,
attrnum - FirstLowInvalidHeapAttributeNumber ) ;
if ( isKey & & i < indexDesc - > rd_index - > indnkeyatts )
uindexattrs = bms_add_member ( uindexattrs ,
@ -5254,15 +5253,10 @@ restart:
}
/* Collect all attributes used in expressions, too */
if ( indexDesc - > rd_indam - > amhotblocking )
pull_varattnos ( indexExpressions , 1 , & hotblockingattrs ) ;
pull_varattnos ( indexExpressions , 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 ) ;
/* Collect all attributes in the index predicate, too */
pull_varattnos ( indexPredicate , 1 , & indexattrs ) ;
index_close ( indexDesc , AccessShareLock ) ;
}
@ -5290,46 +5284,46 @@ restart:
bms_free ( uindexattrs ) ;
bms_free ( pkindexattrs ) ;
bms_free ( idindexattrs ) ;
bms_free ( hotblocking attrs) ;
bms_free ( index 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_attrsvalid last , because that ' s what 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 .
* set rd_indexattr last , because that ' s the one that 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 .
*/
oldcxt = MemoryContextSwitchTo ( CacheMemoryContext ) ;
relation - > rd_keyattr = bms_copy ( uindexattrs ) ;
relation - > rd_pkattr = bms_copy ( pkindexattrs ) ;
relation - > rd_idattr = bms_copy ( idindexattrs ) ;
relation - > rd_hotblockingattr = bms_copy ( hotblockingattrs ) ;
relation - > rd_attrsvalid = true ;
relation - > rd_indexattr = bms_copy ( indexattrs ) ;
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 ;
@ -6250,11 +6244,10 @@ load_relcache_init_file(bool shared)
rel - > rd_indexlist = NIL ;
rel - > rd_pkindex = InvalidOid ;
rel - > rd_replidindex = InvalidOid ;
rel - > rd_attrsvalid = false ;
rel - > rd_index attr = NULL ;
rel - > rd_keyattr = NULL ;
rel - > rd_pkattr = NULL ;
rel - > rd_idattr = NULL ;
rel - > rd_hotblockingattr = NULL ;
rel - > rd_pubdesc = NULL ;
rel - > rd_statvalid = false ;
rel - > rd_statlist = NIL ;