@@ -934,58 +934,62 @@ handle_boolexpr(const BoolExpr *expr,
934934 WrapperNode * result ) /* ret value #1 */
935935{
936936 const PartRelationInfo * prel = context -> prel ;
937+ List * ranges ,
938+ * args = NIL ;
939+ double paramsel = 1.0 ;
937940 ListCell * lc ;
938941
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 ;
949946
947+ /* Examine expressions */
950948 foreach (lc , expr -> args )
951949 {
952950 WrapperNode * wrap ;
953951
954952 wrap = walk_expr_tree ((Expr * ) lfirst (lc ), context );
955- result -> args = lappend (result -> args , wrap );
953+ args = lappend (args , wrap );
956954
957955 switch (expr -> boolop )
958956 {
959957 case OR_EXPR :
960- result -> rangeset = irange_list_union (result -> rangeset ,
961- wrap -> rangeset );
958+ ranges = irange_list_union (ranges , wrap -> rangeset );
962959 break ;
963960
964961 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 ;
968964 break ;
969965
970966 default :
971- result -> rangeset = list_make1_irange_full (prel , IR_LOSSY );
967+ ranges = list_make1_irange_full (prel , IR_LOSSY );
972968 break ;
973969 }
974970 }
975971
972+ /* Adjust paramsel for OR */
976973 if (expr -> boolop == OR_EXPR )
977974 {
978- int totallen = irange_list_length (result -> rangeset );
975+ int totallen = irange_list_length (ranges );
979976
980977 foreach (lc , result -> args )
981978 {
982979 WrapperNode * arg = (WrapperNode * ) lfirst (lc );
983980 int len = irange_list_length (arg -> rangeset );
984981
985- result -> paramsel *= (1.0 - arg -> paramsel * (double )len / (double )totallen );
982+ paramsel *= (1.0 - arg -> paramsel * (double )len / (double )totallen );
986983 }
987- result -> paramsel = 1.0 - result -> paramsel ;
984+
985+ paramsel = 1.0 - paramsel ;
988986 }
987+
988+ /* Save results */
989+ result -> rangeset = ranges ;
990+ result -> paramsel = paramsel ;
991+ result -> orig = (const Node * ) expr ;
992+ result -> args = args ;
989993}
990994
991995/* Scalar array expression handler */
0 commit comments