summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorramil@mysql.com <>2005-07-26 12:18:35 +0500
committerramil@mysql.com <>2005-07-26 12:18:35 +0500
commitafb1ad8415ec912eda86c5ea8e1abc98088c89b8 (patch)
tree8b9fa06617c2acc9c5ecdd4d350efb672d2587c1
parentbbd06a333a8df4c44c84312119237842780b18f8 (diff)
downloadmariadb-git-afb1ad8415ec912eda86c5ea8e1abc98088c89b8.tar.gz
a fix (bug #11546: Bad error message from inserting out of range values, SQL_MODE='tradition').
-rw-r--r--mysql-test/r/strict.result7
-rw-r--r--mysql-test/t/strict.test11
-rw-r--r--sql/field.cc10
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);