10
10
*
11
11
*
12
12
* IDENTIFICATION
13
- * $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.198 2005/09/24 22:54:37 tgl Exp $
13
+ * $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.199 2005/10/06 16:01:54 tgl Exp $
14
14
*
15
15
*-------------------------------------------------------------------------
16
16
*/
@@ -819,7 +819,9 @@ create_indexscan_plan(PlannerInfo *root,
819
819
* (particularly with OR'd index conditions) we may have scan_clauses
820
820
* that are not equal to, but are logically implied by, the index quals;
821
821
* so we also try a predicate_implied_by() check to see if we can discard
822
- * quals that way.
822
+ * quals that way. (predicate_implied_by assumes its first input contains
823
+ * only immutable functions, so we have to check that.) We can also
824
+ * discard quals that are implied by a partial index's predicate.
823
825
*
824
826
* While at it, we strip off the RestrictInfos to produce a list of
825
827
* plain expressions.
@@ -832,9 +834,15 @@ create_indexscan_plan(PlannerInfo *root,
832
834
Assert (IsA (rinfo , RestrictInfo ));
833
835
if (list_member_ptr (nonlossy_indexquals , rinfo ))
834
836
continue ;
835
- if (predicate_implied_by (list_make1 (rinfo -> clause ),
836
- nonlossy_indexquals ))
837
- continue ;
837
+ if (!contain_mutable_functions ((Node * ) rinfo -> clause ))
838
+ {
839
+ List * clausel = list_make1 (rinfo -> clause );
840
+
841
+ if (predicate_implied_by (clausel , nonlossy_indexquals ))
842
+ continue ;
843
+ if (predicate_implied_by (clausel , best_path -> indexinfo -> indpred ))
844
+ continue ;
845
+ }
838
846
qpqual = lappend (qpqual , rinfo -> clause );
839
847
}
840
848
@@ -916,6 +924,14 @@ create_bitmap_scan_plan(PlannerInfo *root,
916
924
* OR'd index conditions) we may have scan_clauses that are not equal to,
917
925
* but are logically implied by, the index quals; so we also try a
918
926
* predicate_implied_by() check to see if we can discard quals that way.
927
+ * (predicate_implied_by assumes its first input contains only immutable
928
+ * functions, so we have to check that.) We can also discard quals that
929
+ * are implied by a partial index's predicate.
930
+ *
931
+ * XXX For the moment, we only consider partial index predicates in the
932
+ * simple single-index-scan case. Is it worth trying to be smart about
933
+ * more complex cases? Perhaps create_bitmap_subplan should be made to
934
+ * include predicate info in what it constructs.
919
935
*/
920
936
qpqual = NIL ;
921
937
foreach (l , scan_clauses )
@@ -924,9 +940,20 @@ create_bitmap_scan_plan(PlannerInfo *root,
924
940
925
941
if (list_member (indexquals , clause ))
926
942
continue ;
927
- if (predicate_implied_by (list_make1 (clause ),
928
- indexquals ))
929
- continue ;
943
+ if (!contain_mutable_functions (clause ))
944
+ {
945
+ List * clausel = list_make1 (clause );
946
+
947
+ if (predicate_implied_by (clausel , indexquals ))
948
+ continue ;
949
+ if (IsA (best_path -> bitmapqual , IndexPath ))
950
+ {
951
+ IndexPath * ipath = (IndexPath * ) best_path -> bitmapqual ;
952
+
953
+ if (predicate_implied_by (clausel , ipath -> indexinfo -> indpred ))
954
+ continue ;
955
+ }
956
+ }
930
957
qpqual = lappend (qpqual , clause );
931
958
}
932
959
0 commit comments