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