Re: Can rs_cindex be < 0 for bitmap heap scans?
Dilip Kumar <dilipbalaut@gmail.com>
From: Dilip Kumar <dilipbalaut@gmail.com>
To: Melanie Plageman <melanieplageman@gmail.com>
Cc: Pg Hackers <pgsql-hackers@postgresql.org>, Tomas Vondra <tv@fuzzy.cz>
Date: 2024-10-24T04:50:34Z
Lists: 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
Commits
-
Fix overflow danger in SampleHeapTupleVisible(), take 2
- 94bb6c4410d8 18.0 landed
-
Fix overflow danger in SampleHeapTupleVisible()
- 28328ec87b45 18.0 landed
-
Make rs_cindex and rs_ntuples unsigned
- 68d9662be1c4 18.0 landed