]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
BitmapHeapScan: postpone setting can_skip_fetch
authorTomas Vondra <tomas.vondra@postgresql.org>
Sat, 6 Apr 2024 21:56:46 +0000 (23:56 +0200)
committerTomas Vondra <tomas.vondra@postgresql.org>
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