diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 5a57702e914..bf41e9f53d3 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -5181,8 +5181,10 @@ RelationGetIndexAttrBitmap(Relation relation, IndexAttrBitmapKind attrKind) 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 */ - Bitmapset *summarizedattrs; /* columns with summarizing indexes */ + Bitmapset *hotblockingattrs; /* columns with HOT blocking indexes */ + Bitmapset *hotblockingexprattrs; /* as above, but only those in expressions */ + Bitmapset *summarizedattrs; /* columns with summarizing indexes */ + Bitmapset *summarizedexprattrs; /* as above, but only those in expressions */ List *indexoidlist; List *newindexoidlist; Oid relpkindex; @@ -5248,7 +5250,9 @@ restart: pkindexattrs = NULL; idindexattrs = NULL; hotblockingattrs = NULL; + hotblockingexprattrs = NULL; summarizedattrs = NULL; + summarizedexprattrs = NULL; foreach(l, indexoidlist) { Oid indexOid = lfirst_oid(l); @@ -5262,6 +5266,7 @@ restart: bool isPK; /* primary key */ bool isIDKey; /* replica identity index */ Bitmapset **attrs; + Bitmapset **exprattrs; indexDesc = index_open(indexOid, AccessShareLock); @@ -5305,9 +5310,15 @@ restart: * decide which bitmap we'll update in the following loop. */ if (indexDesc->rd_indam->amsummarizing) + { attrs = &summarizedattrs; + exprattrs = &summarizedexprattrs; + } else + { attrs = &hotblockingattrs; + exprattrs = &hotblockingexprattrs; + } /* Collect simple attribute references */ for (i = 0; i < indexDesc->rd_index->indnatts; i++) @@ -5348,10 +5359,10 @@ restart: } /* Collect all attributes used in expressions, too */ - pull_varattnos(indexExpressions, 1, attrs); + pull_varattnos(indexExpressions, 1, exprattrs); /* Collect all attributes in the index predicate, too */ - pull_varattnos(indexPredicate, 1, attrs); + pull_varattnos(indexPredicate, 1, exprattrs); index_close(indexDesc, AccessShareLock); } @@ -5380,11 +5391,25 @@ restart: bms_free(pkindexattrs); bms_free(idindexattrs); bms_free(hotblockingattrs); + bms_free(hotblockingexprattrs); bms_free(summarizedattrs); + bms_free(summarizedexprattrs); goto restart; } + /* {expression-only columns} = {expression columns} - {direct columns} */ + hotblockingexprattrs = bms_del_members(hotblockingexprattrs, + hotblockingattrs); + /* {all columns} = {direct columns} + {expression-only columns} */ + hotblockingattrs = bms_add_members(hotblockingattrs, + hotblockingexprattrs); + + summarizedexprattrs = bms_del_members(summarizedexprattrs, + summarizedattrs); + summarizedattrs = bms_add_members(summarizedattrs, + summarizedexprattrs); + /* Don't leak the old values of these bitmaps, if any */ relation->rd_attrsvalid = false; bms_free(relation->rd_keyattr);