diff options
author | Melanie Plageman | 2025-03-15 14:10:51 +0000 |
---|---|---|
committer | Melanie Plageman | 2025-03-15 14:11:19 +0000 |
commit | 944e81bf99db2b5b70b8a389d4f273534da73f74 (patch) | |
tree | aef5b3e8d864fcdccc81ea1688b7a1ab8e7fbdf1 /src/backend/access/gin | |
parent | 799959dc7cf0e2462601bea8d07b6edec3fa0c4f (diff) |
Separate TBM[Shared|Private]Iterator and TBMIterateResult
Remove the TBMIterateResult member from the TBMPrivateIterator and
TBMSharedIterator and make tbm_[shared|private_]iterate() take a
TBMIterateResult as a parameter.
This allows tidbitmap API users to manage multiple TBMIterateResults per
scan. This is required for bitmap heap scan to use the read stream API,
with which there may be multiple I/Os in flight at once, each one with a
TBMIterateResult.
Reviewed-by: Tomas Vondra <[email protected]>
Discussion: https://postgr.es/m/d4bb26c9-fe07-439e-ac53-c0e244387e01%40vondra.me
Diffstat (limited to 'src/backend/access/gin')
-rw-r--r-- | src/backend/access/gin/ginget.c | 33 | ||||
-rw-r--r-- | src/backend/access/gin/ginscan.c | 2 |
2 files changed, 17 insertions, 18 deletions
diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c index 4a56f19390d..f29ccd3c2d1 100644 --- a/src/backend/access/gin/ginget.c +++ b/src/backend/access/gin/ginget.c @@ -332,8 +332,8 @@ restartScanEntry: entry->list = NULL; entry->nlist = 0; entry->matchBitmap = NULL; - entry->matchResult = NULL; entry->matchNtuples = -1; + entry->matchResult.blockno = InvalidBlockNumber; entry->reduceResult = false; entry->predictNumberResult = 0; @@ -827,20 +827,19 @@ entryGetItem(GinState *ginstate, GinScanEntry entry, { /* * If we've exhausted all items on this block, move to next block - * in the bitmap. + * in the bitmap. tbm_private_iterate() sets matchResult.blockno + * to InvalidBlockNumber when the bitmap is exhausted. */ - while (entry->matchResult == NULL || - (!entry->matchResult->lossy && + while ((!BlockNumberIsValid(entry->matchResult.blockno)) || + (!entry->matchResult.lossy && entry->offset >= entry->matchNtuples) || - entry->matchResult->blockno < advancePastBlk || + entry->matchResult.blockno < advancePastBlk || (ItemPointerIsLossyPage(&advancePast) && - entry->matchResult->blockno == advancePastBlk)) + entry->matchResult.blockno == advancePastBlk)) { - entry->matchResult = - tbm_private_iterate(entry->matchIterator); - - if (entry->matchResult == NULL) + if (!tbm_private_iterate(entry->matchIterator, &entry->matchResult)) { + Assert(!BlockNumberIsValid(entry->matchResult.blockno)); ItemPointerSetInvalid(&entry->curItem); tbm_end_private_iterate(entry->matchIterator); entry->matchIterator = NULL; @@ -849,14 +848,14 @@ entryGetItem(GinState *ginstate, GinScanEntry entry, } /* Exact pages need their tuple offsets extracted. */ - if (!entry->matchResult->lossy) - entry->matchNtuples = tbm_extract_page_tuple(entry->matchResult, + if (!entry->matchResult.lossy) + entry->matchNtuples = tbm_extract_page_tuple(&entry->matchResult, entry->matchOffsets, TBM_MAX_TUPLES_PER_PAGE); /* * Reset counter to the beginning of entry->matchResult. Note: - * entry->offset is still greater than entry->matchNtuples if + * entry->offset is still greater than matchResult.ntuples if * matchResult is lossy. So, on next call we will get next * result from TIDBitmap. */ @@ -869,10 +868,10 @@ entryGetItem(GinState *ginstate, GinScanEntry entry, * We're now on the first page after advancePast which has any * items on it. If it's a lossy result, return that. */ - if (entry->matchResult->lossy) + if (entry->matchResult.lossy) { ItemPointerSetLossyPage(&entry->curItem, - entry->matchResult->blockno); + entry->matchResult.blockno); /* * We might as well fall out of the loop; we could not @@ -889,7 +888,7 @@ entryGetItem(GinState *ginstate, GinScanEntry entry, Assert(entry->matchNtuples > -1); /* Skip over any offsets <= advancePast, and return that. */ - if (entry->matchResult->blockno == advancePastBlk) + if (entry->matchResult.blockno == advancePastBlk) { Assert(entry->matchNtuples > 0); @@ -910,7 +909,7 @@ entryGetItem(GinState *ginstate, GinScanEntry entry, } ItemPointerSet(&entry->curItem, - entry->matchResult->blockno, + entry->matchResult.blockno, entry->matchOffsets[entry->offset]); entry->offset++; diff --git a/src/backend/access/gin/ginscan.c b/src/backend/access/gin/ginscan.c index f6cdd098a02..c2d1771bd77 100644 --- a/src/backend/access/gin/ginscan.c +++ b/src/backend/access/gin/ginscan.c @@ -111,7 +111,7 @@ ginFillScanEntry(GinScanOpaque so, OffsetNumber attnum, ItemPointerSetMin(&scanEntry->curItem); scanEntry->matchBitmap = NULL; scanEntry->matchIterator = NULL; - scanEntry->matchResult = NULL; + scanEntry->matchResult.blockno = InvalidBlockNumber; scanEntry->matchNtuples = -1; scanEntry->list = NULL; scanEntry->nlist = 0; |