Changeset: a0d55c69fbb0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a0d55c69fbb0
Modified Files:
        sql/server/rel_optimizer.c
Branch: default
Log Message:

Do less allocations at the rel_simplify_like_select optimizer, run it before 
rewrite_simplify and don't propagate semantics flag on gt/lt comparisons


diffs (219 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
@@ -7478,8 +7478,7 @@ rel_select_order(visitor *v, sql_rel *re
        int *scores = NULL;
        sql_exp **exps = NULL;
 
-       assert(is_select(rel->op));
-       if (list_length(rel->exps) > 1) {
+       if (is_select(rel->op) && list_length(rel->exps) > 1) {
                node *n;
                int i, nexps = list_length(rel->exps);
                scores = SA_NEW_ARRAY(v->sql->ta, int, nexps);
@@ -7501,92 +7500,69 @@ rel_select_order(visitor *v, sql_rel *re
 static inline sql_rel *
 rel_simplify_like_select(visitor *v, sql_rel *rel)
 {
-       list *exps;
-       int needed = 0;
-
-       assert(is_select(rel->op) && !list_empty(rel->exps));
-       for (node *n = rel->exps->h; n && !needed; n = n->next) {
-               sql_exp *e = n->data;
-               list *l = e->l;
-               list *r = e->r;
-
-               if (e->type == e_cmp && e->flag == cmp_filter && 
strcmp(((sql_subfunc*)e->f)->func->base.name, "like") == 0 && list_length(l) == 
1 && list_length(r) == 3)
-                       needed = 1;
-       }
-
-       if (!needed)
-               return rel;
-
-       exps = sa_list(v->sql->sa);
-       if (exps == NULL)
-               return NULL;
-       for (node *n = rel->exps->h; n; n = n->next) {
-               sql_exp *e = n->data;
-               list *l = e->l;
-               list *r = e->r;
-
-               if (e->type == e_cmp && e->flag == cmp_filter && 
strcmp(((sql_subfunc*)e->f)->func->base.name, "like") == 0 && list_length(l) == 
1 && list_length(r) == 3) {
+       if (is_select(rel->op) && !list_empty(rel->exps)) {
+               for (node *n = rel->exps->h; n; n = n->next) {
+                       sql_exp *e = n->data;
+                       list *l = e->l;
                        list *r = e->r;
-                       sql_exp *fmt = r->h->data;
-                       sql_exp *esc = r->h->next->data;
-                       sql_exp *isen = r->h->next->next->data;
-                       int rewrite = 0, isnull = 0;
-
-                       if (fmt->type == e_convert)
-                               fmt = fmt->l;
-                       /* check for simple like expression */
-                       if (exp_is_null(fmt)) {
-                               isnull = 1;
-                       } else if (is_atom(fmt->type)) {
-                               atom *fa = NULL;
-
-                               if (fmt->l)
-                                       fa = fmt->l;
-                               if (fa && fa->data.vtype == TYPE_str && 
!strchr(fa->data.val.sval, '%') && !strchr(fa->data.val.sval, '_'))
-                                       rewrite = 1;
-                       }
-                       if (rewrite && !isnull) { /* check escape flag */
-                               if (exp_is_null(esc)) {
+
+                       if (e->type == e_cmp && e->flag == cmp_filter && 
strcmp(((sql_subfunc*)e->f)->func->base.name, "like") == 0 && list_length(l) == 
1 && list_length(r) == 3) {
+                               list *r = e->r;
+                               sql_exp *fmt = r->h->data;
+                               sql_exp *esc = r->h->next->data;
+                               sql_exp *isen = r->h->next->next->data;
+                               int rewrite = 0, isnull = 0;
+
+                               if (fmt->type == e_convert)
+                                       fmt = fmt->l;
+                               /* check for simple like expression */
+                               if (exp_is_null(fmt)) {
                                        isnull = 1;
-                               } else {
-                                       atom *ea = esc->l;
-
-                                       if (!is_atom(esc->type) || !ea)
-                                               rewrite = 0;
-                                       else if (ea->data.vtype != TYPE_str || 
strlen(ea->data.val.sval) != 0)
-                                               rewrite = 0;
+                               } else if (is_atom(fmt->type)) {
+                                       atom *fa = NULL;
+
+                                       if (fmt->l)
+                                               fa = fmt->l;
+                                       if (fa && fa->data.vtype == TYPE_str && 
!strchr(fa->data.val.sval, '%') && !strchr(fa->data.val.sval, '_'))
+                                               rewrite = 1;
                                }
-                       }
-                       if (rewrite && !isnull) { /* check insensitive flag */
-                               if (exp_is_null(isen)) {
-                                       isnull = 1;
-                               } else {
-                                       atom *ia = isen->l;
-
-                                       if (!is_atom(isen->type) || !ia)
-                                               rewrite = 0;
-                                       else if (ia->data.vtype != TYPE_bit || 
ia->data.val.btval == 1)
-                                               rewrite = 0;
+                               if (rewrite && !isnull) { /* check escape flag 
*/
+                                       if (exp_is_null(esc)) {
+                                               isnull = 1;
+                                       } else {
+                                               atom *ea = esc->l;
+
+                                               if (!is_atom(esc->type) || !ea)
+                                                       rewrite = 0;
+                                               else if (ea->data.vtype != 
TYPE_str || strlen(ea->data.val.sval) != 0)
+                                                       rewrite = 0;
+                                       }
                                }
-                       }
-                       if (isnull) {
-                               list_append(exps, exp_null(v->sql->sa, 
sql_bind_localtype("bit")));
-                               v->changes++;
-                       } else if (rewrite) {   /* rewrite to cmp_equal ! */
-                               list *l = e->l;
-                               list *r = e->r;
-                               sql_exp *ne = exp_compare(v->sql->sa, 
l->h->data, r->h->data, is_anti(e) ? cmp_notequal : cmp_equal);
-
-                               list_append(exps, ne);
-                               v->changes++;
-                       } else {
-                               list_append(exps, e);
-                       }
-               } else {
-                       list_append(exps, e);
-               }
-       }
-       rel->exps = exps;
+                               if (rewrite && !isnull) { /* check insensitive 
flag */
+                                       if (exp_is_null(isen)) {
+                                               isnull = 1;
+                                       } else {
+                                               atom *ia = isen->l;
+
+                                               if (!is_atom(isen->type) || !ia)
+                                                       rewrite = 0;
+                                               else if (ia->data.vtype != 
TYPE_bit || ia->data.val.btval == 1)
+                                                       rewrite = 0;
+                                       }
+                               }
+                               if (isnull) {
+                                       rel->exps = 
list_append(sa_list(v->sql->sa), exp_null(v->sql->sa, 
sql_bind_localtype("bit")));
+                                       v->changes++;
+                                       return rel;
+                               } else if (rewrite) {   /* rewrite to cmp_equal 
! */
+                                       list *l = e->l;
+                                       list *r = e->r;
+                                       n->data = exp_compare(v->sql->sa, 
l->h->data, r->h->data, is_anti(e) ? cmp_notequal : cmp_equal);
+                                       v->changes++;
+                               }
+                       }
+               }
+       }
        return rel;
 }
 
@@ -8321,8 +8297,6 @@ rel_reduce_casts(visitor *v, sql_rel *re
                sql_exp *e = n->data;
                sql_exp *le = e->l;
                sql_exp *re = e->r;
-               int anti = is_anti(e);
-               int semantics = is_semantics(e);
 
                /* handle the and's in the or lists */
                if (e->type != e_cmp || !is_theta_exp(e->flag) || e->f)
@@ -8350,6 +8324,7 @@ rel_reduce_casts(visitor *v, sql_rel *re
                                                atom *a;
 
                                                if (fst->scale && fst->scale == 
ft->scale && (a = exp_value(v->sql, ce)) != NULL) {
+                                                       int anti = is_anti(e);
                                                        sql_exp *arg1, *arg2;
 #ifdef HAVE_HGE
                                                        hge val = 1;
@@ -8378,14 +8353,13 @@ rel_reduce_casts(visitor *v, sql_rel *re
                                                                continue;
                                                        }
                                                        e = 
exp_compare(v->sql->sa, le->l, nre, e->flag);
+                                                       if (anti) set_anti(e);
                                                        v->changes++;
                                                }
                                        }
                                }
                        }
                }
-               if (anti) set_anti(e);
-               if (semantics) set_semantics(e);
                n->data = e;
        }
        return rel;
@@ -9449,6 +9423,8 @@ rel_optimize_select_and_joins_bottomup(v
        rel = rel_select_cse(v, rel);
        if (level == 1)
                rel = rel_merge_select_rse(v, rel);
+       if (v->value_based_opt && level <= 1)
+               rel = rel_simplify_like_select(v, rel);
        rel = rewrite_simplify(v, rel);
        return rel;
 }
@@ -9606,11 +9582,6 @@ rel_optimize_select_and_joins_topdown(vi
        if (rel && rel->l && (is_select(rel->op) || is_join(rel->op)))
                rel = rel_use_index(v, rel);
 
-       if (!is_select(rel->op) || list_empty(rel->exps))
-               return rel;
-
-       if (v->value_based_opt)
-               rel = rel_simplify_like_select(v, rel);
        rel = rel_select_order(v, rel);
        return rel;
 }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to