From c955ec08fe4feaab48b9ff63be57ecae0ca7f7bd Mon Sep 17 00:00:00 2001
From: Robert Haas <rhaas@postgresql.org>
Date: Thu, 2 May 2024 11:30:26 -0400
Subject: [PATCH 3/4] When enable_bitmapscan=false, just don't generate bitmap
 scan paths.

Previously, we generated them, and then added disable_cost to the
startup cost of each one. Not generating them at all is cheaper.
---
 src/backend/optimizer/path/costsize.c | 4 ++--
 src/backend/optimizer/path/indxpath.c | 6 ++++--
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c
index 74fc5aab56..f56b6efe34 100644
--- a/src/backend/optimizer/path/costsize.c
+++ b/src/backend/optimizer/path/costsize.c
@@ -1034,8 +1034,8 @@ cost_bitmap_heap_scan(Path *path, PlannerInfo *root, RelOptInfo *baserel,
 	else
 		path->rows = baserel->rows;
 
-	if (!enable_bitmapscan)
-		startup_cost += disable_cost;
+	/* shouldn't reach here if enable_bitmapscan = false */
+	Assert(enable_bitmapscan);
 
 	pages_fetched = compute_bitmap_pages(root, baserel, bitmapqual,
 										 loop_count, &indexTotalCost,
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c
index 423099d725..0f2f0c268f 100644
--- a/src/backend/optimizer/path/indxpath.c
+++ b/src/backend/optimizer/path/indxpath.c
@@ -332,7 +332,7 @@ create_index_paths(PlannerInfo *root, RelOptInfo *rel)
 	 * should be sufficient since there's basically only one figure of merit
 	 * (total cost) for such a path.
 	 */
-	if (bitindexpaths != NIL)
+	if (enable_bitmapscan && bitindexpaths != NIL)
 	{
 		Path	   *bitmapqual;
 		BitmapHeapPath *bpath;
@@ -357,7 +357,7 @@ create_index_paths(PlannerInfo *root, RelOptInfo *rel)
 	 * consider_index_join_clauses, but we're working with whole paths not
 	 * individual clauses.)
 	 */
-	if (bitjoinpaths != NIL)
+	if (enable_bitmapscan && bitjoinpaths != NIL)
 	{
 		List	   *all_path_outers;
 
@@ -843,6 +843,8 @@ build_index_paths(PlannerInfo *root, RelOptInfo *rel,
 		case ST_BITMAPSCAN:
 			if (!index->amhasgetbitmap)
 				return NIL;
+			if (!enable_bitmapscan)
+				return NIL;
 			break;
 		case ST_ANYSCAN:
 			/* either or both are OK */
-- 
2.39.3 (Apple Git-145)

