#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)