Changeset: c3a229f5cedf for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c3a229f5cedf
Modified Files:
        sql/server/rel_optimizer.c
        sql/test/SQLancer/Tests/sqlancer13.test
Branch: default
Log Message:

Do a cleaner job to bind a SQL function


diffs (84 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
@@ -13,6 +13,7 @@
 #include "rel_exp.h"
 #include "rel_prop.h"
 #include "rel_dump.h"
+#include "rel_select.h"
 #include "rel_planner.h"
 #include "rel_propagate.h"
 #include "rel_rewriter.h"
@@ -3107,27 +3108,25 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                                        sql_exp *lle = l->h->data;
                                        sql_exp *lre = l->h->next->data;
                                        if (!exp_is_atom(lle) && 
exp_is_atom(lre) && exp_is_atom(re)) {
-                                               sql_subtype et = 
*exp_subtype(e);
                                                /* (x*c1)*c2 -> x * (c1*c2) */
-                                               list *l = sa_list(sql->sa);
-
-                                               /* lre and re may have 
different types, so compute supertype */
-                                               if (rel_convert_types(sql, 
NULL, NULL, &lre, &re, 1, type_equal) < 0)
-                                                       return NULL;
-                                               append(l, lre);
-                                               append(l, re);
-                                               le->l = l;
-                                               le->f = sql_bind_func(sql, 
"sys", "sql_mul", exp_subtype(lre), exp_subtype(re), F_FUNC);
-                                               exp_sum_scales(le->f, lre, re);
-                                               l = e->l;
-                                               l->h->data = lle;
-                                               l->h->next->data = le;
-                                               e->f = sql_bind_func(sql, 
"sys", "sql_mul", exp_subtype(lle), exp_subtype(le), F_FUNC);
-                                               exp_sum_scales(e->f, lle, le);
-                                               if (subtype_cmp(&et, 
exp_subtype(e)) != 0)
-                                                       e = 
exp_convert(sql->sa, e, exp_subtype(e), &et);
+                                               sql_exp *ne = NULL;
+
+                                               if (!(le = rel_binop_(sql, 
NULL, lre, re, "sys", "sql_mul", card_value))) {
+                                                       sql->session->status = 
0;
+                                                       sql->errstr[0] = '\0';
+                                                       return e; /* error, 
fallback to original expression */
+                                               }
+                                               if (!(ne = rel_binop_(sql, 
NULL, lle, le, "sys", "sql_mul", card_value))) {
+                                                       sql->session->status = 
0;
+                                                       sql->errstr[0] = '\0';
+                                                       return e; /* error, 
fallback to original expression */
+                                               }
+                                               if (subtype_cmp(exp_subtype(e), 
exp_subtype(ne)) != 0)
+                                                       ne = 
exp_convert(sql->sa, ne, exp_subtype(ne), exp_subtype(e));
                                                (*changes)++;
-                                               return e;
+                                               if (exp_name(e))
+                                                       exp_prop_alias(sql->sa, 
ne, e);
+                                               return ne;
                                        }
                                }
                        }
diff --git a/sql/test/SQLancer/Tests/sqlancer13.test 
b/sql/test/SQLancer/Tests/sqlancer13.test
--- a/sql/test/SQLancer/Tests/sqlancer13.test
+++ b/sql/test/SQLancer/Tests/sqlancer13.test
@@ -392,3 +392,24 @@ 58 values hashing to 8fdc0683e1f7f9ff959
 
 statement ok
 ROLLBACK
+
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE TABLE "sys"."t1" ("c3" BOOLEAN)
+
+query T rowsort
+select (345*(case when t1.c3 then 0 else 578153020054067.9 end))*3 from t1
+union all
+select (345*(case when t1.c3 then 0 else 578153020054067.9 end))*3 from t1
+----
+
+query T rowsort
+select (1118551465*(case when t1.c3 then 0 else 0.5781530200540679 end))*3 
from t1
+union all
+select (1118551465*(case when t1.c3 then 0 else 0.5781530200540679 end))*3 
from t1
+----
+
+statement ok
+ROLLBACK
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to