9
9
*
10
10
*
11
11
* IDENTIFICATION
12
- * $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.210 2006/07/13 17:47:01 momjian Exp $
12
+ * $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.211 2006/07/22 15:41:55 tgl Exp $
13
13
*
14
14
*-------------------------------------------------------------------------
15
15
*/
@@ -53,9 +53,11 @@ static List *find_usable_indexes(PlannerInfo *root, RelOptInfo *rel,
53
53
static List * find_saop_paths (PlannerInfo * root , RelOptInfo * rel ,
54
54
List * clauses , List * outer_clauses ,
55
55
bool istoplevel , RelOptInfo * outer_rel );
56
- static Path * choose_bitmap_and (PlannerInfo * root , RelOptInfo * rel , List * paths );
56
+ static Path * choose_bitmap_and (PlannerInfo * root , RelOptInfo * rel ,
57
+ List * paths , RelOptInfo * outer_rel );
57
58
static int bitmap_path_comparator (const void * a , const void * b );
58
- static Cost bitmap_and_cost_est (PlannerInfo * root , RelOptInfo * rel , List * paths );
59
+ static Cost bitmap_and_cost_est (PlannerInfo * root , RelOptInfo * rel ,
60
+ List * paths , RelOptInfo * outer_rel );
59
61
static List * pull_indexpath_quals (Path * bitmapqual );
60
62
static bool lists_intersect_ptr (List * list1 , List * list2 );
61
63
static bool match_clause_to_indexcol (IndexOptInfo * index ,
@@ -210,8 +212,8 @@ create_index_paths(PlannerInfo *root, RelOptInfo *rel)
210
212
Path * bitmapqual ;
211
213
BitmapHeapPath * bpath ;
212
214
213
- bitmapqual = choose_bitmap_and (root , rel , bitindexpaths );
214
- bpath = create_bitmap_heap_path (root , rel , bitmapqual , false );
215
+ bitmapqual = choose_bitmap_and (root , rel , bitindexpaths , NULL );
216
+ bpath = create_bitmap_heap_path (root , rel , bitmapqual , NULL );
215
217
add_path (rel , (Path * ) bpath );
216
218
}
217
219
}
@@ -536,7 +538,7 @@ generate_bitmap_or_paths(PlannerInfo *root, RelOptInfo *rel,
536
538
* OK, pick the most promising AND combination, and add it to
537
539
* pathlist.
538
540
*/
539
- bitmapqual = choose_bitmap_and (root , rel , indlist );
541
+ bitmapqual = choose_bitmap_and (root , rel , indlist , outer_rel );
540
542
pathlist = lappend (pathlist , bitmapqual );
541
543
}
542
544
@@ -567,7 +569,8 @@ generate_bitmap_or_paths(PlannerInfo *root, RelOptInfo *rel,
567
569
* combining multiple inputs.
568
570
*/
569
571
static Path *
570
- choose_bitmap_and (PlannerInfo * root , RelOptInfo * rel , List * paths )
572
+ choose_bitmap_and (PlannerInfo * root , RelOptInfo * rel ,
573
+ List * paths , RelOptInfo * outer_rel )
571
574
{
572
575
int npaths = list_length (paths );
573
576
Path * * patharray ;
@@ -629,7 +632,7 @@ choose_bitmap_and(PlannerInfo *root, RelOptInfo *rel, List *paths)
629
632
qsort (patharray , npaths , sizeof (Path * ), bitmap_path_comparator );
630
633
631
634
paths = list_make1 (patharray [0 ]);
632
- costsofar = bitmap_and_cost_est (root , rel , paths );
635
+ costsofar = bitmap_and_cost_est (root , rel , paths , outer_rel );
633
636
qualsofar = pull_indexpath_quals (patharray [0 ]);
634
637
lastcell = list_head (paths ); /* for quick deletions */
635
638
@@ -644,7 +647,7 @@ choose_bitmap_and(PlannerInfo *root, RelOptInfo *rel, List *paths)
644
647
continue ; /* consider it redundant */
645
648
/* tentatively add newpath to paths, so we can estimate cost */
646
649
paths = lappend (paths , newpath );
647
- newcost = bitmap_and_cost_est (root , rel , paths );
650
+ newcost = bitmap_and_cost_est (root , rel , paths , outer_rel );
648
651
if (newcost < costsofar )
649
652
{
650
653
/* keep newpath in paths, update subsidiary variables */
@@ -702,7 +705,8 @@ bitmap_path_comparator(const void *a, const void *b)
702
705
* inputs.
703
706
*/
704
707
static Cost
705
- bitmap_and_cost_est (PlannerInfo * root , RelOptInfo * rel , List * paths )
708
+ bitmap_and_cost_est (PlannerInfo * root , RelOptInfo * rel ,
709
+ List * paths , RelOptInfo * outer_rel )
706
710
{
707
711
BitmapAndPath apath ;
708
712
Path bpath ;
@@ -714,7 +718,7 @@ bitmap_and_cost_est(PlannerInfo *root, RelOptInfo *rel, List *paths)
714
718
cost_bitmap_and_node (& apath , root );
715
719
716
720
/* Now we can do cost_bitmap_heap_scan */
717
- cost_bitmap_heap_scan (& bpath , root , rel , (Path * ) & apath );
721
+ cost_bitmap_heap_scan (& bpath , root , rel , (Path * ) & apath , outer_rel );
718
722
719
723
return bpath .total_cost ;
720
724
}
@@ -1486,8 +1490,8 @@ best_inner_indexscan(PlannerInfo *root, RelOptInfo *rel,
1486
1490
Path * bitmapqual ;
1487
1491
BitmapHeapPath * bpath ;
1488
1492
1489
- bitmapqual = choose_bitmap_and (root , rel , bitindexpaths );
1490
- bpath = create_bitmap_heap_path (root , rel , bitmapqual , true );
1493
+ bitmapqual = choose_bitmap_and (root , rel , bitindexpaths , outer_rel );
1494
+ bpath = create_bitmap_heap_path (root , rel , bitmapqual , outer_rel );
1491
1495
indexpaths = lappend (indexpaths , bpath );
1492
1496
}
1493
1497
0 commit comments