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]