Changeset: 44153a2bcfa4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/44153a2bcfa4
Modified Files:
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_optimizer.c
        sql/server/rel_rewriter.c
        sql/server/rel_rewriter.h
Branch: default
Log Message:

Flat variable value only when value based optimization is allowed


diffs (168 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
@@ -2837,37 +2837,6 @@ exp_copy(mvc *sql, sql_exp * e)
        return ne;
 }
 
-atom *
-exp_flatten(mvc *sql, sql_exp *e)
-{
-       if (e->type == e_atom) {
-               return exp_value(sql, e);
-       } else if (e->type == e_convert) {
-               atom *v = exp_flatten(sql, e->l);
-
-               if (v)
-                       return atom_cast(sql->sa, v, exp_subtype(e));
-       } else if (e->type == e_func) {
-               sql_subfunc *f = e->f;
-               list *l = e->l;
-               sql_arg *res = (f->func->res)?(f->func->res->h->data):NULL;
-
-               /* TODO handle date + x months */
-               if (!f->func->s && strcmp(f->func->base.name, "sql_add") == 0 
&& list_length(l) == 2 && res && EC_NUMBER(res->type.type->eclass)) {
-                       atom *l1 = exp_flatten(sql, l->h->data);
-                       atom *l2 = exp_flatten(sql, l->h->next->data);
-                       if (l1 && l2)
-                               return atom_add(sql->sa, l1, l2);
-               } else if (!f->func->s && strcmp(f->func->base.name, "sql_sub") 
== 0 && list_length(l) == 2 && res && EC_NUMBER(res->type.type->eclass)) {
-                       atom *l1 = exp_flatten(sql, l->h->data);
-                       atom *l2 = exp_flatten(sql, l->h->next->data);
-                       if (l1 && l2)
-                               return atom_sub(sql->sa, l1, l2);
-               }
-       }
-       return NULL;
-}
-
 sql_exp *
 exp_scale_algebra(mvc *sql, sql_subfunc *f, sql_rel *rel, sql_exp *l, sql_exp 
*r)
 {
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -193,8 +193,6 @@ extern sql_exp *exps_find_one_multi_exp(
 extern const char *compare_func( comp_type t, int anti );
 extern int is_identity( sql_exp *e, sql_rel *r);
 
-extern atom *exp_flatten(mvc *sql, sql_exp *e);
-
 extern sql_exp *exp_scale_algebra(mvc *sql, sql_subfunc *f, sql_rel *rel, 
sql_exp *l, sql_exp *r);
 extern void exp_sum_scales(sql_subfunc *f, sql_exp *l, sql_exp *r);
 
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
@@ -3036,8 +3036,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                        }
                        */
                        if (exp_is_atom(le) && exp_is_atom(re)) {
-                               atom *la = exp_flatten(sql, le);
-                               atom *ra = exp_flatten(sql, re);
+                               atom *la = exp_flatten(sql, true, le);
+                               atom *ra = exp_flatten(sql, true, re);
 
                                if (la && ra && subtype_cmp(atom_type(la), 
atom_type(ra)) == 0 && subtype_cmp(atom_type(la), exp_subtype(e)) == 0) {
                                        atom *a = atom_mul(sql->sa, la, ra);
@@ -3144,8 +3144,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                                return le;
                        }
                        if (exp_is_atom(le) && exp_is_atom(re)) {
-                               atom *la = exp_flatten(sql, le);
-                               atom *ra = exp_flatten(sql, re);
+                               atom *la = exp_flatten(sql, true, le);
+                               atom *ra = exp_flatten(sql, true, re);
 
                                if (la && ra) {
                                        atom *a = atom_add(sql->sa, la, ra);
@@ -3211,8 +3211,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                        sql_exp *re = l->h->next->data;
 
                        if (exp_is_atom(le) && exp_is_atom(re)) {
-                               atom *la = exp_flatten(sql, le);
-                               atom *ra = exp_flatten(sql, re);
+                               atom *la = exp_flatten(sql, true, le);
+                               atom *ra = exp_flatten(sql, true, re);
 
                                if (la && ra) {
                                        atom *a = atom_sub(sql->sa, la, ra);
@@ -9102,8 +9102,8 @@ rel_merge_table_rewrite(visitor *v, sql_
 
                                        if (flag == cmp_gt || flag == cmp_gte 
|| flag == cmp_lte || flag == cmp_lt || flag == cmp_equal) {
                                                sql_exp *l = e->r, *h = e->f;
-                                               atom *lval = 
exp_flatten(v->sql, l);
-                                               atom *hval = h ? 
exp_flatten(v->sql, h) : lval;
+                                               atom *lval = 
exp_flatten(v->sql, v->value_based_opt, l);
+                                               atom *hval = h ? 
exp_flatten(v->sql, v->value_based_opt, h) : lval;
 
                                                if (lval && hval) {
                                                        range_limit *next = 
SA_NEW(v->sql->sa, range_limit);
@@ -9125,7 +9125,7 @@ rel_merge_table_rewrite(visitor *v, sql_
                                                node *m = NULL;
                                                for (m = vals->h; m; m = 
m->next) {
                                                        sql_exp *l = m->data;
-                                                       atom *lval = 
exp_flatten(v->sql, l);
+                                                       atom *lval = 
exp_flatten(v->sql, v->value_based_opt, l);
 
                                                        if (!lval)
                                                                break;
@@ -9368,8 +9368,8 @@ exp_is_zero_rows(visitor *v, sql_rel *re
                                        sql_exp *l = e->r;
                                        sql_exp *h = e->f;
 
-                                       atom *lval = exp_flatten(v->sql, l);
-                                       atom *hval = h ? exp_flatten(v->sql, h) 
: lval;
+                                       atom *lval = exp_flatten(v->sql, 
v->value_based_opt, l);
+                                       atom *hval = h ? exp_flatten(v->sql, 
v->value_based_opt, h) : lval;
                                        if (lval && hval) {
                                                sql_rel *bt;
                                                sql_column *col = 
name_find_column(sel, exp_relname(c), exp_name(c), -2, &bt);
diff --git a/sql/server/rel_rewriter.c b/sql/server/rel_rewriter.c
--- a/sql/server/rel_rewriter.c
+++ b/sql/server/rel_rewriter.c
@@ -215,3 +215,34 @@ rewrite_reset_used(visitor *v, sql_rel *
        rel->used = 0;
        return rel;
 }
+
+atom *
+exp_flatten(mvc *sql, bool value_based_opt, sql_exp *e)
+{
+       if (e->type == e_atom) {
+               return value_based_opt ? exp_value(sql, e) : (atom *) e->l;
+       } else if (e->type == e_convert) {
+               atom *v = exp_flatten(sql, value_based_opt, e->l);
+
+               if (v)
+                       return atom_cast(sql->sa, v, exp_subtype(e));
+       } else if (e->type == e_func) {
+               sql_subfunc *f = e->f;
+               list *l = e->l;
+               sql_arg *res = (f->func->res)?(f->func->res->h->data):NULL;
+
+               /* TODO handle date + x months */
+               if (!f->func->s && strcmp(f->func->base.name, "sql_add") == 0 
&& list_length(l) == 2 && res && EC_NUMBER(res->type.type->eclass)) {
+                       atom *l1 = exp_flatten(sql, value_based_opt, 
l->h->data);
+                       atom *l2 = exp_flatten(sql, value_based_opt, 
l->h->next->data);
+                       if (l1 && l2)
+                               return atom_add(sql->sa, l1, l2);
+               } else if (!f->func->s && strcmp(f->func->base.name, "sql_sub") 
== 0 && list_length(l) == 2 && res && EC_NUMBER(res->type.type->eclass)) {
+                       atom *l1 = exp_flatten(sql, value_based_opt, 
l->h->data);
+                       atom *l2 = exp_flatten(sql, value_based_opt, 
l->h->next->data);
+                       if (l1 && l2)
+                               return atom_sub(sql->sa, l1, l2);
+               }
+       }
+       return NULL;
+}
diff --git a/sql/server/rel_rewriter.h b/sql/server/rel_rewriter.h
--- a/sql/server/rel_rewriter.h
+++ b/sql/server/rel_rewriter.h
@@ -40,4 +40,6 @@ try_remove_empty_select(visitor *v, sql_
 
 extern sql_rel *rewrite_reset_used(visitor *v, sql_rel *rel);
 
+extern atom *exp_flatten(mvc *sql, bool value_based_opt, sql_exp *e);
+
 #endif /*_REL_REWRITER_H_*/
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to