BitmapHeapScan: begin scan after bitmap creation
authorTomas Vondra <[email protected]>
Sat, 6 Apr 2024 20:57:58 +0000 (22:57 +0200)
committerTomas Vondra <[email protected]>
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.
     */