BitmapHeapScan: postpone setting can_skip_fetch
authorTomas Vondra <[email protected]>
Sat, 6 Apr 2024 21:56:46 +0000 (23:56 +0200)
committerTomas Vondra <[email protected]>
Sat, 6 Apr 2024 21:56:49 +0000 (23:56 +0200)
Set BitmapHeapScanState->can_skip_fetch in BitmapHeapNext() instead of
in ExecInitBitmapHeapScan(). This is a preliminary step to pushing the
skip fetch optimization into heap AM code.

Author: Melanie Plageman
Reviewed-by: Tomas Vondra, Andres Freund, Heikki Linnakangas
Discussion: https://postgr.es/m/CAAKRu_ZwCwWFeL_H3ia26bP2e7HiKLWt0ZmGXPVwPO6uXq0vaA%40mail.gmail.com

src/backend/executor/nodeBitmapHeapscan.c

index c8c466e3c5c33916d6ccbe58a82fdb151f97d821..2148a21531af4768e428b7f0be857ca465558106 100644 (file)
@@ -105,6 +105,16 @@ BitmapHeapNext(BitmapHeapScanState *node)
     */
    if (!node->initialized)
    {
+       /*
+        * We can potentially skip fetching heap pages if we do not need any
+        * columns of the table, either for checking non-indexable quals or
+        * for returning data.  This test is a bit simplistic, as it checks
+        * the stronger condition that there's no qual or return tlist at all.
+        * But in most cases it's probably not worth working harder than that.
+        */
+       node->can_skip_fetch = (node->ss.ps.plan->qual == NIL &&
+                               node->ss.ps.plan->targetlist == NIL);
+
        if (!pstate)
        {
            tbm = (TIDBitmap *) MultiExecProcNode(outerPlanState(node));
@@ -743,16 +753,7 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags)
    scanstate->shared_tbmiterator = NULL;
    scanstate->shared_prefetch_iterator = NULL;
    scanstate->pstate = NULL;
-
-   /*
-    * We can potentially skip fetching heap pages if we do not need any
-    * columns of the table, either for checking non-indexable quals or for
-    * returning data.  This test is a bit simplistic, as it checks the
-    * stronger condition that there's no qual or return tlist at all.  But in
-    * most cases it's probably not worth working harder than that.
-    */
-   scanstate->can_skip_fetch = (node->scan.plan.qual == NIL &&
-                                node->scan.plan.targetlist == NIL);
+   scanstate->can_skip_fetch = false;
 
    /*
     * Miscellaneous initialization