diff options
author | Sergey Glukhov <Sergey.Glukhov@sun.com> | 2009-04-09 14:19:31 +0500 |
---|---|---|
committer | Sergey Glukhov <Sergey.Glukhov@sun.com> | 2009-04-09 14:19:31 +0500 |
commit | db992986fe94ff7c5224786e0cccd1d4b846239d (patch) | |
tree | 9d9aa1b50ee3124c58fca06e76967949497654e2 | |
parent | 1f7efe4e1ce73a5ef0d08ed2906ec74d85db0743 (diff) | |
download | mariadb-git-db992986fe94ff7c5224786e0cccd1d4b846239d.tar.gz |
Bug#43833 Simple INSERT crashes the server
The crash happens due to wrong 'digits' variable value(0),
'digits' can not be 0, so the fix is use 1 as min allowed value.
-rw-r--r-- | mysql-test/r/insert.result | 5 | ||||
-rw-r--r-- | mysql-test/t/insert.test | 9 | ||||
-rw-r--r-- | sql/field.cc | 6 |
3 files changed, 17 insertions, 3 deletions
diff --git a/mysql-test/r/insert.result b/mysql-test/r/insert.result index 2e49bd373d6..c98ed104a69 100644 --- a/mysql-test/r/insert.result +++ b/mysql-test/r/insert.result @@ -595,4 +595,9 @@ SELECT * FROM t2; c1 15449237462 DROP TABLE t1, t2; +CREATE TABLE t1(f1 FLOAT); +INSERT INTO t1 VALUES (1.23); +CREATE TABLE t2(f1 CHAR(1)); +INSERT INTO t2 SELECT f1 FROM t1; +DROP TABLE t1, t2; End of 5.0 tests. diff --git a/mysql-test/t/insert.test b/mysql-test/t/insert.test index 0b5a12fa523..a1735c1a91f 100644 --- a/mysql-test/t/insert.test +++ b/mysql-test/t/insert.test @@ -454,5 +454,14 @@ SELECT * FROM t2; DROP TABLE t1, t2; +# +# Bug#43833 Simple INSERT crashes the server +# +CREATE TABLE t1(f1 FLOAT); +INSERT INTO t1 VALUES (1.23); +CREATE TABLE t2(f1 CHAR(1)); +INSERT INTO t2 SELECT f1 FROM t1; +DROP TABLE t1, t2; + --echo End of 5.0 tests. diff --git a/sql/field.cc b/sql/field.cc index 36cc4681dec..99e9d7803e1 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -5987,13 +5987,13 @@ int Field_str::store(double nr) calculate the maximum number of significant digits if the 'f'-format would be used (+1 for decimal point if the number has a fractional part). */ - digits= max(0, (int) max_length - fractional); + digits= max(1, (int) max_length - fractional); /* If the exponent is negative, decrease digits by the number of leading zeros after the decimal point that do not count as significant digits. */ if (exp < 0) - digits= max(0, (int) digits + exp); + digits= max(1, (int) digits + exp); /* 'e'-format is used only if the exponent is less than -4 or greater than or equal to the precision. In this case we need to adjust the number of @@ -6001,7 +6001,7 @@ int Field_str::store(double nr) We also have to reserve one additional character if abs(exp) >= 100. */ if (exp >= (int) digits || exp < -4) - digits= max(0, (int) (max_length - 5 - (exp >= 100 || exp <= -100))); + digits= max(1, (int) (max_length - 5 - (exp >= 100 || exp <= -100))); /* Limit precision to DBL_DIG to avoid garbage past significant digits */ set_if_smaller(digits, DBL_DIG); |