Changeset: f71367787744 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f71367787744
Modified Files:
        sql/server/rel_dump.c
        sql/server/rel_exp.c
        sql/test/SQLancer/Tests/sqlancer19.SQL.py
Branch: Jul2021
Log Message:

Don't use converted expression to computed the fixed digits and scale needed 
for division function, use the converted expression instead


diffs (75 lines):

diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -1242,9 +1242,33 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                                sql_exp *l = exps->h->data;
                                                sql_exp *r = 
exps->h->next->data;
 
+                                               /* Find converted value type 
for division and update function output type */
                                                if (f->func->fix_scale == 
SCALE_DIV) {
-                                                       if (!(exps->h->data = 
exp_scale_algebra(sql, f, NULL, l, r)))
-                                                               return NULL;
+                                                       sql_subtype *lt = 
is_convert(l->type) ? ((sql_subtype*)exp_fromtype(l)) : exp_subtype(l);
+                                                       sql_subtype *rt = 
exp_subtype(r);
+
+                                                       if (lt->type->scale == 
SCALE_FIX && rt->scale && strcmp(f->func->imp, "/") == 0) {
+                                                               sql_subtype 
*res = f->res->h->data;
+                                                               unsigned int 
scaleL = (lt->scale < 3) ? 3 : lt->scale;
+                                                               unsigned int 
scale = scaleL;
+                                                               scaleL += 
rt->scale;
+                                                               unsigned int 
digL = lt->digits + (scaleL - lt->scale);
+                                                               unsigned int 
digits = (digL > rt->digits) ? digL : rt->digits;
+
+#ifdef HAVE_HGE
+                                                               if 
(res->type->radix == 10 && digits > 39)
+                                                                       digits 
= 39;
+                                                               if 
(res->type->radix == 2 && digits > 128)
+                                                                       digits 
= 128;
+#else
+                                                               if 
(res->type->radix == 10 && digits > 19)
+                                                                       digits 
= 19;
+                                                               if 
(res->type->radix == 2 && digits > 64)
+                                                                       digits 
= 64;
+#endif
+
+                                                               
sql_find_subtype(res, lt->type->base.name, digits, scale);
+                                                       }
                                                } else if (f->func->fix_scale 
== SCALE_MUL) {
                                                        exp_sum_scales(f, l, r);
                                                } else if (f->func->fix_scale 
== DIGITS_ADD) {
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -2872,10 +2872,8 @@ exp_scale_algebra(mvc *sql, sql_subfunc 
 #endif
 
                sql_find_subtype(&nlt, lt->type->base.name, digL, scaleL);
-               if (nlt.digits < scaleL) {
-                   sql_error(sql, 01, SQLSTATE(42000) "Scale (%d) overflows 
type", scaleL);
-                       return NULL;
-               }
+               if (nlt.digits < scaleL)
+                       return sql_error(sql, 01, SQLSTATE(42000) "Scale (%d) 
overflows type", scaleL);
                l = exp_check_type(sql, &nlt, rel, l, type_equal);
 
                sql_find_subtype(res, lt->type->base.name, digits, scale);
diff --git a/sql/test/SQLancer/Tests/sqlancer19.SQL.py 
b/sql/test/SQLancer/Tests/sqlancer19.SQL.py
--- a/sql/test/SQLancer/Tests/sqlancer19.SQL.py
+++ b/sql/test/SQLancer/Tests/sqlancer19.SQL.py
@@ -1,4 +1,5 @@
 import os
+from decimal import Decimal
 
 from MonetDBtesting.sqltest import SQLTestCase
 
@@ -71,6 +72,10 @@ with SQLTestCase() as cli:
         .assertSucceeded().assertDataResultMatch([(18,)])
     cli.execute("SELECT CASE WHEN 1 BETWEEN 1 AND 2 THEN 3*6 END FROM rt3 
where rt3.c0 = 1;") \
         .assertSucceeded().assertDataResultMatch([(18,)])
+    cli.execute("SELECT 3 / 0.84 FROM t3 where t3.c0 = 1;") \
+        .assertSucceeded().assertDataResultMatch([(Decimal('3.571'),)])
+    cli.execute("SELECT 3 / 0.84 FROM rt3 where rt3.c0 = 1;") \
+        .assertSucceeded().assertDataResultMatch([(Decimal('3.571'),)])
     cli.execute("ROLLBACK;")
 
     cli.execute("""
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to