Changeset: 716d3e329390 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=716d3e329390
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_optimizer.c
Branch: Oct2020
Log Message:

make sure we merge in lists, once when possible ie
a in( 1, 2) or a in ( 3, 4) -> a in (1, 2, 3, 4)


diffs (113 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1003,7 +1003,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        if (list_empty(exps) && (strcmp(f->func->base.name, 
"rand") == 0 || (f1 = sql_find_func(sql->sa, f->func->s, f->func->base.name, 1, 
f->func->type, NULL)))) {
                                if (f1)
                                        f = f1;
-                               list_append(l, stmt_const(be, 
bin_first_column(be, left), 
+                               list_append(l, stmt_const(be, 
bin_first_column(be, left),
                                                                                
  stmt_atom(be, atom_general(sql->sa, f1 ? 
&(((sql_arg*)f1->func->ops->h->data)->type) : sql_bind_localtype("int"), 
NULL))));
                        } else if (exps_card(exps) < CARD_MULTI) {
                                rows = bin_first_column(be, left);
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
@@ -3758,35 +3758,42 @@ rel_project_cse(visitor *v, sql_rel *rel
 }
 
 static list *
-exps_merge_select_rse( mvc *sql, list *l, list *r )
+exps_merge_select_rse( mvc *sql, list *l, list *r, bool *merged)
 {
        node *n, *m, *o;
        list *nexps = NULL, *lexps, *rexps;
+       bool lmerged = true, rmerged = true;
 
        lexps = new_exp_list(sql->sa);
        for (n = l->h; n; n = n->next) {
                sql_exp *e = n->data;
 
                if (e->type == e_cmp && e->flag == cmp_or && !is_anti(e) && 
!is_semantics(e)) {
-                       list *nexps = exps_merge_select_rse(sql, e->l, e->r);
+                       lmerged = false;
+                       list *nexps = exps_merge_select_rse(sql, e->l, e->r, 
&lmerged);
                        for (o = nexps->h; o; o = o->next)
                                append(lexps, o->data);
                } else {
                        append(lexps, e);
                }
        }
+       if (lmerged)
+               lmerged = (list_length(lexps) == 1);
        rexps = new_exp_list(sql->sa);
        for (n = r->h; n; n = n->next) {
                sql_exp *e = n->data;
 
                if (e->type == e_cmp && e->flag == cmp_or && !is_anti(e) && 
!is_semantics(e)) {
-                       list *nexps = exps_merge_select_rse(sql, e->l, e->r);
+                       rmerged = false;
+                       list *nexps = exps_merge_select_rse(sql, e->l, e->r, 
&rmerged);
                        for (o = nexps->h; o; o = o->next)
                                append(rexps, o->data);
                } else {
                        append(rexps, e);
                }
        }
+       if (rmerged)
+               rmerged = (list_length(r) == 1);
 
        nexps = new_exp_list(sql->sa);
 
@@ -3850,9 +3857,12 @@ exps_merge_select_rse( mvc *sql, list *l
                                mine = exp_binop(sql->sa, le->r, re->r, min);
                                maxe = exp_binop(sql->sa, le->f, re->f, max);
                                fnd = exp_compare2(sql->sa, le->l, mine, maxe, 
CMP_BETWEEN|le->flag);
-                       }
-                       if (fnd)
+                               lmerged = false;
+                       }
+                       if (fnd) {
                                append(nexps, fnd);
+                               *merged = (fnd && lmerged && rmerged);
+                       }
                }
        }
        return nexps;
@@ -3911,6 +3921,11 @@ rel_merge_project_rse(visitor *v, sql_re
  *      (x = e and y > 1 and y < 20)) and
  *              x in (a,c,e) and
  *              y > 1 and y < 20
+ *
+ * for single expression or's we can do better
+ *             x in (a, b, c) or x in (d, e, f)
+ *             ->
+ *             x in (a, b, c, d, e, f)
  * */
 static sql_rel *
 rel_merge_select_rse(visitor *v, sql_rel *rel)
@@ -3925,14 +3940,18 @@ rel_merge_select_rse(visitor *v, sql_rel
 
                        if (e->type == e_cmp && e->flag == cmp_or && 
!is_anti(e) && !is_semantics(e)) {
                                /* possibly merge related expressions */
-                               list *ps = exps_merge_select_rse(v->sql, e->l, 
e->r);
+                               bool merged = false;
+
+                               list *ps = exps_merge_select_rse(v->sql, e->l, 
e->r, &merged);
                                for (o = ps->h; o; o = o->next)
                                        append(nexps, o->data);
-                       }
-               }
-               if (!list_empty(nexps))
-                       for (o = nexps->h; o; o = o->next)
-                               append(rel->exps, o->data);
+                               if (!merged)
+                                       append(nexps, e);
+                       } else {
+                               append(nexps, e);
+                       }
+               }
+               rel->exps = nexps;
                rel->used = 1;
        }
        return rel;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to