BitmapHeapScan: begin scan after bitmap creation
authorTomas Vondra <tomas.vondra@postgresql.org>
Sat, 6 Apr 2024 20:57:58 +0000 (22:57 +0200)
committerTomas Vondra <tomas.vondra@postgresql.org>
Sat, 6 Apr 2024 20:58:04 +0000 (22:58 +0200)
Change the order so that the table scan is initialized only after
initializing the index scan and building the bitmap.

This is mostly a cosmetic change for now, but later commits will need
to pass parameters to table_beginscan_bm() that are unavailable in
ExecInitBitmapHeapScan().

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 cee7f45aabec12040abf0a71eeae46cd3e5991c7..c8c466e3c5c33916d6ccbe58a82fdb151f97d821 100644 (file)
@@ -178,6 +178,21 @@ BitmapHeapNext(BitmapHeapScanState *node)
                        }
 #endif                                                 /* USE_PREFETCH */
                }
+
+               /*
+                * If this is the first scan of the underlying table, create the table
+                * scan descriptor and begin the scan.
+                */
+               if (!scan)
+               {
+                       scan = table_beginscan_bm(node->ss.ss_currentRelation,
+                                                                         node->ss.ps.state->es_snapshot,
+                                                                         0,
+                                                                         NULL);
+
+                       node->ss.ss_currentScanDesc = scan;
+               }
+
                node->initialized = true;
        }
 
@@ -601,7 +616,8 @@ ExecReScanBitmapHeapScan(BitmapHeapScanState *node)
        PlanState  *outerPlan = outerPlanState(node);
 
        /* rescan to release any page pin */
-       table_rescan(node->ss.ss_currentScanDesc, NULL);
+       if (node->ss.ss_currentScanDesc)
+               table_rescan(node->ss.ss_currentScanDesc, NULL);
 
        /* release bitmaps and buffers if any */
        if (node->tbmiterator)
@@ -678,7 +694,9 @@ ExecEndBitmapHeapScan(BitmapHeapScanState *node)
        /*
         * close heap scan
         */
-       table_endscan(scanDesc);
+       if (scanDesc)
+               table_endscan(scanDesc);
+
 }
 
 /* ----------------------------------------------------------------
@@ -783,11 +801,6 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags)
 
        scanstate->ss.ss_currentRelation = currentRelation;
 
-       scanstate->ss.ss_currentScanDesc = table_beginscan_bm(currentRelation,
-                                                                                                                 estate->es_snapshot,
-                                                                                                                 0,
-                                                                                                                 NULL);
-
        /*
         * all done.
         */