From: Date: February 6 2009 11:03am Subject: bzr commit into mysql-5.0-bugteam branch (Sergey.Glukhov:2741) Bug#33717 List-Archive: http://lists.mysql.com/commits/65451 X-Bug: 33717 Message-Id: <0KEN00D7F2MD0Q00@fe-emea-09.sun.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7BIT #At file:///home/gluh/MySQL/mysql-5.0-bug-33717/ based on revid:alexey.kopytov@stripped 2741 Sergey Glukhov 2009-02-06 Bug#33717 INSERT...(default) fails for enum. Crashes CSV tables, loads spaces for MyISAM Table corruption happens during table reading in ha_tina::find_current_row() func. Field::store() method returns error(true) if stored value is 0, but 0 is legal value. The fix is to return false if the value is 0. Additional fix: INSERT...(default) and INSERT...() have the same behaviour now. modified: mysql-test/r/csv.result mysql-test/r/default.result mysql-test/r/key.result mysql-test/r/sp.result mysql-test/r/type_enum.result mysql-test/r/type_ranges.result mysql-test/t/csv.test sql/field.cc sql/item.cc sql/sql_insert.cc per-file messages: mysql-test/r/csv.result test result mysql-test/r/default.result result fix mysql-test/r/key.result result fix mysql-test/r/sp.result result fix mysql-test/r/type_enum.result result fix mysql-test/r/type_ranges.result result fix mysql-test/t/csv.test test case sql/field.cc 0 is legal value for ENUM type, so there is no need to return error in this case(except the strict mode). If strict mode is enabled then return error. sql/item.cc set default value sql/sql_insert.cc removed check for ENUM field. The reason is that ENUM field behavoir should be the same as other fileds have. === modified file 'mysql-test/r/csv.result' --- a/mysql-test/r/csv.result 2008-11-18 06:01:03 +0000 +++ b/mysql-test/r/csv.result 2009-02-06 10:03:37 +0000 @@ -5086,4 +5086,28 @@ create table bug39616_1(id int NOT NULL, select * from bug39616_1; id d drop table bug39616_1; +CREATE TABLE t1 (e enum('foo','bar') NOT NULL) ENGINE = CSV; +INSERT INTO t1 VALUES(); +Warnings: +Warning 1364 Field 'e' doesn't have a default value +INSERT INTO t1 VALUES(default); +Warnings: +Warning 1364 Field 'e' doesn't have a default value +INSERT INTO t1 VALUES(0); +Warnings: +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.0 tests === modified file 'mysql-test/r/default.result' --- a/mysql-test/r/default.result 2008-09-03 07:32:43 +0000 +++ b/mysql-test/r/default.result 2009-02-06 10:03:37 +0000 @@ -169,6 +169,7 @@ insert into bug20691 values (2, 3, 5, '0 insert into bug20691 (x) values (2); 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 +194,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/r/key.result' --- a/mysql-test/r/key.result 2007-10-26 10:37:38 +0000 +++ b/mysql-test/r/key.result 2009-02-06 10:03:37 +0000 @@ -33,11 +33,6 @@ KEY price (price,area,type,transityes,sh INSERT INTO t1 VALUES (900,'Vancouver','Shared/Roomate','N','N','N','N'); INSERT INTO t1 VALUES (900,'Vancouver','Shared/Roomate','N','N','N','N'); INSERT INTO t1 VALUES (900,'Vancouver','Shared/Roomate','','','',''); -Warnings: -Warning 1265 Data truncated for column 'transityes' at row 1 -Warning 1265 Data truncated for column 'shopsyes' at row 1 -Warning 1265 Data truncated for column 'schoolsyes' at row 1 -Warning 1265 Data truncated for column 'petsyes' at row 1 INSERT INTO t1 VALUES (900,'Vancouver','Shared/Roomate','Y','Y','Y','Y'); INSERT INTO t1 VALUES (900,'Vancouver','Shared/Roomate','Y','Y','Y','Y'); INSERT INTO t1 VALUES (900,'Vancouver','Shared/Roomate','Y','Y','Y','Y'); === modified file 'mysql-test/r/sp.result' --- a/mysql-test/r/sp.result 2008-10-17 14:55:06 +0000 +++ b/mysql-test/r/sp.result 2009-02-06 10:03:37 +0000 @@ -3480,8 +3480,6 @@ drop procedure bug9538| drop procedure if exists bug8692| create table t3 (c1 varchar(5), c2 char(5), c3 enum('one','two'), c4 text, c5 blob, c6 char(5), c7 varchar(5))| insert into t3 values ('', '', '', '', '', '', NULL)| -Warnings: -Warning 1265 Data truncated for column 'c3' at row 1 create procedure bug8692() begin declare v1 VARCHAR(10); === modified file 'mysql-test/r/type_enum.result' --- a/mysql-test/r/type_enum.result 2007-09-20 08:54:46 +0000 +++ b/mysql-test/r/type_enum.result 2009-02-06 10:03:37 +0000 @@ -1644,8 +1644,6 @@ select * from t1; a update t1 set a = replace(a,'x','y'); -Warnings: -Warning 1265 Data truncated for column 'a' at row 1 select * from t1; a === modified file 'mysql-test/r/type_ranges.result' --- a/mysql-test/r/type_ranges.result 2007-09-20 08:54:46 +0000 +++ b/mysql-test/r/type_ranges.result 2009-02-06 10:03:37 +0000 @@ -125,6 +125,8 @@ Warning 1264 Out of range value adjusted Warning 1264 Out of range value adjusted for column 'umedium' at row 1 Warning 1265 Data truncated for column 'options' at row 1 insert into t1 (tiny) values (1); +Warnings: +Warning 1364 Field 'options' doesn't have a default value select auto,string,tiny,short,medium,long_int,longlong,real_float,real_double,utiny,ushort,umedium,ulong,ulonglong,mod(floor(time_stamp/1000000),1000000)-mod(curdate(),1000000),date_field,time_field,date_time,blob_col,tinyblob_col,mediumblob_col,longblob_col from t1; auto string tiny short medium long_int longlong real_float real_double utiny ushort umedium ulong ulonglong mod(floor(time_stamp/1000000),1000000)-mod(curdate(),1000000) date_field time_field date_time blob_col tinyblob_col mediumblob_col longblob_col 10 1 1 1 1 1 1 1.0 1.0000 1 00001 1 1 1 0 0000-00-00 00:00:00 0000-00-00 00:00:00 1 1 1 1 === modified file 'mysql-test/t/csv.test' --- a/mysql-test/t/csv.test 2008-11-18 06:01:03 +0000 +++ b/mysql-test/t/csv.test 2009-02-06 10:03:37 +0000 @@ -1503,4 +1503,16 @@ select * from bug39616_1; drop table bug39616_1; +# +# Bug#33717 INSERT...(default) fails for enum. Crashes CSV tables, loads spaces for MyISAM +# +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.0 tests === modified file 'sql/field.cc' --- a/sql/field.cc 2008-12-09 10:19:46 +0000 +++ b/sql/field.cc 2009-02-06 10:03:37 +0000 @@ -7673,7 +7673,7 @@ int Field_enum::store(const char *from,u uint tmp=find_type2(typelib, from, length, field_charset); if (!tmp) { - if (length < 6) // Can't be more than 99999 enums + if (length > 0 && length < 6) // Can't be more than 99999 enums { /* This is for reading numbers with LOAD DATA INFILE */ char *end; @@ -7686,7 +7686,11 @@ int Field_enum::store(const char *from,u if (!table->in_use->count_cuted_fields) err= 0; } - else + else if (length >= 6 || + length == 0 && + (table->in_use->variables.sql_mode & + (MODE_STRICT_TRANS_TABLES | + MODE_STRICT_ALL_TABLES))) set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1); } store_type((ulonglong) tmp); === modified file 'sql/item.cc' --- a/sql/item.cc 2009-02-05 07:43:39 +0000 +++ b/sql/item.cc 2009-02-06 10:03:37 +0000 @@ -6042,6 +6042,7 @@ void Item_default_value::print(String *s int Item_default_value::save_in_field(Field *field_arg, bool no_conversions) { + int err= 0; if (!arg) { if (field_arg->flags & NO_DEFAULT_VALUE_FLAG) @@ -6071,10 +6072,10 @@ int Item_default_value::save_in_field(Fi ER(ER_NO_DEFAULT_FOR_FIELD), field_arg->field_name); } - return 1; + err= 1; } field_arg->set_default(); - return 0; + return err; } return Item_field::save_in_field(field_arg, no_conversions); } === modified file 'sql/sql_insert.cc' --- a/sql/sql_insert.cc 2008-10-15 13:55:52 +0000 +++ b/sql/sql_insert.cc 2009-02-06 10:03:37 +0000 @@ -1557,8 +1557,7 @@ int check_that_all_fields_are_given_valu for (Field **field=entry->field ; *field ; field++) { if ((*field)->query_id != thd->query_id && - ((*field)->flags & NO_DEFAULT_VALUE_FLAG) && - ((*field)->real_type() != FIELD_TYPE_ENUM)) + ((*field)->flags & NO_DEFAULT_VALUE_FLAG)) { bool view= FALSE; if (table_list)