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. mysql-test/t/loaddata.test: Added a test case for the bug#27586: Wrong autoinc value assigned by LOAD DATA in the NO_AUTO_VALUE_ON_ZERO mode. mysql-test/r/loaddata.result: Added a test case for the bug#27586: Wrong autoinc value assigned by LOAD DATA in the NO_AUTO_VALUE_ON_ZERO mode. sql/sql_load.cc: 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 is reset now right after a row is being written in the read_fixed_length() and the read_sep_field() functions. Remove wrong setting of the table->auto_increment_field_not_null variable in the read_sep_field() function.
This commit is contained in:
parent
d03c7d2d28
commit
35a0f47234
@ -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");
|
|||||||
# 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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user