Changeset: b9e173b5a70c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b9e173b5a70c
Modified Files:
        sql/server/rel_optimize_exps.c
        sql/server/rel_rewriter.h
        sql/test/SQLancer/Tests/sqlancer17.test
Branch: default
Log Message:

small atom case when optimization


diffs (74 lines):

diff --git a/sql/server/rel_optimize_exps.c b/sql/server/rel_optimize_exps.c
--- a/sql/server/rel_optimize_exps.c
+++ b/sql/server/rel_optimize_exps.c
@@ -427,7 +427,7 @@ reduce_scale(mvc *sql, atom *a)
 static inline sql_exp *
 rel_simplify_predicates(visitor *v, sql_rel *rel, sql_exp *e)
 {
-       if (is_func(e->type) && list_length(e->l) == 3 && 
is_case_func((sql_subfunc*)e->f) /*is_ifthenelse_func((sql_subfunc*)e->f)*/) {
+       if (is_func(e->type) && list_length(e->l) == 3 && 
is_case_func((sql_subfunc*)e->f)) {
                list *args = e->l;
                sql_exp *ie = args->h->data;
 
@@ -445,6 +445,30 @@ rel_simplify_predicates(visitor *v, sql_
                        return res;
                }
        }
+       if (is_func(e->type) && list_length(e->l) == 4 && 
is_casewhen_func((sql_subfunc*)e->f)) {
+               /* case x when y then a else b */
+               list *args = e->l;
+               node *n = args->h;
+               sql_exp *le = n->data;
+               sql_exp *re = n->next->data;
+
+               if (exp_is_atom(le) && exp_is_atom(re) && le->type == e_atom && 
le->l && re->type == e_atom && re->l) {
+                       n = n->next->next;
+                       if (exp_match_exp(le, re)) { /* x==y -> a */
+                               sql_exp *res = n->data;
+                               if (exp_name(e))
+                                       exp_prop_alias(v->sql->sa, res, e);
+                               v->changes++;
+                               return res;
+                       } else { /*  -> b */
+                               sql_exp *res = n->next->data;
+                               if (exp_name(e))
+                                       exp_prop_alias(v->sql->sa, res, e);
+                               v->changes++;
+                               return res;
+                       }
+               }
+       }
        if (is_select(rel->op) || is_join(rel->op) || is_semi(rel->op)) {
                /* simplify like expressions */
                if (is_compare(e->type) && e->flag == cmp_filter && 
!((sql_subfunc*)e->f)->func->s && strcmp(((sql_subfunc*)e->f)->func->base.name, 
"like") == 0 &&
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
@@ -22,6 +22,7 @@
                                                          
strcmp((sf)->func->base.name, "coalesce") == 0 || \
                                                          
strcmp((sf)->func->base.name, "nullif") == 0)
 #define is_case_func(sf) (strcmp((sf)->func->base.name, "case") == 0)
+#define is_casewhen_func(sf) (strcmp((sf)->func->base.name, "casewhen") == 0)
 
 extern sql_exp *rewrite_simplify_exp(visitor *v, sql_rel *rel, sql_exp *e, int 
depth);
 extern sql_rel *rewrite_simplify(visitor *v, uint8_t cycle, bool 
value_based_opt, sql_rel *rel);
diff --git a/sql/test/SQLancer/Tests/sqlancer17.test 
b/sql/test/SQLancer/Tests/sqlancer17.test
--- a/sql/test/SQLancer/Tests/sqlancer17.test
+++ b/sql/test/SQLancer/Tests/sqlancer17.test
@@ -648,12 +648,10 @@ least(3, sub0.c1) FROM vx JOIN (SELECT 4
 project (
 | crossproduct (
 | | table("sys"."rt0") [ "rt0"."%TID%" NOT NULL UNIQUE ],
-| | project (
-| | | crossproduct (
-| | | |  [ boolean(1) "true" as "%1"."%1" ],
-| | | |  [ boolean(1) "true" as "%2"."%2" ]
-| | | ) [  ]
-| | ) [ "sys"."casewhen"(tinyint(2) "2", tinyint(3) "4", char(1) "c", char(1) 
NULL) as "sub0"."c0" ]
+| | crossproduct (
+| | |  [ boolean(1) "true" as "%1"."%1" ],
+| | |  [ boolean(1) "true" as "%2"."%2" ]
+| | ) [  ]
 | ) [  ]
 ) [ tinyint(1) "1" ]
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to