Changeset: 99e5227504c3 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=99e5227504c3 Modified Files: sql/server/rel_optimizer.c sql/server/rel_rewriter.c sql/server/rel_rewriter.h sql/server/rel_unnest.c Branch: Jun2020 Log Message:
Code cleanup and added ifthenelse(true,x,y)->x and ifthenelse(false,x,y)->y optimizations diffs (127 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 @@ -2983,7 +2983,7 @@ exp_case_fixup( mvc *sql, sql_rel *rel, sql_subfunc *f = e->f; /* first fixup arguments */ - if (f->func->s || strcmp(f->func->base.name, "ifthenelse")) { + if (f->func->s || !is_ifthenelse_func(f)) { for (n=args->h; n; n=n->next) { sql_exp *a = exp_case_fixup(sql, rel, n->data, cc); list_append(l, a); @@ -7733,7 +7733,7 @@ rel_simplify_predicates(mvc *sql, sql_re sql_subfunc *f = l->f; /* rewrite isnull(x) = TRUE/FALSE => x =/<> NULL */ - if (!f->func->s && !strcmp(f->func->base.name, "isnull")) { + if (!f->func->s && is_isnull_func(f)) { list *args = l->l; sql_exp *ie = args->h->data; @@ -7761,7 +7761,7 @@ rel_simplify_predicates(mvc *sql, sql_re (*changes)++; } } - } else if (!f->func->s && !strcmp(f->func->base.name, "not")) { + } else if (!f->func->s && is_not_func(f)) { if (is_atom(r->type) && r->l) { /* direct literal */ atom *a = r->l; list *args = l->l; @@ -7773,7 +7773,7 @@ rel_simplify_predicates(mvc *sql, sql_re /* not(not(x)) = TRUE/FALSE => x = TRUE/FALSE */ if (is_func(inner->type) && !inf->func->s && - !strcmp(inf->func->base.name, "not")) { + is_not_func(inf)) { int anti = is_anti(e); args = inner->l; @@ -7825,6 +7825,17 @@ rel_simplify_predicates(mvc *sql, sql_re (*changes)++; } } + } else if (is_func(e->type) && list_length(e->l) == 3 && is_ifthenelse_func((sql_subfunc*)e->f)) { + list *args = e->l; + sql_exp *ie = args->h->data; + + if (exp_is_true(sql, ie)) { /* ifthenelse(true, x, y) -> x */ + e = args->h->next->data; + (*changes)++; + } else if (exp_is_false(sql, ie) || exp_is_null(sql, ie)) { /* ifthenelse(false, x, y) -> y */ + e = args->h->next->next->data; + (*changes)++; + } } } return e; @@ -7896,7 +7907,7 @@ split_exp(mvc *sql, sql_exp *e, sql_rel case e_func: if (!is_analytic(e) && !exp_has_sideeffect(e)) { sql_subfunc *f = e->f; - if (e->type == e_func && !f->func->s && !strcmp(f->func->base.name, "ifthenelse")) { + if (e->type == e_func && !f->func->s && is_ifthenelse_func(f)) { return e; } else { split_exps(sql, e->l, rel); @@ -8009,7 +8020,7 @@ select_split_exp(mvc *sql, sql_exp *e, s case e_func: if (!is_analytic(e) && !exp_has_sideeffect(e)) { sql_subfunc *f = e->f; - if (e->type == e_func && !f->func->s && !strcmp(f->func->base.name, "ifthenelse")) + if (e->type == e_func && !f->func->s && is_ifthenelse_func(f)) return add_exp_too_project(sql, e, rel); } return e; 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 @@ -16,9 +16,7 @@ /* simplify expressions, such as not(not(x)) */ /* exp visitor */ -#define is_null(sf) (strcmp(sf->func->base.name, "isnull") == 0) -#define is_not_func(sf) (strcmp(sf->func->base.name, "not") == 0) -#define is_not_anyequal(sf) (strcmp(sf->func->base.name, "sql_not_anyequal") == 0) +#define is_not_anyequal(sf) (strcmp((sf)->func->base.name, "sql_not_anyequal") == 0) static list * exps_simplify_exp(mvc *sql, list *exps, int *changes) 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 @@ -12,6 +12,10 @@ #include "sql_relation.h" #include "sql_mvc.h" +#define is_ifthenelse_func(sf) (strcmp((sf)->func->base.name, "ifthenelse") == 0) +#define is_isnull_func(sf) (strcmp((sf)->func->base.name, "isnull") == 0) +#define is_not_func(sf) (strcmp((sf)->func->base.name, "not") == 0) + extern sql_exp *rewrite_simplify_exp(mvc *sql, sql_rel *rel, sql_exp *e, int depth, int *changes); extern sql_rel *rewrite_simplify(mvc *sql, sql_rel *rel, int *changes); extern sql_rel *rel_remove_empty_select(mvc *sql, sql_rel *rel, int *changes); diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -1984,8 +1984,8 @@ rewrite_rank(mvc *sql, sql_rel *rel, sql return e; } -#define is_anyequal_func(sf) (strcmp(sf->func->base.name, "sql_anyequal") == 0 || strcmp(sf->func->base.name, "sql_not_anyequal") == 0) -#define is_anyequal(sf) (strcmp(sf->func->base.name, "sql_anyequal") == 0) +#define is_anyequal_func(sf) (strcmp((sf)->func->base.name, "sql_anyequal") == 0 || strcmp((sf)->func->base.name, "sql_not_anyequal") == 0) +#define is_anyequal(sf) (strcmp((sf)->func->base.name, "sql_anyequal") == 0) static sql_rel * rel_union_exps(mvc *sql, sql_exp **l, list *vals, int is_tuple) @@ -2627,9 +2627,6 @@ rewrite_exists(mvc *sql, sql_rel *rel, s return e; } -#define is_ifthenelse_func(sf) (strcmp(sf->func->base.name, "ifthenelse") == 0) -#define is_isnull_func(sf) (strcmp(sf->func->base.name, "isnull") == 0) - /* exp visitor */ static sql_exp * rewrite_ifthenelse(mvc *sql, sql_rel *rel, sql_exp *e, int depth, int *changes) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list