summaryrefslogtreecommitdiff
path: root/sql/field.cc
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2020-07-24 17:03:15 +0400
committerAlexander Barkov <bar@mariadb.com>2020-07-27 08:03:23 +0400
commit29851b677ebbd954278d5530bde8e77fb865988f (patch)
tree1326b7551f77ec4cadf78839bbded9b1279caa4b /sql/field.cc
parent8460db12b5adb7337935d9a8a895eb72203343fc (diff)
downloadmariadb-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.cc9
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))