Loading mysql-test/r/range.result +2 −2 Original line number Diff line number Diff line Loading @@ -504,8 +504,8 @@ select count(*) from t1 where x = 18446744073709551601; count(*) 1 create table t2 (x bigint not null); insert into t2(x) values (0xfffffffffffffff0); insert into t2(x) values (0xfffffffffffffff1); insert into t2(x) values (-16); insert into t2(x) values (-15); select * from t2; x -16 Loading mysql-test/r/select.result +17 −0 Original line number Diff line number Diff line Loading @@ -2819,3 +2819,20 @@ select min(key1) from t1 where key1 >= 0.3762 and rand() + 0.5 >= 0.5; min(key1) 0.37619999051094 DROP TABLE t1,t2; create table t1(a bigint unsigned, b bigint); insert into t1 values (0xfffffffffffffffff, 0xfffffffffffffffff), (0x10000000000000000, 0x10000000000000000), (0x8fffffffffffffff, 0x8fffffffffffffff); Warnings: Warning 1264 Data truncated; out of range for column 'a' at row 1 Warning 1264 Data truncated; out of range for column 'b' at row 1 Warning 1264 Data truncated; out of range for column 'a' at row 2 Warning 1264 Data truncated; out of range for column 'b' at row 2 Warning 1264 Data truncated; out of range for column 'b' at row 3 select hex(a), hex(b) from t1; hex(a) hex(b) FFFFFFFFFFFFFFFF 7FFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF 7FFFFFFFFFFFFFFF 8FFFFFFFFFFFFFFF 7FFFFFFFFFFFFFFF drop table t1; End of 4.1 tests mysql-test/t/range.test +2 −2 Original line number Diff line number Diff line Loading @@ -400,8 +400,8 @@ select count(*) from t1 where x = 18446744073709551601; create table t2 (x bigint not null); insert into t2(x) values (0xfffffffffffffff0); insert into t2(x) values (0xfffffffffffffff1); insert into t2(x) values (-16); insert into t2(x) values (-15); select * from t2; select count(*) from t2 where x>0; select count(*) from t2 where x=0; Loading mysql-test/t/select.test +12 −1 Original line number Diff line number Diff line Loading @@ -2342,4 +2342,15 @@ select min(key1) from t1 where key1 >= 0.3762 and rand() + 0.5 >= 0.5; DROP TABLE t1,t2; --enable_ps_protocol # End of 4.1 tests # # Bug #22533: storing large hex strings # create table t1(a bigint unsigned, b bigint); insert into t1 values (0xfffffffffffffffff, 0xfffffffffffffffff), (0x10000000000000000, 0x10000000000000000), (0x8fffffffffffffff, 0x8fffffffffffffff); select hex(a), hex(b) from t1; drop table t1; --echo End of 4.1 tests sql/item.cc +19 −6 Original line number Diff line number Diff line Loading @@ -2369,18 +2369,31 @@ longlong Item_varbinary::val_int() int Item_varbinary::save_in_field(Field *field, bool no_conversions) { int error; field->set_notnull(); if (field->result_type() == STRING_RESULT) return field->store(str_value.ptr(), str_value.length(), collation.collation); ulonglong nr; uint32 length= str_value.length(); if (length > 8) { error=field->store(str_value.ptr(),str_value.length(),collation.collation); nr= field->flags & UNSIGNED_FLAG ? ULONGLONG_MAX : LONGLONG_MAX; goto warn; } else nr= (ulonglong) val_int(); if ((length == 8) && !(field->flags & UNSIGNED_FLAG) && (nr > LONGLONG_MAX)) { longlong nr=val_int(); error=field->store(nr); nr= LONGLONG_MAX; goto warn; } return error; return field->store((longlong) nr); warn: if (!field->store((longlong) nr)) field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); return 1; } Loading Loading
mysql-test/r/range.result +2 −2 Original line number Diff line number Diff line Loading @@ -504,8 +504,8 @@ select count(*) from t1 where x = 18446744073709551601; count(*) 1 create table t2 (x bigint not null); insert into t2(x) values (0xfffffffffffffff0); insert into t2(x) values (0xfffffffffffffff1); insert into t2(x) values (-16); insert into t2(x) values (-15); select * from t2; x -16 Loading
mysql-test/r/select.result +17 −0 Original line number Diff line number Diff line Loading @@ -2819,3 +2819,20 @@ select min(key1) from t1 where key1 >= 0.3762 and rand() + 0.5 >= 0.5; min(key1) 0.37619999051094 DROP TABLE t1,t2; create table t1(a bigint unsigned, b bigint); insert into t1 values (0xfffffffffffffffff, 0xfffffffffffffffff), (0x10000000000000000, 0x10000000000000000), (0x8fffffffffffffff, 0x8fffffffffffffff); Warnings: Warning 1264 Data truncated; out of range for column 'a' at row 1 Warning 1264 Data truncated; out of range for column 'b' at row 1 Warning 1264 Data truncated; out of range for column 'a' at row 2 Warning 1264 Data truncated; out of range for column 'b' at row 2 Warning 1264 Data truncated; out of range for column 'b' at row 3 select hex(a), hex(b) from t1; hex(a) hex(b) FFFFFFFFFFFFFFFF 7FFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF 7FFFFFFFFFFFFFFF 8FFFFFFFFFFFFFFF 7FFFFFFFFFFFFFFF drop table t1; End of 4.1 tests
mysql-test/t/range.test +2 −2 Original line number Diff line number Diff line Loading @@ -400,8 +400,8 @@ select count(*) from t1 where x = 18446744073709551601; create table t2 (x bigint not null); insert into t2(x) values (0xfffffffffffffff0); insert into t2(x) values (0xfffffffffffffff1); insert into t2(x) values (-16); insert into t2(x) values (-15); select * from t2; select count(*) from t2 where x>0; select count(*) from t2 where x=0; Loading
mysql-test/t/select.test +12 −1 Original line number Diff line number Diff line Loading @@ -2342,4 +2342,15 @@ select min(key1) from t1 where key1 >= 0.3762 and rand() + 0.5 >= 0.5; DROP TABLE t1,t2; --enable_ps_protocol # End of 4.1 tests # # Bug #22533: storing large hex strings # create table t1(a bigint unsigned, b bigint); insert into t1 values (0xfffffffffffffffff, 0xfffffffffffffffff), (0x10000000000000000, 0x10000000000000000), (0x8fffffffffffffff, 0x8fffffffffffffff); select hex(a), hex(b) from t1; drop table t1; --echo End of 4.1 tests
sql/item.cc +19 −6 Original line number Diff line number Diff line Loading @@ -2369,18 +2369,31 @@ longlong Item_varbinary::val_int() int Item_varbinary::save_in_field(Field *field, bool no_conversions) { int error; field->set_notnull(); if (field->result_type() == STRING_RESULT) return field->store(str_value.ptr(), str_value.length(), collation.collation); ulonglong nr; uint32 length= str_value.length(); if (length > 8) { error=field->store(str_value.ptr(),str_value.length(),collation.collation); nr= field->flags & UNSIGNED_FLAG ? ULONGLONG_MAX : LONGLONG_MAX; goto warn; } else nr= (ulonglong) val_int(); if ((length == 8) && !(field->flags & UNSIGNED_FLAG) && (nr > LONGLONG_MAX)) { longlong nr=val_int(); error=field->store(nr); nr= LONGLONG_MAX; goto warn; } return error; return field->store((longlong) nr); warn: if (!field->store((longlong) nr)) field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); return 1; } Loading