Changeset: 5a399c59f2d1 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5a399c59f2d1
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
        sql/server/rel_select.h
Branch: Feb2013
Log Message:

fixed bug 4311 (added missing case in exp_merge_range)
fixed bug 4312 (handle boolean column predicate properly)


diffs (153 lines):

diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -849,7 +849,7 @@ order_joins(mvc *sql, list *rels, list *
                        if (exp_is_join_exp(e) == 0)
                                rel_join_add_exp(sql->sa, top->l, e);
                        else
-                               rel_select_add_exp(top, e);
+                               rel_select_add_exp(sql->sa, top, e);
                }
        }
        return top;
@@ -2780,12 +2780,12 @@ rel_push_select_down(int *changes, mvc *
                                ne = exp_push_down(sql, e, jl, jl);
                        if (ne && ne != e) {
                                done = 1; 
-                               rel_select_add_exp(jl, ne);
+                               rel_select_add_exp(sql->sa, jl, ne);
                        } else if (right) {
                                ne = exp_push_down(sql, e, jr, jr);
                                if (ne && ne != e) {
                                        done = 1; 
-                                       rel_select_add_exp(jr, ne);
+                                       rel_select_add_exp(sql->sa, jr, ne);
                                }
                        }
                        if (!done)
@@ -2841,7 +2841,7 @@ rel_push_select_down(int *changes, mvc *
 
                                /* can we move it down */
                                if (ne && ne != e) {
-                                       rel_select_add_exp(pl, ne);
+                                       rel_select_add_exp(sql->sa, pl, ne);
                                        (*changes)++;
                                } else {
                                        append(rel->exps, (ne)?ne:e);
@@ -5162,22 +5162,33 @@ exp_merge_range(sql_allocator *sa, list 
 
                                if (f->type == e_cmp && f->flag < cmp_equal && 
!f->f  &&
                                    rf->card > CARD_ATOM) {
-                                       sql_exp *ne;
+                                       sql_exp *ne, *t;
                                        int swap = 0, lt = 0, gt = 0;
                                        comp_type ef = (comp_type) e->flag, ff 
= (comp_type) f->flag;
                                
+                                       /* both swapped ? */
+                                       if (exp_match_exp(re, rf)) {
+                                               t = re; 
+                                               re = le;
+                                               le = t;
+                                               ef = swap_compare(ef);
+                                               t = rf;
+                                               rf = lf;
+                                               lf = t;
+                                               ff = swap_compare(ff);
+                                       }
+
                                        /* is left swapped ? */
                                        if (exp_match_exp(re, lf)) {
-                                               sql_exp *t = re; 
-
+                                               t = re; 
                                                re = le;
                                                le = t;
                                                ef = swap_compare(ef);
                                        }
+
                                        /* is right swapped ? */
                                        if (exp_match_exp(le, rf)) {
-                                               sql_exp *t = rf; 
-
+                                               t = rf; 
                                                rf = lf;
                                                lf = t;
                                                ff = swap_compare(ff);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -811,9 +811,13 @@ rel_find_lastexp(sql_rel *rel )
 }
 
 void
-rel_select_add_exp(sql_rel *l, sql_exp *e)
+rel_select_add_exp(sql_allocator *sa, sql_rel *l, sql_exp *e)
 {
        assert(l->op == op_select || is_outerjoin(l->op));
+       if (e->type != e_cmp && e->card > CARD_ATOM) {
+               sql_exp *t = exp_atom_bool(sa, 1);
+               e = exp_compare(sa, e, t, cmp_equal);
+       }
        append(l->exps, e);
 }
 
@@ -833,7 +837,7 @@ rel_select(sql_allocator *sa, sql_rel *l
                
        if (l && l->op == op_select && !rel_is_ref(l)) { /* refine old select */
                if (e)
-                       rel_select_add_exp(l, e);
+                       rel_select_add_exp(sa, l, e);
                return l;
        }
        rel = rel_create(sa);
@@ -842,7 +846,7 @@ rel_select(sql_allocator *sa, sql_rel *l
        rel->op = op_select;
        rel->exps = new_exp_list(sa);
        if (e)
-               append(rel->exps, e);
+               rel_select_add_exp(sa, rel, e);
        rel->card = CARD_ATOM; /* no relation */
        if (l) {
                rel->card = l->card;
@@ -1035,7 +1039,7 @@ rel_push_select(sql_allocator *sa, sql_r
        if (!lrel) 
                return NULL;
        if (p && p->op == op_select && !rel_is_ref(p)) { /* refine old select */
-               rel_select_add_exp(p, e);
+               rel_select_add_exp(sa, p, e);
        } else {
                sql_rel *n = rel_select(sa, lrel, e);
 
@@ -1131,9 +1135,9 @@ rel_push_join(sql_allocator *sa, sql_rel
        /* filter on columns of this relation */
        if ((lrel == rrel && (!r2 || lrel == rrel2) && lrel->op != op_join) || 
rel_is_ref(p)) {
                if (lrel->op == op_select && !rel_is_ref(lrel)) {
-                       rel_select_add_exp(lrel, e);
+                       rel_select_add_exp(sa, lrel, e);
                } else if (p && p->op == op_select && !rel_is_ref(p)) {
-                       rel_select_add_exp(p, e);
+                       rel_select_add_exp(sa, p, e);
                } else {
                        sql_rel *n = rel_select(sa, lrel, e);
 
@@ -2897,7 +2901,7 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
                        if (!is_select(rel->op) && !rel_is_ref(rel))
                                left = rel = rel_select(sql->sa, rel, e);
                        else
-                               rel_select_add_exp(rel, e);
+                               rel_select_add_exp(sql->sa, rel, e);
                }
 
                /* list of values or subqueries */
diff --git a/sql/server/rel_select.h b/sql/server/rel_select.h
--- a/sql/server/rel_select.h
+++ b/sql/server/rel_select.h
@@ -42,7 +42,7 @@ extern sql_exp *rel_column_exp(mvc *sql,
 
 extern void rel_add_intern(mvc *sql, sql_rel *rel);
 
-extern void rel_select_add_exp(sql_rel *l, sql_exp *e);
+extern void rel_select_add_exp(sql_allocator *sa, sql_rel *l, sql_exp *e);
 extern sql_rel *rel_select(sql_allocator *sa, sql_rel *l, sql_exp *e);
 extern sql_rel *rel_select_copy(sql_allocator *sa, sql_rel *l, list *exps);
 extern sql_rel *rel_basetable(mvc *sql, sql_table *t, char *tname);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to