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

Reply via email to