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