Make rs_cindex and rs_ntuples unsigned
authorMelanie Plageman <melanieplageman@gmail.com>
Wed, 18 Dec 2024 16:47:38 +0000 (11:47 -0500)
committerMelanie Plageman <melanieplageman@gmail.com>
Wed, 18 Dec 2024 16:47:38 +0000 (11:47 -0500)
HeapScanDescData.rs_cindex and rs_ntuples can't be less than 0. All scan
types using the heap scan descriptor expect these values to be >= 0.
Make that expectation clear by making rs_cindex and rs_ntuples unsigned.

Also remove the test in heapam_scan_bitmap_next_tuple() that checks if
rs_cindex < 0. This was never true, but now that rs_cindex is unsigned,
it makes even less sense.

While we are at it, initialize both rs_cindex and rs_ntuples to 0 in
initscan().

Author: Melanie Plageman
Reviewed-by: Dilip Kumar
Discussion: https://postgr.es/m/CAAKRu_ZxF8cDCM_BFi_L-t%3DRjdCZYP1usd1Gd45mjHfZxm0nZw%40mail.gmail.com

src/backend/access/heap/heapam.c
src/backend/access/heap/heapam_handler.c
src/include/access/heapam.h

index d00300c5dcbcba170e83dd6e52bcd637e782fe82..6cdc68d981a47927156ec72c18eeee3bfab85c93 100644 (file)
@@ -378,6 +378,8 @@ initscan(HeapScanDesc scan, ScanKey key, bool keep_startblock)
        ItemPointerSetInvalid(&scan->rs_ctup.t_self);
        scan->rs_cbuf = InvalidBuffer;
        scan->rs_cblock = InvalidBlockNumber;
+       scan->rs_ntuples = 0;
+       scan->rs_cindex = 0;
 
        /*
         * Initialize to ForwardScanDirection because it is most common and
@@ -943,8 +945,8 @@ heapgettup_pagemode(HeapScanDesc scan,
 {
        HeapTuple       tuple = &(scan->rs_ctup);
        Page            page;
-       int                     lineindex;
-       int                     linesleft;
+       uint32          lineindex;
+       uint32          linesleft;
 
        if (likely(scan->rs_inited))
        {
@@ -989,6 +991,7 @@ continue_page:
                        ItemId          lpp;
                        OffsetNumber lineoff;
 
+                       Assert(lineindex <= scan->rs_ntuples);
                        lineoff = scan->rs_vistuples[lineindex];
                        lpp = PageGetItemId(page, lineoff);
                        Assert(ItemIdIsNormal(lpp));
index a8d95e0f1c1a0a7c3f220e08103eeb870b4abbc2..d0e5922eed78acacd93628c9d37c1802f6d53927 100644 (file)
@@ -2303,7 +2303,7 @@ heapam_scan_bitmap_next_tuple(TableScanDesc scan,
        /*
         * Out of range?  If so, nothing more to look at on this page
         */
-       if (hscan->rs_cindex < 0 || hscan->rs_cindex >= hscan->rs_ntuples)
+       if (hscan->rs_cindex >= hscan->rs_ntuples)
                return false;
 
        targoffset = hscan->rs_vistuples[hscan->rs_cindex];
index 96cf82f97b754bffb9128942e3e8fd313238f96c..04afb1a6a66d71f24ee2b3d874de559467027a9b 100644 (file)
@@ -103,8 +103,8 @@ typedef struct HeapScanDescData
        int                     rs_empty_tuples_pending;
 
        /* these fields only used in page-at-a-time mode and for bitmap scans */
-       int                     rs_cindex;              /* current tuple's index in vistuples */
-       int                     rs_ntuples;             /* number of visible tuples on page */
+       uint32          rs_cindex;              /* current tuple's index in vistuples */
+       uint32          rs_ntuples;             /* number of visible tuples on page */
        OffsetNumber rs_vistuples[MaxHeapTuplesPerPage];        /* their offsets */
 }                      HeapScanDescData;
 typedef struct HeapScanDescData *HeapScanDesc;