Changeset: 084cd72813c8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=084cd72813c8
Modified Files:
        sql/server/sql_semantic.c
        sql/test/miscellaneous/Tests/simple_selects.stable.out
Branch: Oct2020
Log Message:

When computing the resulting decimal type, don't upcast to largest available 
every time


diffs (91 lines):

diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c
--- a/sql/server/sql_semantic.c
+++ b/sql/server/sql_semantic.c
@@ -185,14 +185,14 @@ result_datatype(sql_subtype *super, sql_
                char *tpe = "varchar";
                unsigned int digits = 0;
                if (!EC_VARCHAR(lclass)) {
-                               tpe = r->type->sqlname;
-                               digits = (!l->digits)?0:r->digits;
+                       tpe = r->type->sqlname;
+                       digits = (!l->digits)?0:r->digits;
                } else if (!EC_VARCHAR(rclass)) {
-                               tpe = l->type->sqlname;
-                               digits = (!r->digits)?0:l->digits;
+                       tpe = l->type->sqlname;
+                       digits = (!r->digits)?0:l->digits;
                } else { /* both */
-                               tpe = (l->type->base.id > 
r->type->base.id)?l->type->sqlname:r->type->sqlname;
-                               digits = 
(!l->digits||!r->digits)?0:sql_max(l->digits, r->digits);
+                       tpe = (l->type->base.id > 
r->type->base.id)?l->type->sqlname:r->type->sqlname;
+                       digits = (!l->digits||!r->digits)?0:sql_max(l->digits, 
r->digits);
                }
                sql_find_subtype(super, tpe, digits, 0);
        /* case b blob */
@@ -206,30 +206,38 @@ result_datatype(sql_subtype *super, sql_
                char *tpe = (l->type->base.id > 
r->type->base.id)?l->type->sqlname:r->type->sqlname;
                unsigned int digits = sql_max(l->digits, r->digits);
                unsigned int scale = sql_max(l->scale, r->scale);
-               if (l->type->radix == 10 || r->type->radix == 10) {
-                       digits = 0;
-                       /* change to radix 10 */
-                       if (l->type->radix == 2 && r->type->radix == 10) {
-                               digits = bits2digits(l->type->digits);
-                               digits = sql_max(r->digits, digits);
-                               scale = r->scale;
-                       } else if (l->type->radix == 10 && r->type->radix == 2) 
{
-                               digits = bits2digits(r->type->digits);
-                               digits = sql_max(l->digits, digits);
-                               scale = l->scale;
+
+               if (l->type->radix == 10 && r->type->radix == 10) {
+                       digits = scale + (sql_max(l->digits - l->scale, 
r->digits - r->scale));
+#ifdef HAVE_HGE
+                       if (digits > 39) {
+                               digits = 39;
+#else
+                       if (digits > 19) {
+                               digits = 19;
+#endif
+                               scale = MIN(scale, digits - 1);
                        }
+               } else if (l->type->radix == 2 && r->type->radix == 10) { /* 
change to radix 10 */
+                       digits = bits2digits(l->type->digits);
+                       digits = sql_max(r->digits, digits);
+                       scale = r->scale;
+               } else if (l->type->radix == 10 && r->type->radix == 2) { /* 
change to radix 10 */
+                       digits = bits2digits(r->type->digits);
+                       digits = sql_max(l->digits, digits);
+                       scale = l->scale;
                }
                sql_find_subtype(super, tpe, digits, scale);
        /* case d approximate numeric */
        } else if (EC_APPNUM(lclass) || EC_APPNUM(rclass)) {
                if (!EC_APPNUM(lclass)) {
-                               *super = *r;
+                       *super = *r;
                } else if (!EC_APPNUM(rclass)) {
-                               *super = *l;
+                       *super = *l;
                } else { /* both */
-                               char *tpe = (l->type->base.id > 
r->type->base.id)?l->type->sqlname:r->type->sqlname;
-                               unsigned int digits = sql_max(l->digits, 
r->digits); /* bits precision */
-                               sql_find_subtype(super, tpe, digits, 0);
+                       char *tpe = (l->type->base.id > 
r->type->base.id)?l->type->sqlname:r->type->sqlname;
+                       unsigned int digits = sql_max(l->digits, r->digits); /* 
bits precision */
+                       sql_find_subtype(super, tpe, digits, 0);
                }
        /* now its getting serious, ie e any 'case e' datetime data type */
        /* 'case f' interval types */
diff --git a/sql/test/miscellaneous/Tests/simple_selects.stable.out 
b/sql/test/miscellaneous/Tests/simple_selects.stable.out
--- a/sql/test/miscellaneous/Tests/simple_selects.stable.out
+++ b/sql/test/miscellaneous/Tests/simple_selects.stable.out
@@ -433,7 +433,7 @@ project (
 % .%2, .%3 # table_name
 % %2,  %3 # name
 % char,        decimal # type
-% 4,   40 # length
+% 4,   6 # length
 [ "abcd",      12.30   ]
 #start transaction;
 #create or replace function ups() returns int begin if null > 1 then return 1; 
else return 2; end if; end;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to