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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list