#At file:///home/gluh/MySQL/mysql-5.1-bug-33717/ based on
revid:matthias.leich@stripped
2840 Sergey Glukhov 2009-05-19
Bug#33717 INSERT...(default) fails for enum. Crashes CSV tables, loads spaces for
MyISAM(for 5.0 & 5.1)
Table corruption happens during table reading in ha_tina::find_current_row() func.
Field::store() method returns error(true) if stored value is 0.
The fix:
added special case for enum type which correctly processes 0 value.
Additional fix:
INSERT...(default) and INSERT...() have the same behaviour now for enum type.
@ mysql-test/r/csv.result
test result
@ mysql-test/r/default.result
result fix
@ mysql-test/t/csv.test
test case
@ sql/item.cc
Changes:
--do not print warning for 'enum' type if there is no default value
--set default value
@ storage/csv/ha_tina.cc
Table corruption happens during table reading in ha_tina::find_current_row() func.
Field::store() method returns error(true) if stored value is 0.
The fix:
added special case for enum type which correctly processes 0 value.
modified:
mysql-test/r/csv.result
mysql-test/r/default.result
mysql-test/t/csv.test
sql/item.cc
storage/csv/ha_tina.cc
=== modified file 'mysql-test/r/csv.result'
--- a/mysql-test/r/csv.result 2009-01-23 12:22:05 +0000
+++ b/mysql-test/r/csv.result 2009-05-19 08:07:05 +0000
@@ -5394,17 +5394,24 @@ select * from t1;
ERROR HY000: File 'MYSQLD_DATADIR/test/t1.CSV' not found (Errcode: 2)
unlock tables;
drop table t1;
-create table t1(a enum ('a') not null) engine=csv;
-insert into t1 values (2);
+CREATE TABLE t1 (e enum('foo','bar') NOT NULL) ENGINE = CSV;
+INSERT INTO t1 VALUES();
+INSERT INTO t1 VALUES(default);
+INSERT INTO t1 VALUES(0);
Warnings:
-Warning 1265 Data truncated for column 'a' at row 1
-select * from t1 limit 1;
-ERROR HY000: Table 't1' is marked as crashed and should be repaired
-repair table t1;
-Table Op Msg_type Msg_text
-test.t1 repair Warning Data truncated for column 'a' at row 1
-test.t1 repair status OK
-select * from t1 limit 1;
-a
-drop table t1;
+Warning 1265 Data truncated for column 'e' at row 1
+INSERT INTO t1 VALUES(3);
+Warnings:
+Warning 1265 Data truncated for column 'e' at row 1
+INSERT INTO t1 VALUES(-1);
+Warnings:
+Warning 1265 Data truncated for column 'e' at row 1
+SELECT * FROM t1;
+e
+foo
+foo
+
+
+
+DROP TABLE t1;
End of 5.1 tests
=== modified file 'mysql-test/r/default.result'
--- a/mysql-test/r/default.result 2008-09-03 08:06:03 +0000
+++ b/mysql-test/r/default.result 2009-05-19 08:07:05 +0000
@@ -180,7 +180,6 @@ insert into bug20691 values (2, 3, 5, '0
insert into bug20691 values (DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, 4);
Warnings:
Warning 1364 Field 'a' doesn't have a default value
-Warning 1364 Field 'b' doesn't have a default value
Warning 1364 Field 'c' doesn't have a default value
Warning 1364 Field 'd' doesn't have a default value
Warning 1364 Field 'e' doesn't have a default value
@@ -193,7 +192,7 @@ a b c d e f g h i x
two large 00:00:05 0007-01-01 11 13 17 0019-01-01 00:00:00 23 1
small 00:00:00 0000-00-00 0 0000-00-00 00:00:00 0 2
two large 00:00:05 0007-01-01 11 13 17 0019-01-01 00:00:00 23 3
- 00:00:00 0000-00-00 0 0000-00-00 00:00:00 0 4
+ small 00:00:00 0000-00-00 0 0000-00-00 00:00:00 0 4
drop table bug20691;
create table t1 (id int not null);
insert into t1 values(default);
=== modified file 'mysql-test/t/csv.test'
--- a/mysql-test/t/csv.test 2009-01-23 12:22:05 +0000
+++ b/mysql-test/t/csv.test 2009-05-19 08:07:05 +0000
@@ -1806,16 +1806,15 @@ drop table t1;
--disconnect con1
#
-# Bug#41441 repair csv table crashes debug server
+# Bug#33717 INSERT...(default) fails for enum. Crashes CSV tables, loads spaces for
MyISAM
#
-# Note: The test should be removed after Bug#33717 is fixed
-
-create table t1(a enum ('a') not null) engine=csv;
-insert into t1 values (2);
---error ER_CRASHED_ON_USAGE
-select * from t1 limit 1;
-repair table t1;
-select * from t1 limit 1;
-drop table t1;
+CREATE TABLE t1 (e enum('foo','bar') NOT NULL) ENGINE = CSV;
+INSERT INTO t1 VALUES();
+INSERT INTO t1 VALUES(default);
+INSERT INTO t1 VALUES(0);
+INSERT INTO t1 VALUES(3);
+INSERT INTO t1 VALUES(-1);
+SELECT * FROM t1;
+DROP TABLE t1;
--echo End of 5.1 tests
=== modified file 'sql/item.cc'
--- a/sql/item.cc 2009-03-27 13:00:20 +0000
+++ b/sql/item.cc 2009-05-19 08:07:05 +0000
@@ -6236,7 +6236,10 @@ int Item_default_value::save_in_field(Fi
{
if (!arg)
{
- if (field_arg->flags & NO_DEFAULT_VALUE_FLAG)
+ if (field_arg->flags & NO_DEFAULT_VALUE_FLAG
+#if MYSQL_VERSION_ID < 0x60000
+ && field_arg->real_type() != MYSQL_TYPE_ENUM)
+#endif
{
if (field_arg->reset())
{
=== modified file 'storage/csv/ha_tina.cc'
--- a/storage/csv/ha_tina.cc 2009-03-24 09:02:01 +0000
+++ b/storage/csv/ha_tina.cc 2009-05-19 08:07:05 +0000
@@ -679,9 +679,21 @@ int ha_tina::find_current_row(uchar *buf
if (read_all || bitmap_is_set(table->read_set, (*field)->field_index))
{
+ bool is_enum= ((*field)->real_type() == MYSQL_TYPE_ENUM);
+ /*
+ Here CHECK_FIELD_WARN checks that all values in the csv file are valid
+ which is normally the case, if they were written by
+ INSERT -> ha_tina::write_row. '0' values on ENUM fields are considered
+ invalid by Field_enum::store() but it can store them on INSERT anyway.
+ Thus, for enums we silence the warning, as it doesn't really mean
+ an invalid value.
+ */
if ((*field)->store(buffer.ptr(), buffer.length(), buffer.charset(),
- CHECK_FIELD_WARN))
- goto err;
+ is_enum ? CHECK_FIELD_IGNORE : CHECK_FIELD_WARN))
+ {
+ if (!is_enum)
+ goto err;
+ }
if ((*field)->flags & BLOB_FLAG)
{
Field_blob *blob= *(Field_blob**) field;
Attachment: [text/bzr-bundle] bzr/sergey.glukhov@sun.com-20090519080705-f2z1muvy25ci7fp3.bundle