diff options
author | Melanie Plageman <melanieplageman@gmail.com> | 2025-03-15 10:10:51 -0400 |
---|---|---|
committer | Melanie Plageman <melanieplageman@gmail.com> | 2025-03-15 10:11:19 -0400 |
commit | 944e81bf99db2b5b70b8a389d4f273534da73f74 (patch) | |
tree | aef5b3e8d864fcdccc81ea1688b7a1ab8e7fbdf1 /src/backend/access/heap/heapam_handler.c | |
parent | 799959dc7cf0e2462601bea8d07b6edec3fa0c4f (diff) | |
download | postgresql-944e81bf99db2b5b70b8a389d4f273534da73f74.tar.gz postgresql-944e81bf99db2b5b70b8a389d4f273534da73f74.zip |
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 <tomas@vondra.me>
Discussion: https://postgr.es/m/d4bb26c9-fe07-439e-ac53-c0e244387e01%40vondra.me
Diffstat (limited to 'src/backend/access/heap/heapam_handler.c')
-rw-r--r-- | src/backend/access/heap/heapam_handler.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index eecff8ffd67..25d26409e2c 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -2126,7 +2126,7 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, Buffer buffer; Snapshot snapshot; int ntup; - TBMIterateResult *tbmres; + TBMIterateResult tbmres; OffsetNumber offsets[TBM_MAX_TUPLES_PER_PAGE]; int noffsets = -1; @@ -2142,14 +2142,12 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, { CHECK_FOR_INTERRUPTS(); - tbmres = tbm_iterate(&scan->st.rs_tbmiterator); - - if (tbmres == NULL) + if (!tbm_iterate(&scan->st.rs_tbmiterator, &tbmres)) return false; /* Exact pages need their tuple offsets extracted. */ - if (!tbmres->lossy) - noffsets = tbm_extract_page_tuple(tbmres, offsets, + if (!tbmres.lossy) + noffsets = tbm_extract_page_tuple(&tbmres, offsets, TBM_MAX_TUPLES_PER_PAGE); /* @@ -2161,11 +2159,11 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, * reachable by the index. */ } while (!IsolationIsSerializable() && - tbmres->blockno >= hscan->rs_nblocks); + tbmres.blockno >= hscan->rs_nblocks); /* Got a valid block */ - *blockno = tbmres->blockno; - *recheck = tbmres->recheck; + *blockno = tbmres.blockno; + *recheck = tbmres.recheck; /* * We can skip fetching the heap page if we don't need any fields from the @@ -2173,11 +2171,11 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, * page are visible to our transaction. */ if (!(scan->rs_flags & SO_NEED_TUPLES) && - !tbmres->recheck && - VM_ALL_VISIBLE(scan->rs_rd, tbmres->blockno, &bscan->rs_vmbuffer)) + !tbmres.recheck && + VM_ALL_VISIBLE(scan->rs_rd, tbmres.blockno, &bscan->rs_vmbuffer)) { /* can't be lossy in the skip_fetch case */ - Assert(!tbmres->lossy); + Assert(!tbmres.lossy); Assert(bscan->rs_empty_tuples_pending >= 0); Assert(noffsets > -1); @@ -2186,7 +2184,7 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, return true; } - block = tbmres->blockno; + block = tbmres.blockno; /* * Acquire pin on the target heap page, trading in any pin we held before. @@ -2215,7 +2213,7 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, /* * We need two separate strategies for lossy and non-lossy cases. */ - if (!tbmres->lossy) + if (!tbmres.lossy) { /* * Bitmap is non-lossy, so we just look through the offsets listed in @@ -2279,7 +2277,7 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, Assert(ntup <= MaxHeapTuplesPerPage); hscan->rs_ntuples = ntup; - if (tbmres->lossy) + if (tbmres.lossy) (*lossy_pages)++; else (*exact_pages)++; |