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