Commit 93c29c10 authored by evgen@moonbone.local's avatar evgen@moonbone.local

Bug#27586: Wrong autoinc value assigned by LOAD DATA in the

NO_AUTO_VALUE_ON_ZERO mode.

The table->auto_increment_field_not_null variable wasn't reset after
reading a row which may lead to inserting a wrong value to the auto-increment
field to the following row.

The table->auto_increment_field_not_null variable is reset now right after a
row is being written in the read_fixed_length() and the read_sep_field()
functions.
Removed wrong setting of the table->auto_increment_field_not_null variable in
the read_sep_field() function.
parent 54bc9c3d
...@@ -156,3 +156,12 @@ select load_file("MYSQL_TEST_DIR/t/loaddata.test"); ...@@ -156,3 +156,12 @@ select load_file("MYSQL_TEST_DIR/t/loaddata.test");
load_file("MYSQL_TEST_DIR/t/loaddata.test") load_file("MYSQL_TEST_DIR/t/loaddata.test")
NULL NULL
drop table t1, t2; drop table t1, t2;
create table t1(f1 int);
insert into t1 values(1),(null);
create table t2(f2 int auto_increment primary key);
select * from t2;
f2
1
2
SET @@SQL_MODE=@OLD_SQL_MODE;
drop table t1,t2;
...@@ -136,4 +136,20 @@ eval select load_file("$MYSQL_TEST_DIR/t/loaddata.test"); ...@@ -136,4 +136,20 @@ eval select load_file("$MYSQL_TEST_DIR/t/loaddata.test");
# cleanup # cleanup
drop table t1, t2; drop table t1, t2;
#
# Bug#27586: Wrong autoinc value assigned by LOAD DATA in the
# NO_AUTO_VALUE_ON_ZERO mode
#
create table t1(f1 int);
insert into t1 values(1),(null);
create table t2(f2 int auto_increment primary key);
disable_query_log;
eval select * into outfile '$MYSQLTEST_VARDIR/tmp/t1' from t1;
SET @OLD_SQL_MODE=@@SQL_MODE, @@SQL_MODE=NO_AUTO_VALUE_ON_ZERO;
eval load data infile '$MYSQLTEST_VARDIR/tmp/t1' into table t2;
enable_query_log;
select * from t2;
--exec rm $MYSQLTEST_VARDIR/tmp/t1
SET @@SQL_MODE=@OLD_SQL_MODE;
drop table t1,t2;
# End of 5.0 tests # End of 5.0 tests
...@@ -532,7 +532,7 @@ read_fixed_length(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, ...@@ -532,7 +532,7 @@ read_fixed_length(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
Item_field *sql_field; Item_field *sql_field;
TABLE *table= table_list->table; TABLE *table= table_list->table;
ulonglong id; ulonglong id;
bool no_trans_update; bool no_trans_update, err;
DBUG_ENTER("read_fixed_length"); DBUG_ENTER("read_fixed_length");
id= 0; id= 0;
...@@ -624,7 +624,9 @@ read_fixed_length(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, ...@@ -624,7 +624,9 @@ read_fixed_length(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
if (write_record(thd, table, &info)) err= write_record(thd, table, &info);
table->auto_increment_field_not_null= FALSE;
if (err)
DBUG_RETURN(1); DBUG_RETURN(1);
thd->no_trans_update= no_trans_update; thd->no_trans_update= no_trans_update;
...@@ -669,7 +671,7 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, ...@@ -669,7 +671,7 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
TABLE *table= table_list->table; TABLE *table= table_list->table;
uint enclosed_length; uint enclosed_length;
ulonglong id; ulonglong id;
bool no_trans_update; bool no_trans_update, err;
DBUG_ENTER("read_sep_field"); DBUG_ENTER("read_sep_field");
enclosed_length=enclosed.length(); enclosed_length=enclosed.length();
...@@ -716,8 +718,6 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, ...@@ -716,8 +718,6 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
DBUG_RETURN(1); DBUG_RETURN(1);
} }
field->set_null(); field->set_null();
if (field == table->next_number_field)
table->auto_increment_field_not_null= TRUE;
if (!field->maybe_null()) if (!field->maybe_null())
{ {
if (field->type() == FIELD_TYPE_TIMESTAMP) if (field->type() == FIELD_TYPE_TIMESTAMP)
...@@ -803,8 +803,9 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, ...@@ -803,8 +803,9 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
err= write_record(thd, table, &info);
if (write_record(thd, table, &info)) table->auto_increment_field_not_null= FALSE;
if (err)
DBUG_RETURN(1); DBUG_RETURN(1);
/* /*
If auto_increment values are used, save the first one for If auto_increment values are used, save the first one for
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment