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