Changeset: b9d4cd117414 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b9d4cd117414
Modified Files:
sql/server/rel_exp.c
sql/server/rel_optimizer.c
Branch: Nov2019
Log Message:
make sure we move expressions from a select into a join
only if we are realy sure they are join expressions
made sure we merge more range expressions and in cases
diffs (112 lines):
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -964,6 +964,9 @@ exps_match_col_exps( sql_exp *e1, sql_ex
if (!is_complex_exp(e1->flag) && e1_r && e1_r->card == CARD_ATOM &&
(e2->flag == cmp_in || e2->flag == cmp_notin))
return exp_match_exp(e1->l, e2->l);
+ if ((e1->flag == cmp_in || e1->flag == cmp_notin) &&
+ !is_complex_exp(e2->flag) && e2_r && e2_r->card == CARD_ATOM)
+ return exp_match_exp(e1->l, e2->l);
if ((e1->flag == cmp_in || e1->flag == cmp_notin) &&
(e2->flag == cmp_in || e2->flag == cmp_notin))
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
@@ -3980,7 +3980,7 @@ rel_merge_rse(int *changes, mvc *sql, sq
/* only execute once per select */
(void)*changes;
- if (is_select(rel->op) && rel->exps) {
+ if ((is_select(rel->op) || is_join(rel->op)) && rel->exps) {
node *n, *o;
list *nexps = new_exp_list(sql->sa);
@@ -4541,7 +4541,8 @@ rel_push_select_down(int *changes, mvc *
for (n = exps->h; n; n = n->next) {
sql_exp *e = n->data;
- if (exp_is_join_exp(e) == 0) {
+ //if (exp_is_join_exp(e) == 0) {
+ if (exp_is_join(e, NULL) == 0) {
append(r->exps, e);
(*changes)++;
} else {
@@ -4647,8 +4648,7 @@ rel_remove_empty_select(int *changes, mv
if ((is_join(rel->op) || is_semi(rel->op) || is_select(rel->op) ||
is_project(rel->op) || is_topn(rel->op) || is_sample(rel->op)) && rel->l) {
sql_rel *l = rel->l;
- if (is_select(l->op) && !(rel_is_ref(l)) &&
- (!l->exps || list_length(l->exps) == 0)) {
+ if (is_select(l->op) && !(rel_is_ref(l)) &&
list_empty(l->exps)) {
rel->l = l->l;
l->l = NULL;
rel_destroy(l);
@@ -4657,16 +4657,15 @@ rel_remove_empty_select(int *changes, mv
}
if ((is_join(rel->op) || is_semi(rel->op) || is_set(rel->op)) &&
rel->r) {
sql_rel *r = rel->r;
- if (is_select(r->op) && !(rel_is_ref(r)) &&
- (!r->exps || list_length(r->exps) == 0)) {
+ if (is_select(r->op) && !(rel_is_ref(r)) &&
list_empty(r->exps)) {
rel->r = r->l;
r->l = NULL;
rel_destroy(r);
(*changes)++;
}
}
- if (is_join(rel->op) && rel->exps && list_length(rel->exps) == 0)
- rel->exps = NULL;
+ if (is_join(rel->op) && list_empty(rel->exps))
+ rel->exps = NULL; /* crossproduct */
return rel;
}
@@ -7295,37 +7294,6 @@ rel_use_index(int *changes, mvc *sql, sq
return rel;
}
-/* TODO CSE */
-#if 0
-static list *
-exp_merge(list *exps)
-{
- node *n, *m;
- for (n=exps->h; n && n->next; n = n->next) {
- sql_exp *e = n->data;
- /*sql_exp *le = e->l;*/
- sql_exp *re = e->r;
-
- if (e->type == e_cmp && e->flag == cmp_or && !is_anti(e))
- continue;
-
- /* only look for gt, gte, lte, lt */
- if (re->card == CARD_ATOM && e->flag < cmp_equal) {
- for (m=n->next; m; m = m->next) {
- sql_exp *f = m->data;
- /*sql_exp *lf = f->l;*/
- sql_exp *rf = f->r;
-
- if (rf->card == CARD_ATOM && f->flag <
cmp_equal) {
- printf("possible candidate\n");
- }
- }
- }
- }
- return exps;
-}
-#endif
-
static int
score_se( mvc *sql, sql_rel *rel, sql_exp *e)
{
@@ -7945,7 +7913,7 @@ static sql_rel *
rel_find_range(int *changes, mvc *sql, sql_rel *rel)
{
(void)changes;
- if ((is_join(rel->op) || is_select(rel->op)) && rel->exps &&
list_length(rel->exps)>1)
+ if ((is_join(rel->op) || is_select(rel->op)) && rel->exps &&
!list_empty(rel->exps))
rel->exps = exp_merge_range(sql->sa, rel->exps);
return rel;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list