summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Glukhov <Sergey.Glukhov@sun.com>2009-04-09 14:19:31 +0500
committerSergey Glukhov <Sergey.Glukhov@sun.com>2009-04-09 14:19:31 +0500
commitdb992986fe94ff7c5224786e0cccd1d4b846239d (patch)
tree9d9aa1b50ee3124c58fca06e76967949497654e2
parent1f7efe4e1ce73a5ef0d08ed2906ec74d85db0743 (diff)
downloadmariadb-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.result5
-rw-r--r--mysql-test/t/insert.test9
-rw-r--r--sql/field.cc6
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);