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

Reply via email to