@@ -934,58 +934,62 @@ handle_boolexpr(const BoolExpr *expr,
934934WrapperNode * result )/* ret value #1 */
935935{
936936const PartRelationInfo * prel = context -> prel ;
937+ List * ranges ,
938+ * args = NIL ;
939+ double paramsel = 1.0 ;
937940ListCell * 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 */
950948foreach (lc ,expr -> args )
951949{
952950WrapperNode * wrap ;
953951
954952wrap = walk_expr_tree ((Expr * )lfirst (lc ),context );
955- result -> args = lappend (result -> args ,wrap );
953+ args = lappend (args ,wrap );
956954
957955switch (expr -> boolop )
958956{
959957case OR_EXPR :
960- result -> rangeset = irange_list_union (result -> rangeset ,
961- wrap -> rangeset );
958+ ranges = irange_list_union (ranges ,wrap -> rangeset );
962959break ;
963960
964961case 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 ;
968964break ;
969965
970966default :
971- result -> rangeset = list_make1_irange_full (prel ,IR_LOSSY );
967+ ranges = list_make1_irange_full (prel ,IR_LOSSY );
972968break ;
973969}
974970}
975971
972+ /* Adjust paramsel for OR */
976973if (expr -> boolop == OR_EXPR )
977974{
978- int totallen = irange_list_length (result -> rangeset );
975+ int totallen = irange_list_length (ranges );
979976
980977foreach (lc ,result -> args )
981978{
982979WrapperNode * arg = (WrapperNode * )lfirst (lc );
983980int 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 */