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. 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.
This commit is contained in:
parent
1e7700b8b8
commit
c8f278485b
@ -5394,17 +5394,24 @@ select * from t1;
|
|||||||
ERROR HY000: File 'MYSQLD_DATADIR/test/t1.CSV' not found (Errcode: 2)
|
ERROR HY000: File 'MYSQLD_DATADIR/test/t1.CSV' not found (Errcode: 2)
|
||||||
unlock tables;
|
unlock tables;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1(a enum ('a') not null) engine=csv;
|
CREATE TABLE t1 (e enum('foo','bar') NOT NULL) ENGINE = CSV;
|
||||||
insert into t1 values (2);
|
INSERT INTO t1 VALUES();
|
||||||
|
INSERT INTO t1 VALUES(default);
|
||||||
|
INSERT INTO t1 VALUES(0);
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1265 Data truncated for column 'a' at row 1
|
Warning 1265 Data truncated for column 'e' at row 1
|
||||||
select * from t1 limit 1;
|
INSERT INTO t1 VALUES(3);
|
||||||
ERROR HY000: Table 't1' is marked as crashed and should be repaired
|
Warnings:
|
||||||
repair table t1;
|
Warning 1265 Data truncated for column 'e' at row 1
|
||||||
Table Op Msg_type Msg_text
|
INSERT INTO t1 VALUES(-1);
|
||||||
test.t1 repair Warning Data truncated for column 'a' at row 1
|
Warnings:
|
||||||
test.t1 repair status OK
|
Warning 1265 Data truncated for column 'e' at row 1
|
||||||
select * from t1 limit 1;
|
SELECT * FROM t1;
|
||||||
a
|
e
|
||||||
drop table t1;
|
foo
|
||||||
|
foo
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
End of 5.1 tests
|
End of 5.1 tests
|
||||||
|
@ -180,7 +180,6 @@ insert into bug20691 values (2, 3, 5, '0007-01-01', 11, 13, 17, '0019-01-01 00:0
|
|||||||
insert into bug20691 values (DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, 4);
|
insert into bug20691 values (DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, 4);
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1364 Field 'a' doesn't have a default value
|
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 'c' doesn't have a default value
|
||||||
Warning 1364 Field 'd' 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
|
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
|
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
|
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
|
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;
|
drop table bug20691;
|
||||||
create table t1 (id int not null);
|
create table t1 (id int not null);
|
||||||
insert into t1 values(default);
|
insert into t1 values(default);
|
||||||
|
@ -1807,16 +1807,16 @@ unlock tables;
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
#
|
#
|
||||||
# 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 (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;
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
@ -6488,7 +6488,8 @@ int Item_default_value::save_in_field(Field *field_arg, bool no_conversions)
|
|||||||
{
|
{
|
||||||
if (!arg)
|
if (!arg)
|
||||||
{
|
{
|
||||||
if (field_arg->flags & NO_DEFAULT_VALUE_FLAG)
|
if (field_arg->flags & NO_DEFAULT_VALUE_FLAG &&
|
||||||
|
field_arg->real_type() != MYSQL_TYPE_ENUM)
|
||||||
{
|
{
|
||||||
if (field_arg->reset())
|
if (field_arg->reset())
|
||||||
{
|
{
|
||||||
|
@ -679,9 +679,21 @@ int ha_tina::find_current_row(uchar *buf)
|
|||||||
|
|
||||||
if (read_all || bitmap_is_set(table->read_set, (*field)->field_index))
|
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(),
|
if ((*field)->store(buffer.ptr(), buffer.length(), buffer.charset(),
|
||||||
CHECK_FIELD_WARN))
|
is_enum ? CHECK_FIELD_IGNORE : CHECK_FIELD_WARN))
|
||||||
goto err;
|
{
|
||||||
|
if (!is_enum)
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
if ((*field)->flags & BLOB_FLAG)
|
if ((*field)->flags & BLOB_FLAG)
|
||||||
{
|
{
|
||||||
Field_blob *blob= *(Field_blob**) field;
|
Field_blob *blob= *(Field_blob**) field;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user