> 1. Why do we need scan->rs_nblocks =
>    RelationGextNumberOfBlocks(scan->rs_base.rs_rd) for every rescan, which
> looks
>    mismatched with the comments along the code. and the comments looks
>    reasonable to me.
> 2. For the heap scan after an IndexScan, we don't need to know the heap
>    size, then why do we need to get the nblocks for bitmap heap scan? I
> think the
>    similarity between the 2 is that both of them can get a "valid"
> CTID/pages number
>    from index scan.  To be clearer, I think for bitmap heap scan, we even
> don't
>    need check the RelationGextNumberOfBlocks for the initscan.
> 3. If we need to check nblocks every time,  why Parallel Scan doesn't
> change it
> every time?
>
> shall we remove the RelationGextNumberOfBlocks for bitmap heap scan totally
> and the rescan for normal heap scan?
>
>
yizhi.fzh@e18c07352 /u/y/g/postgres> git diff
diff --git a/src/backend/access/heap/heapam.c
b/src/backend/access/heap/heapam.c
index 6ac07f2fda..6df096fb46 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -246,7 +246,7 @@ initscan(HeapScanDesc scan, ScanKey key, bool
keep_startblock)
                bpscan = (ParallelBlockTableScanDesc)
scan->rs_base.rs_parallel;
                scan->rs_nblocks = bpscan->phs_nblocks;
        }
-       else
+       else if (scan->rs_nblocks == -1 && !(scan->rs_base.rs_flags &
SO_TYPE_BITMAPSCAN))
                scan->rs_nblocks =
RelationGetNumberOfBlocks(scan->rs_base.rs_rd);

        /*
@@ -1209,6 +1209,7 @@ heap_beginscan(Relation relation, Snapshot snapshot,
        scan->rs_base.rs_flags = flags;
        scan->rs_base.rs_parallel = parallel_scan;
        scan->rs_strategy = NULL;       /* set in initscan */
+       scan->rs_nblocks = -1;


I did the above hacks,  and all the existing tests passed.

>
-- 
Best Regards
Andy Fan (https://www.aliyun.com/)

Reply via email to