OSDN Git Service

Fix bogus EXPLAIN display of rowcount estimates for BitmapAnd and
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 23 Apr 2005 01:29:15 +0000 (01:29 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 23 Apr 2005 01:29:15 +0000 (01:29 +0000)
BitmapOr nodes.

src/backend/optimizer/plan/createplan.c

index e7a695e..21af9f7 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.183 2005/04/22 21:58:31 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.184 2005/04/23 01:29:15 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -941,7 +941,10 @@ create_bitmap_subplan(Query *root, Path *bitmapqual)
                        newlist = lappend(newlist, subplan);
                }
                plan = (Plan *) make_bitmap_and(newlist);
-               copy_path_costsize(plan, bitmapqual);
+               plan->startup_cost = apath->path.startup_cost;
+               plan->total_cost = apath->path.total_cost;
+               plan->plan_rows =
+                       clamp_row_est(apath->bitmapselectivity * apath->path.parent->tuples);
                plan->plan_width = 0;   /* meaningless */
        }
        else if (IsA(bitmapqual, BitmapOrPath))
@@ -957,31 +960,32 @@ create_bitmap_subplan(Query *root, Path *bitmapqual)
                        newlist = lappend(newlist, subplan);
                }
                plan = (Plan *) make_bitmap_or(newlist);
-               copy_path_costsize(plan, bitmapqual);
+               plan->startup_cost = opath->path.startup_cost;
+               plan->total_cost = opath->path.total_cost;
+               plan->plan_rows =
+                       clamp_row_est(opath->bitmapselectivity * opath->path.parent->tuples);
                plan->plan_width = 0;   /* meaningless */
        }
        else if (IsA(bitmapqual, IndexPath))
        {
                IndexPath *ipath = (IndexPath *) bitmapqual;
                IndexScan *iscan;
-               BitmapIndexScan *bscan;
 
                /* Use the regular indexscan plan build machinery... */
                iscan = create_indexscan_plan(root, ipath, NIL, NIL);
                Assert(list_length(iscan->indxid) == 1);
                /* then convert to a bitmap indexscan */
-               bscan = make_bitmap_indexscan(iscan->scan.scanrelid,
-                                                                         linitial_oid(iscan->indxid),
-                                                                         linitial(iscan->indxqual),
-                                                                         linitial(iscan->indxqualorig),
-                                                                         linitial(iscan->indxstrategy),
-                                                                         linitial(iscan->indxsubtype));
-               bscan->scan.plan.startup_cost = 0.0;
-               bscan->scan.plan.total_cost = ipath->indextotalcost;
-               bscan->scan.plan.plan_rows =
+               plan = (Plan *) make_bitmap_indexscan(iscan->scan.scanrelid,
+                                                                                         linitial_oid(iscan->indxid),
+                                                                                         linitial(iscan->indxqual),
+                                                                                         linitial(iscan->indxqualorig),
+                                                                                         linitial(iscan->indxstrategy),
+                                                                                         linitial(iscan->indxsubtype));
+               plan->startup_cost = 0.0;
+               plan->total_cost = ipath->indextotalcost;
+               plan->plan_rows =
                        clamp_row_est(ipath->indexselectivity * ipath->path.parent->tuples);
-               bscan->scan.plan.plan_width = 0; /* meaningless */
-               plan = (Plan *) bscan;
+               plan->plan_width = 0;   /* meaningless */
        }
        else
        {