From afb1ad8415ec912eda86c5ea8e1abc98088c89b8 Mon Sep 17 00:00:00 2001 From: "ramil@mysql.com" <> Date: Tue, 26 Jul 2005 12:18:35 +0500 Subject: a fix (bug #11546: Bad error message from inserting out of range values, SQL_MODE='tradition'). --- mysql-test/r/strict.result | 7 +++++++ mysql-test/t/strict.test | 11 +++++++++++ sql/field.cc | 10 ++++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/strict.result b/mysql-test/r/strict.result index 49f118b1d96..a742770ae9b 100644 --- a/mysql-test/r/strict.result +++ b/mysql-test/r/strict.result @@ -1258,3 +1258,10 @@ select * from t1; d 2000-10-01 drop table t1; +set @@sql_mode='traditional'; +create table t1(a bit(2)); +insert into t1 values(b'101'); +ERROR 22001: Data too long for column 'a' at row 1 +select * from t1; +a +drop table t1; diff --git a/mysql-test/t/strict.test b/mysql-test/t/strict.test index 71b57424e75..9e8d92533d9 100644 --- a/mysql-test/t/strict.test +++ b/mysql-test/t/strict.test @@ -1118,3 +1118,14 @@ insert into t1 values ('2000-10-01'); update t1 set d = 1100; select * from t1; drop table t1; + +# +# BIT fields +# + +set @@sql_mode='traditional'; +create table t1(a bit(2)); +--error 1406 +insert into t1 values(b'101'); +select * from t1; +drop table t1; diff --git a/sql/field.cc b/sql/field.cc index 3fdd7ab45e6..2fb60ec1fd9 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -7846,7 +7846,10 @@ int Field_bit::store(const char *from, uint length, CHARSET_INFO *cs) { set_rec_bits(0xff, bit_ptr, bit_ofs, bit_len); memset(ptr, 0xff, field_length); - set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); + if (table->in_use->really_abort_on_warning()) + set_warning(MYSQL_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1); + else + set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); return 1; } /* delta is >= -1 here */ @@ -8063,7 +8066,10 @@ int Field_bit_as_char::store(const char *from, uint length, CHARSET_INFO *cs) memset(ptr, 0xff, field_length); if (bits) *ptr&= ((1 << bits) - 1); /* set first byte */ - set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); + if (table->in_use->really_abort_on_warning()) + set_warning(MYSQL_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1); + else + set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); return 1; } bzero(ptr, delta); -- cgit v1.2.1