Changeset: 33ede9761261 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/33ede9761261
Modified Files:
sql/server/rel_optimizer.c
sql/server/rel_unnest.c
Branch: Jul2021
Log Message:
Don't overwrite existing selection expression list and look for relations with
more than one reference
diffs (104 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
@@ -4755,7 +4755,7 @@ rel_push_join_exps_down(visitor *v, sql_
if (left && rel_rebind_exp(v->sql, rel->l, e)) { /*
select expressions on left */
sql_rel *l = rel->l;
- if (!is_select(l->op)) {
+ if (!is_select(l->op) || rel_is_ref(l)) {
set_processed(l);
rel->l = l = rel_select(v->sql->sa,
rel->l, NULL);
}
@@ -4765,7 +4765,7 @@ rel_push_join_exps_down(visitor *v, sql_
} else if (right && (rel->op != op_anti || (e->flag !=
mark_notin && e->flag != mark_in)) &&
rel_rebind_exp(v->sql, rel->r, e)) {
/* select expressions on right */
sql_rel *r = rel->r;
- if (!is_select(r->op)) {
+ if (!is_select(r->op) || rel_is_ref(r)) {
set_processed(r);
rel->r = r = rel_select(v->sql->sa,
rel->r, NULL);
}
@@ -4931,7 +4931,7 @@ rel_push_semijoin_down_or_up(visitor *v,
if (n != rel->exps->h && e->type == e_cmp &&
rel_rebind_exp(v->sql, rel->l, e)) {
sql_rel *l = rel->l;
- if (!is_select(l->op)) {
+ if (!is_select(l->op) || rel_is_ref(l)) {
set_processed(l);
rel->l = l = rel_select(v->sql->sa,
rel->l, NULL);
}
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -2983,50 +2983,35 @@ rewrite_join2semi(visitor *v, sql_rel *r
if (is_select(rel->op) && !list_empty(rel->exps)) {
sql_rel *j = rel->l;
- int needed=0;
+ int needed = 0, changed = 0;
if (!j || (!is_join(j->op) && !is_semi(j->op)) ||
!list_empty(j->exps))
return rel;
/* if needed first push select exps down under the join */
- for(node *n = rel->exps->h; n && !needed; n = n->next) {
+ for (node *n = rel->exps->h; n;) {
+ node *next = n->next;
sql_exp *e = n->data;
sql_subfunc *sf = e->f;
- if (is_func(e->type) && exp_card(e) > CARD_ATOM &&
is_anyequal_func(sf) && rel_has_all_exps(j->l, e->l))
- needed = 1;
- }
- if (needed) {
- list *exps = sa_list(v->sql->sa);
- sql_rel *l = j->l;
-
- if (!is_select(l->op)) {
- set_processed(l);
- l = j->l = rel_select(v->sql->sa, j->l, NULL);
+ if (is_func(e->type) && is_anyequal_func(sf)) {
+ if (exp_card(e) > CARD_ATOM &&
rel_has_all_exps(j->l, e->l)) {
+ sql_rel *l = j->l;
+ if (!is_select(l->op) || rel_is_ref(l))
{
+ set_processed(l);
+ j->l = l =
rel_select(v->sql->sa, j->l, NULL);
+ }
+ rel_select_add_exp(v->sql->sa, l, e);
+ list_remove_node(rel->exps, NULL, n);
+ changed = 1;
+ v->changes++;
+ } else {
+ needed = 1;
+ }
}
- for (node *n = rel->exps->h; n;) {
- node *next = n->next;
- sql_exp *e = n->data;
- sql_subfunc *sf = e->f;
-
- if (is_func(e->type) && exp_card(e) > CARD_ATOM
&& is_anyequal_func(sf) && rel_has_all_exps(j->l, e->l)) {
- append(exps, e);
- list_remove_node(rel->exps, NULL, n);
- }
- n = next;
- }
- l->exps = exps;
- if (!(j->l = rewrite_join2semi(v, j->l)))
- return NULL;
+ n = next;
}
-
- needed = 0;
- for(node *n = rel->exps->h; n && !needed; n = n->next) {
- sql_exp *e = n->data;
- sql_subfunc *sf = e->f;
-
- if (is_func(e->type) && is_anyequal_func(sf))
- needed = 1;
- }
+ if (changed && !(j->l = rewrite_join2semi(v, j->l)))
+ return NULL;
if (!needed)
return try_remove_empty_select(v, rel);
if (!j->exps)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list