MDEV-8502 DECIMAL accepts out of range DEFAULT values
MDEV-10277 Redundant NOTE when inserting '0.00001 ' into a DECIMAL(2,1) column
This commit is contained in:
parent
305bbbce61
commit
652e799a38
@ -155,7 +155,7 @@ connection master;
|
|||||||
f6 ENUM('a', 'b', 'c') default 'a',
|
f6 ENUM('a', 'b', 'c') default 'a',
|
||||||
f7 DECIMAL(17,9) default '1000.00',
|
f7 DECIMAL(17,9) default '1000.00',
|
||||||
f8 MEDIUMBLOB,
|
f8 MEDIUMBLOB,
|
||||||
f9 NUMERIC(6,4) default '2000.00',
|
f9 NUMERIC(6,2) default '2000.00',
|
||||||
f10 VARCHAR(1024),
|
f10 VARCHAR(1024),
|
||||||
f11 BINARY(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
|
f11 BINARY(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
|
||||||
f12 SET('a', 'b', 'c') default 'b')
|
f12 SET('a', 'b', 'c') default 'b')
|
||||||
@ -178,7 +178,7 @@ connection master;
|
|||||||
f5 DOUBLE DEFAULT '2.00',
|
f5 DOUBLE DEFAULT '2.00',
|
||||||
f6 DECIMAL(17,9) default '1000.00',
|
f6 DECIMAL(17,9) default '1000.00',
|
||||||
f7 MEDIUMBLOB,
|
f7 MEDIUMBLOB,
|
||||||
f8 NUMERIC(6,4) default '2000.00',
|
f8 NUMERIC(6,2) default '2000.00',
|
||||||
f9 VARCHAR(1024),
|
f9 VARCHAR(1024),
|
||||||
f10 BINARY(20) not null default '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
|
f10 BINARY(20) not null default '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
|
||||||
f11 CHAR(255))
|
f11 CHAR(255))
|
||||||
|
@ -2151,5 +2151,95 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
1 SIMPLE t1 ref a a 6 const 1 Using where; Using index; Using filesort
|
1 SIMPLE t1 ref a a 6 const 1 Using where; Using index; Using filesort
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
#
|
#
|
||||||
|
# MDEV-8502 DECIMAL accepts out of range DEFAULT values
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT 10000);
|
||||||
|
ERROR 42000: Invalid default value for 'a'
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT 10000.0);
|
||||||
|
ERROR 42000: Invalid default value for 'a'
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT 10000e0);
|
||||||
|
ERROR 42000: Invalid default value for 'a'
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT '10000.0');
|
||||||
|
ERROR 42000: Invalid default value for 'a'
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT '10000.1');
|
||||||
|
ERROR 42000: Invalid default value for 'a'
|
||||||
|
#
|
||||||
|
# MDEV-10277 Redundant NOTE when inserting '0.00001 ' into a DECIMAL(2,1) column
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1));
|
||||||
|
INSERT INTO t1 VALUES ('0.00001 ');
|
||||||
|
Warnings:
|
||||||
|
Note 1265 Data truncated for column 'a' at row 1
|
||||||
|
INSERT INTO t1 VALUES ('1e-10000 ');
|
||||||
|
Warnings:
|
||||||
|
Note 1265 Data truncated for column 'a' at row 1
|
||||||
|
INSERT INTO t1 VALUES ('0.1 ');
|
||||||
|
Warnings:
|
||||||
|
Note 1265 Data truncated for column 'a' at row 1
|
||||||
|
INSERT INTO t1 VALUES ('0.111 ');
|
||||||
|
Warnings:
|
||||||
|
Note 1265 Data truncated for column 'a' at row 1
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a
|
||||||
|
0.0
|
||||||
|
0.0
|
||||||
|
0.1
|
||||||
|
0.1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT '1e-10000');
|
||||||
|
Warnings:
|
||||||
|
Note 1265 Data truncated for column 'a' at row 1
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` decimal(2,1) DEFAULT '0.0'
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT '0.1 ');
|
||||||
|
Warnings:
|
||||||
|
Note 1265 Data truncated for column 'a' at row 1
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` decimal(2,1) DEFAULT '0.1'
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT '0.10001 ');
|
||||||
|
Warnings:
|
||||||
|
Note 1265 Data truncated for column 'a' at row 1
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` decimal(2,1) DEFAULT '0.1'
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT '0.10001');
|
||||||
|
Warnings:
|
||||||
|
Note 1265 Data truncated for column 'a' at row 1
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` decimal(2,1) DEFAULT '0.1'
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT 0.10001);
|
||||||
|
Warnings:
|
||||||
|
Note 1265 Data truncated for column 'a' at row 1
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` decimal(2,1) DEFAULT '0.1'
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT 0.10001e0);
|
||||||
|
Warnings:
|
||||||
|
Note 1265 Data truncated for column 'a' at row 1
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` decimal(2,1) DEFAULT '0.1'
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
# End of 10.1 tests
|
# End of 10.1 tests
|
||||||
#
|
#
|
||||||
|
@ -96,13 +96,11 @@ f5 DOUBLE DEFAULT '2.00',
|
|||||||
f6 ENUM('a', 'b', 'c') default 'a',
|
f6 ENUM('a', 'b', 'c') default 'a',
|
||||||
f7 DECIMAL(17,9) default '1000.00',
|
f7 DECIMAL(17,9) default '1000.00',
|
||||||
f8 MEDIUMBLOB,
|
f8 MEDIUMBLOB,
|
||||||
f9 NUMERIC(6,4) default '2000.00',
|
f9 NUMERIC(6,2) default '2000.00',
|
||||||
f10 VARCHAR(1024),
|
f10 VARCHAR(1024),
|
||||||
f11 BINARY(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
|
f11 BINARY(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
|
||||||
f12 SET('a', 'b', 'c') default 'b')
|
f12 SET('a', 'b', 'c') default 'b')
|
||||||
ENGINE='InnoDB';
|
ENGINE='InnoDB';
|
||||||
Warnings:
|
|
||||||
Warning 1264 Out of range value for column 'f9' at row 1
|
|
||||||
|
|
||||||
CREATE TABLE t3 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
|
CREATE TABLE t3 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
|
||||||
/* extra */
|
/* extra */
|
||||||
@ -119,13 +117,11 @@ CREATE TABLE t4 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
|
|||||||
f5 DOUBLE DEFAULT '2.00',
|
f5 DOUBLE DEFAULT '2.00',
|
||||||
f6 DECIMAL(17,9) default '1000.00',
|
f6 DECIMAL(17,9) default '1000.00',
|
||||||
f7 MEDIUMBLOB,
|
f7 MEDIUMBLOB,
|
||||||
f8 NUMERIC(6,4) default '2000.00',
|
f8 NUMERIC(6,2) default '2000.00',
|
||||||
f9 VARCHAR(1024),
|
f9 VARCHAR(1024),
|
||||||
f10 BINARY(20) not null default '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
|
f10 BINARY(20) not null default '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
|
||||||
f11 CHAR(255))
|
f11 CHAR(255))
|
||||||
ENGINE='InnoDB';
|
ENGINE='InnoDB';
|
||||||
Warnings:
|
|
||||||
Warning 1264 Out of range value for column 'f8' at row 1
|
|
||||||
|
|
||||||
CREATE TABLE t31 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
|
CREATE TABLE t31 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
|
||||||
/* extra */
|
/* extra */
|
||||||
@ -184,9 +180,6 @@ INSERT into t2 values (2, 2, 2, 'second',
|
|||||||
(3, 3, 3, 'third',
|
(3, 3, 3, 'third',
|
||||||
3.0, 'b', 3000.0003, 'f8: medium size blob', 3000, 'f10: some var char',
|
3.0, 'b', 3000.0003, 'f8: medium size blob', 3000, 'f10: some var char',
|
||||||
'01234567', 'c');
|
'01234567', 'c');
|
||||||
Warnings:
|
|
||||||
Warning 1264 Out of range value for column 'f9' at row 1
|
|
||||||
Warning 1264 Out of range value for column 'f9' at row 2
|
|
||||||
INSERT into t3 set f1=1, f2=1, f3=1, f4='first', f10='f10: some var char';
|
INSERT into t3 set f1=1, f2=1, f3=1, f4='first', f10='f10: some var char';
|
||||||
INSERT into t4 set f1=1, f2=1, f3=1, f4='first', f7='f7: medium size blob', f10='f10:
|
INSERT into t4 set f1=1, f2=1, f3=1, f4='first', f7='f7: medium size blob', f10='f10:
|
||||||
binary data';
|
binary data';
|
||||||
|
@ -96,13 +96,11 @@ f5 DOUBLE DEFAULT '2.00',
|
|||||||
f6 ENUM('a', 'b', 'c') default 'a',
|
f6 ENUM('a', 'b', 'c') default 'a',
|
||||||
f7 DECIMAL(17,9) default '1000.00',
|
f7 DECIMAL(17,9) default '1000.00',
|
||||||
f8 MEDIUMBLOB,
|
f8 MEDIUMBLOB,
|
||||||
f9 NUMERIC(6,4) default '2000.00',
|
f9 NUMERIC(6,2) default '2000.00',
|
||||||
f10 VARCHAR(1024),
|
f10 VARCHAR(1024),
|
||||||
f11 BINARY(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
|
f11 BINARY(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
|
||||||
f12 SET('a', 'b', 'c') default 'b')
|
f12 SET('a', 'b', 'c') default 'b')
|
||||||
ENGINE='MyISAM';
|
ENGINE='MyISAM';
|
||||||
Warnings:
|
|
||||||
Warning 1264 Out of range value for column 'f9' at row 1
|
|
||||||
|
|
||||||
CREATE TABLE t3 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
|
CREATE TABLE t3 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
|
||||||
/* extra */
|
/* extra */
|
||||||
@ -119,13 +117,11 @@ CREATE TABLE t4 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
|
|||||||
f5 DOUBLE DEFAULT '2.00',
|
f5 DOUBLE DEFAULT '2.00',
|
||||||
f6 DECIMAL(17,9) default '1000.00',
|
f6 DECIMAL(17,9) default '1000.00',
|
||||||
f7 MEDIUMBLOB,
|
f7 MEDIUMBLOB,
|
||||||
f8 NUMERIC(6,4) default '2000.00',
|
f8 NUMERIC(6,2) default '2000.00',
|
||||||
f9 VARCHAR(1024),
|
f9 VARCHAR(1024),
|
||||||
f10 BINARY(20) not null default '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
|
f10 BINARY(20) not null default '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
|
||||||
f11 CHAR(255))
|
f11 CHAR(255))
|
||||||
ENGINE='MyISAM';
|
ENGINE='MyISAM';
|
||||||
Warnings:
|
|
||||||
Warning 1264 Out of range value for column 'f8' at row 1
|
|
||||||
|
|
||||||
CREATE TABLE t31 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
|
CREATE TABLE t31 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
|
||||||
/* extra */
|
/* extra */
|
||||||
@ -184,9 +180,6 @@ INSERT into t2 values (2, 2, 2, 'second',
|
|||||||
(3, 3, 3, 'third',
|
(3, 3, 3, 'third',
|
||||||
3.0, 'b', 3000.0003, 'f8: medium size blob', 3000, 'f10: some var char',
|
3.0, 'b', 3000.0003, 'f8: medium size blob', 3000, 'f10: some var char',
|
||||||
'01234567', 'c');
|
'01234567', 'c');
|
||||||
Warnings:
|
|
||||||
Warning 1264 Out of range value for column 'f9' at row 1
|
|
||||||
Warning 1264 Out of range value for column 'f9' at row 2
|
|
||||||
INSERT into t3 set f1=1, f2=1, f3=1, f4='first', f10='f10: some var char';
|
INSERT into t3 set f1=1, f2=1, f3=1, f4='first', f10='f10: some var char';
|
||||||
INSERT into t4 set f1=1, f2=1, f3=1, f4='first', f7='f7: medium size blob', f10='f10:
|
INSERT into t4 set f1=1, f2=1, f3=1, f4='first', f7='f7: medium size blob', f10='f10:
|
||||||
binary data';
|
binary data';
|
||||||
|
@ -1684,6 +1684,57 @@ INSERT INTO t1 VALUES (1),(2),(3),(4),(5);
|
|||||||
EXPLAIN SELECT * FROM t1 WHERE a='ax' ORDER BY a;
|
EXPLAIN SELECT * FROM t1 WHERE a='ax' ORDER BY a;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-8502 DECIMAL accepts out of range DEFAULT values
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--error ER_INVALID_DEFAULT
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT 10000);
|
||||||
|
--error ER_INVALID_DEFAULT
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT 10000.0);
|
||||||
|
--error ER_INVALID_DEFAULT
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT 10000e0);
|
||||||
|
--error ER_INVALID_DEFAULT
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT '10000.0');
|
||||||
|
--error ER_INVALID_DEFAULT
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT '10000.1');
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-10277 Redundant NOTE when inserting '0.00001 ' into a DECIMAL(2,1) column
|
||||||
|
--echo #
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1));
|
||||||
|
INSERT INTO t1 VALUES ('0.00001 ');
|
||||||
|
INSERT INTO t1 VALUES ('1e-10000 ');
|
||||||
|
INSERT INTO t1 VALUES ('0.1 ');
|
||||||
|
INSERT INTO t1 VALUES ('0.111 ');
|
||||||
|
SELECT * FROM t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT '1e-10000');
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT '0.1 ');
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT '0.10001 ');
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT '0.10001');
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT 0.10001);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a DECIMAL(2,1) DEFAULT 0.10001e0);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.1 tests
|
--echo # End of 10.1 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
69
sql/field.cc
69
sql/field.cc
@ -1477,9 +1477,11 @@ Value_source::Converter_string_to_number::check_edom_and_truncation(THD *thd,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
int Field_num::check_edom_and_truncation(const char *type, bool edom,
|
int Field_num::check_edom_and_important_data_truncation(const char *type,
|
||||||
|
bool edom,
|
||||||
CHARSET_INFO *cs,
|
CHARSET_INFO *cs,
|
||||||
const char *str, uint length,
|
const char *str,
|
||||||
|
uint length,
|
||||||
const char *end)
|
const char *end)
|
||||||
{
|
{
|
||||||
/* Test if we get an empty string or garbage */
|
/* Test if we get an empty string or garbage */
|
||||||
@ -1495,12 +1497,23 @@ int Field_num::check_edom_and_truncation(const char *type, bool edom,
|
|||||||
set_warning(WARN_DATA_TRUNCATED, 1);
|
set_warning(WARN_DATA_TRUNCATED, 1);
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
if (end < str + length)
|
|
||||||
set_note(WARN_DATA_TRUNCATED, 1);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Field_num::check_edom_and_truncation(const char *type, bool edom,
|
||||||
|
CHARSET_INFO *cs,
|
||||||
|
const char *str, uint length,
|
||||||
|
const char *end)
|
||||||
|
{
|
||||||
|
int rc= check_edom_and_important_data_truncation(type, edom,
|
||||||
|
cs, str, length, end);
|
||||||
|
if (!rc && end < str + length)
|
||||||
|
set_note(WARN_DATA_TRUNCATED, 1);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Conver a string to an integer then check bounds.
|
Conver a string to an integer then check bounds.
|
||||||
|
|
||||||
@ -3006,6 +3019,7 @@ void Field_new_decimal::set_value_on_overflow(my_decimal *decimal_value,
|
|||||||
Otherwise sets maximal number that can be stored in the field.
|
Otherwise sets maximal number that can be stored in the field.
|
||||||
|
|
||||||
@param decimal_value my_decimal
|
@param decimal_value my_decimal
|
||||||
|
@param [OUT] native_error the error returned by my_decimal2binary().
|
||||||
|
|
||||||
@retval
|
@retval
|
||||||
0 ok
|
0 ok
|
||||||
@ -3013,7 +3027,8 @@ void Field_new_decimal::set_value_on_overflow(my_decimal *decimal_value,
|
|||||||
1 error
|
1 error
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool Field_new_decimal::store_value(const my_decimal *decimal_value)
|
bool Field_new_decimal::store_value(const my_decimal *decimal_value,
|
||||||
|
int *native_error)
|
||||||
{
|
{
|
||||||
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED;
|
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED;
|
||||||
int error= 0;
|
int error= 0;
|
||||||
@ -3042,11 +3057,14 @@ bool Field_new_decimal::store_value(const my_decimal *decimal_value)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (warn_if_overflow(my_decimal2binary(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW,
|
*native_error= my_decimal2binary(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW,
|
||||||
decimal_value, ptr, precision, dec)))
|
decimal_value, ptr, precision, dec);
|
||||||
|
|
||||||
|
if (*native_error == E_DEC_OVERFLOW)
|
||||||
{
|
{
|
||||||
my_decimal buff;
|
my_decimal buff;
|
||||||
DBUG_PRINT("info", ("overflow"));
|
DBUG_PRINT("info", ("overflow"));
|
||||||
|
set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
|
||||||
set_value_on_overflow(&buff, decimal_value->sign());
|
set_value_on_overflow(&buff, decimal_value->sign());
|
||||||
my_decimal2binary(E_DEC_FATAL_ERROR, &buff, ptr, precision, dec);
|
my_decimal2binary(E_DEC_FATAL_ERROR, &buff, ptr, precision, dec);
|
||||||
error= 1;
|
error= 1;
|
||||||
@ -3057,6 +3075,16 @@ bool Field_new_decimal::store_value(const my_decimal *decimal_value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Field_new_decimal::store_value(const my_decimal *decimal_value)
|
||||||
|
{
|
||||||
|
int native_error;
|
||||||
|
bool rc= store_value(decimal_value, &native_error);
|
||||||
|
if (!rc && native_error == E_DEC_TRUNCATED)
|
||||||
|
set_note(WARN_DATA_TRUNCATED, 1);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int Field_new_decimal::store(const char *from, uint length,
|
int Field_new_decimal::store(const char *from, uint length,
|
||||||
CHARSET_INFO *charset_arg)
|
CHARSET_INFO *charset_arg)
|
||||||
{
|
{
|
||||||
@ -3084,9 +3112,10 @@ int Field_new_decimal::store(const char *from, uint length,
|
|||||||
|
|
||||||
if (thd->count_cuted_fields)
|
if (thd->count_cuted_fields)
|
||||||
{
|
{
|
||||||
if (check_edom_and_truncation("decimal",
|
if (check_edom_and_important_data_truncation("decimal",
|
||||||
err && err != E_DEC_TRUNCATED,
|
err && err != E_DEC_TRUNCATED,
|
||||||
charset_arg, from, length, end))
|
charset_arg,
|
||||||
|
from, length, end))
|
||||||
{
|
{
|
||||||
if (!thd->abort_on_warning)
|
if (!thd->abort_on_warning)
|
||||||
{
|
{
|
||||||
@ -3109,12 +3138,6 @@ int Field_new_decimal::store(const char *from, uint length,
|
|||||||
}
|
}
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
E_DEC_TRUNCATED means minor truncation '1e-1000000000000' -> 0.0
|
|
||||||
A note should be enough.
|
|
||||||
*/
|
|
||||||
if (err == E_DEC_TRUNCATED)
|
|
||||||
set_note(WARN_DATA_TRUNCATED, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef DBUG_OFF
|
#ifndef DBUG_OFF
|
||||||
@ -3122,7 +3145,21 @@ int Field_new_decimal::store(const char *from, uint length,
|
|||||||
DBUG_PRINT("enter", ("value: %s",
|
DBUG_PRINT("enter", ("value: %s",
|
||||||
dbug_decimal_as_string(dbug_buff, &decimal_value)));
|
dbug_decimal_as_string(dbug_buff, &decimal_value)));
|
||||||
#endif
|
#endif
|
||||||
store_value(&decimal_value);
|
int err2;
|
||||||
|
if (store_value(&decimal_value, &err2))
|
||||||
|
DBUG_RETURN(1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
E_DEC_TRUNCATED means minor truncation, a note should be enough:
|
||||||
|
- in err: str2my_decimal() truncated '1e-1000000000000' to 0.0
|
||||||
|
- in err2: store_value() truncated 1.123 to 1.12, e.g. for DECIMAL(10,2)
|
||||||
|
Also, we send a note if a string had some trailing spaces: '1.12 '
|
||||||
|
*/
|
||||||
|
if (thd->count_cuted_fields &&
|
||||||
|
(err == E_DEC_TRUNCATED ||
|
||||||
|
err2 == E_DEC_TRUNCATED ||
|
||||||
|
end < from + length))
|
||||||
|
set_note(WARN_DATA_TRUNCATED, 1);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1471,6 +1471,10 @@ protected:
|
|||||||
|
|
||||||
class Field_num :public Field {
|
class Field_num :public Field {
|
||||||
protected:
|
protected:
|
||||||
|
int check_edom_and_important_data_truncation(const char *type, bool edom,
|
||||||
|
CHARSET_INFO *cs,
|
||||||
|
const char *str, uint length,
|
||||||
|
const char *end_of_num);
|
||||||
int check_edom_and_truncation(const char *type, bool edom,
|
int check_edom_and_truncation(const char *type, bool edom,
|
||||||
CHARSET_INFO *cs,
|
CHARSET_INFO *cs,
|
||||||
const char *str, uint length,
|
const char *str, uint length,
|
||||||
@ -1708,6 +1712,7 @@ public:
|
|||||||
Item_result result_type () const { return DECIMAL_RESULT; }
|
Item_result result_type () const { return DECIMAL_RESULT; }
|
||||||
int reset(void);
|
int reset(void);
|
||||||
bool store_value(const my_decimal *decimal_value);
|
bool store_value(const my_decimal *decimal_value);
|
||||||
|
bool store_value(const my_decimal *decimal_value, int *native_error);
|
||||||
void set_value_on_overflow(my_decimal *decimal_value, bool sign);
|
void set_value_on_overflow(my_decimal *decimal_value, bool sign);
|
||||||
int store(const char *to, uint length, CHARSET_INFO *charset);
|
int store(const char *to, uint length, CHARSET_INFO *charset);
|
||||||
int store(double nr);
|
int store(double nr);
|
||||||
|
@ -96,13 +96,11 @@ f5 DOUBLE DEFAULT '2.00',
|
|||||||
f6 ENUM('a', 'b', 'c') default 'a',
|
f6 ENUM('a', 'b', 'c') default 'a',
|
||||||
f7 DECIMAL(17,9) default '1000.00',
|
f7 DECIMAL(17,9) default '1000.00',
|
||||||
f8 MEDIUMBLOB,
|
f8 MEDIUMBLOB,
|
||||||
f9 NUMERIC(6,4) default '2000.00',
|
f9 NUMERIC(6,2) default '2000.00',
|
||||||
f10 VARCHAR(1024),
|
f10 VARCHAR(1024),
|
||||||
f11 BINARY(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
|
f11 BINARY(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
|
||||||
f12 SET('a', 'b', 'c') default 'b')
|
f12 SET('a', 'b', 'c') default 'b')
|
||||||
ENGINE=TokuDB;
|
ENGINE=TokuDB;
|
||||||
Warnings:
|
|
||||||
Warning 1264 Out of range value for column 'f9' at row 1
|
|
||||||
|
|
||||||
CREATE TABLE t3 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
|
CREATE TABLE t3 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
|
||||||
/* extra */
|
/* extra */
|
||||||
@ -119,13 +117,11 @@ CREATE TABLE t4 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
|
|||||||
f5 DOUBLE DEFAULT '2.00',
|
f5 DOUBLE DEFAULT '2.00',
|
||||||
f6 DECIMAL(17,9) default '1000.00',
|
f6 DECIMAL(17,9) default '1000.00',
|
||||||
f7 MEDIUMBLOB,
|
f7 MEDIUMBLOB,
|
||||||
f8 NUMERIC(6,4) default '2000.00',
|
f8 NUMERIC(6,2) default '2000.00',
|
||||||
f9 VARCHAR(1024),
|
f9 VARCHAR(1024),
|
||||||
f10 BINARY(20) not null default '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
|
f10 BINARY(20) not null default '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
|
||||||
f11 CHAR(255))
|
f11 CHAR(255))
|
||||||
ENGINE=TokuDB;
|
ENGINE=TokuDB;
|
||||||
Warnings:
|
|
||||||
Warning 1264 Out of range value for column 'f8' at row 1
|
|
||||||
|
|
||||||
CREATE TABLE t31 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
|
CREATE TABLE t31 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
|
||||||
/* extra */
|
/* extra */
|
||||||
@ -184,9 +180,6 @@ INSERT into t2 values (2, 2, 2, 'second',
|
|||||||
(3, 3, 3, 'third',
|
(3, 3, 3, 'third',
|
||||||
3.0, 'b', 3000.0003, 'f8: medium size blob', 3000, 'f10: some var char',
|
3.0, 'b', 3000.0003, 'f8: medium size blob', 3000, 'f10: some var char',
|
||||||
'01234567', 'c');
|
'01234567', 'c');
|
||||||
Warnings:
|
|
||||||
Warning 1264 Out of range value for column 'f9' at row 1
|
|
||||||
Warning 1264 Out of range value for column 'f9' at row 2
|
|
||||||
INSERT into t3 set f1=1, f2=1, f3=1, f4='first', f10='f10: some var char';
|
INSERT into t3 set f1=1, f2=1, f3=1, f4='first', f10='f10: some var char';
|
||||||
INSERT into t4 set f1=1, f2=1, f3=1, f4='first', f7='f7: medium size blob', f10='f10:
|
INSERT into t4 set f1=1, f2=1, f3=1, f4='first', f7='f7: medium size blob', f10='f10:
|
||||||
binary data';
|
binary data';
|
||||||
|
Loading…
x
Reference in New Issue
Block a user