mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
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. mysql-test/r/insert.result: test result mysql-test/t/insert.test: test case sql/field.cc: 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.
This commit is contained in:
@ -595,4 +595,9 @@ SELECT * FROM t2;
|
|||||||
c1
|
c1
|
||||||
15449237462
|
15449237462
|
||||||
DROP TABLE t1, t2;
|
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.
|
End of 5.0 tests.
|
||||||
|
@ -454,5 +454,14 @@ SELECT * FROM t2;
|
|||||||
|
|
||||||
DROP TABLE t1, 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.
|
--echo End of 5.0 tests.
|
||||||
|
|
||||||
|
@ -5987,13 +5987,13 @@ int Field_str::store(double nr)
|
|||||||
calculate the maximum number of significant digits if the 'f'-format
|
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).
|
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
|
If the exponent is negative, decrease digits by the number of leading zeros
|
||||||
after the decimal point that do not count as significant digits.
|
after the decimal point that do not count as significant digits.
|
||||||
*/
|
*/
|
||||||
if (exp < 0)
|
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
|
'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
|
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.
|
We also have to reserve one additional character if abs(exp) >= 100.
|
||||||
*/
|
*/
|
||||||
if (exp >= (int) digits || exp < -4)
|
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 */
|
/* Limit precision to DBL_DIG to avoid garbage past significant digits */
|
||||||
set_if_smaller(digits, DBL_DIG);
|
set_if_smaller(digits, DBL_DIG);
|
||||||
|
Reference in New Issue
Block a user