Re: Can rs_cindex be < 0 for bitmap heap scans? - Mailing list pgsql-hackers

From Dilip Kumar
Subject Re: Can rs_cindex be < 0 for bitmap heap scans?
Date
Msg-id CAFiTN-uQF_z0dr2p=8=ahHOgRpN=rLvtrK8pfh3eMm_M3TRj5w@mail.gmail.com
Whole thread Raw
Responses Re: Can rs_cindex be < 0 for bitmap heap scans?
List pgsql-hackers
On Thu, Oct 24, 2024 at 3:45 AM Melanie Plageman <melanieplageman@gmail.com> wrote:
Hi,

HeapScanDescData->rs_cindex (the current index into the array of
visible tuples stored in the heap scan descriptor) is used for
multiple scan types, but for bitmap heap scans, AFAICT, it should
never be < 0.

As such, I find this test in heapam_scan_bitmap_next_tuple() pretty confusing.

 if (hscan->rs_cindex < 0 || hscan->rs_cindex >= hscan->rs_ntuples)

I know it seems innocuous, but I find it pretty distracting. Am I
missing something? Could it somehow be < 0?

If not, I propose removing that part of the if statement like in the
attached patch.


You are right it can never be < 0 in this case at least.  In fact you don't need to explicitly set it to 0 in initscan[1], because before calling heapam_scan_bitmap_next_tuple() we must call heapam_scan_bitmap_next_block() and this function is initializing this to 0 (hscan->rs_cindex = 0;).  Anyway no object even if you prefer to initialize in initscan(), just the point is that we are already doing it for each block before fetching tuples from the block.

[1]
@@ -378,6 +378,7 @@ initscan(HeapScanDesc scan, ScanKey key, bool keep_startblock)
  ItemPointerSetInvalid(&scan->rs_ctup.t_self);
  scan->rs_cbuf = InvalidBuffer;
  scan->rs_cblock = InvalidBlockNumber;
+ scan->rs_cindex = 0;

--
Regards,
Dilip Kumar
EnterpriseDB: http://www.enterprisedb.com

pgsql-hackers by date:

Previous
From: Tender Wang
Date:
Subject: Re: Wrong result when enable_partitionwise_join is on if collation of PartitionKey and Column is different.
Next
From: Peter Smith
Date:
Subject: Re: Conflict detection for update_deleted in logical replication