diff options
author | Alexander Barkov <bar@mariadb.com> | 2020-07-24 17:03:15 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2020-07-27 08:03:23 +0400 |
commit | 29851b677ebbd954278d5530bde8e77fb865988f (patch) | |
tree | 1326b7551f77ec4cadf78839bbded9b1279caa4b /sql/field.cc | |
parent | 8460db12b5adb7337935d9a8a895eb72203343fc (diff) | |
download | mariadb-git-29851b677ebbd954278d5530bde8e77fb865988f.tar.gz |
MDEV-23282 FLOAT(53,0) badly handles out-of-range values
truncate_double() did not take into account the max_value
limit in case when dec<NOT_FIXED_DEC.
Diffstat (limited to 'sql/field.cc')
-rw-r--r-- | sql/field.cc | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/sql/field.cc b/sql/field.cc index 5f0d340a1a5..32edff3dd2d 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -4627,11 +4627,12 @@ int truncate_double(double *nr, uint field_length, uint dec, { uint order= field_length - dec; uint step= array_elements(log_10) - 1; - max_value= 1.0; + double max_value_by_dec= 1.0; for (; order > step; order-= step) - max_value*= log_10[step]; - max_value*= log_10[order]; - max_value-= 1.0 / log_10[dec]; + max_value_by_dec*= log_10[step]; + max_value_by_dec*= log_10[order]; + max_value_by_dec-= 1.0 / log_10[dec]; + set_if_smaller(max_value, max_value_by_dec); /* Check for infinity so we don't get NaN in calculations */ if (!my_isinf(res)) |