@@ -934,58 +934,62 @@ handle_boolexpr(const BoolExpr *expr,
934
934
WrapperNode * result ) /* ret value #1 */
935
935
{
936
936
const PartRelationInfo * prel = context -> prel ;
937
+ List * ranges ,
938
+ * args = NIL ;
939
+ double paramsel = 1.0 ;
937
940
ListCell * lc ;
938
941
939
- /* Save expression */
940
- result -> orig = (const Node * ) expr ;
941
-
942
- result -> args = NIL ;
943
- result -> paramsel = 1.0 ;
944
-
945
- /* First, set default rangeset */
946
- result -> rangeset = (expr -> boolop == AND_EXPR ) ?
947
- list_make1_irange_full (prel , IR_COMPLETE ) :
948
- NIL ;
942
+ /* Set default rangeset */
943
+ ranges = (expr -> boolop == AND_EXPR ) ?
944
+ list_make1_irange_full (prel , IR_COMPLETE ) :
945
+ NIL ;
949
946
947
+ /* Examine expressions */
950
948
foreach (lc , expr -> args )
951
949
{
952
950
WrapperNode * wrap ;
953
951
954
952
wrap = walk_expr_tree ((Expr * ) lfirst (lc ), context );
955
- result -> args = lappend (result -> args , wrap );
953
+ args = lappend (args , wrap );
956
954
957
955
switch (expr -> boolop )
958
956
{
959
957
case OR_EXPR :
960
- result -> rangeset = irange_list_union (result -> rangeset ,
961
- wrap -> rangeset );
958
+ ranges = irange_list_union (ranges , wrap -> rangeset );
962
959
break ;
963
960
964
961
case AND_EXPR :
965
- result -> rangeset = irange_list_intersection (result -> rangeset ,
966
- wrap -> rangeset );
967
- result -> paramsel *= wrap -> paramsel ;
962
+ ranges = irange_list_intersection (ranges , wrap -> rangeset );
963
+ paramsel *= wrap -> paramsel ;
968
964
break ;
969
965
970
966
default :
971
- result -> rangeset = list_make1_irange_full (prel , IR_LOSSY );
967
+ ranges = list_make1_irange_full (prel , IR_LOSSY );
972
968
break ;
973
969
}
974
970
}
975
971
972
+ /* Adjust paramsel for OR */
976
973
if (expr -> boolop == OR_EXPR )
977
974
{
978
- int totallen = irange_list_length (result -> rangeset );
975
+ int totallen = irange_list_length (ranges );
979
976
980
977
foreach (lc , result -> args )
981
978
{
982
979
WrapperNode * arg = (WrapperNode * ) lfirst (lc );
983
980
int len = irange_list_length (arg -> rangeset );
984
981
985
- result -> paramsel *= (1.0 - arg -> paramsel * (double )len / (double )totallen );
982
+ paramsel *= (1.0 - arg -> paramsel * (double )len / (double )totallen );
986
983
}
987
- result -> paramsel = 1.0 - result -> paramsel ;
984
+
985
+ paramsel = 1.0 - paramsel ;
988
986
}
987
+
988
+ /* Save results */
989
+ result -> rangeset = ranges ;
990
+ result -> paramsel = paramsel ;
991
+ result -> orig = (const Node * ) expr ;
992
+ result -> args = args ;
989
993
}
990
994
991
995
/* Scalar array expression handler */
0 commit comments