Loading mysql-test/r/innodb.result +6 −6 Original line number Diff line number Diff line Loading @@ -2430,32 +2430,32 @@ drop table t1; CREATE TABLE t1 ( `a` int(11) NOT NULL auto_increment, `b` int(11) default NULL,PRIMARY KEY (`a`),UNIQUE KEY `b` (`b`)) ENGINE=innodb; insert into t1 (b) values (1); replace into t1 (b) values (2), (1), (3); ERROR 23000: Duplicate entry '3' for key 1 select * from t1; a b 1 1 3 1 2 2 4 3 truncate table t1; insert into t1 (b) values (1); replace into t1 (b) values (2); replace into t1 (b) values (1); replace into t1 (b) values (3); ERROR 23000: Duplicate entry '3' for key 1 select * from t1; a b 3 1 2 2 4 3 drop table t1; create table t1 (rowid int not null auto_increment, val int not null,primary key (rowid), unique(val)) engine=innodb; replace into t1 (val) values ('1'),('2'); replace into t1 (val) values ('1'),('2'); ERROR 23000: Duplicate entry '3' for key 1 insert into t1 (val) values ('1'),('2'); ERROR 23000: Duplicate entry '1' for key 2 select * from t1; rowid val 1 1 2 2 3 1 4 2 drop table t1; create table t1 (a int not null auto_increment primary key, val int) engine=InnoDB; insert into t1 (val) values (1); Loading mysql-test/t/innodb.test +2 −8 Original line number Diff line number Diff line Loading @@ -1350,16 +1350,12 @@ drop table t1; CREATE TABLE t1 ( `a` int(11) NOT NULL auto_increment, `b` int(11) default NULL,PRIMARY KEY (`a`),UNIQUE KEY `b` (`b`)) ENGINE=innodb; insert into t1 (b) values (1); # We shouldn't get the following error --error 1062 replace into t1 (b) values (2), (1), (3); select * from t1; truncate table t1; insert into t1 (b) values (1); replace into t1 (b) values (2); replace into t1 (b) values (1); # We shouldn't get the following error --error 1062 replace into t1 (b) values (3); select * from t1; drop table t1; Loading @@ -1367,8 +1363,6 @@ drop table t1; create table t1 (rowid int not null auto_increment, val int not null,primary key (rowid), unique(val)) engine=innodb; replace into t1 (val) values ('1'),('2'); # We shouldn't get the following error --error 1062 replace into t1 (val) values ('1'),('2'); --error 1062 insert into t1 (val) values ('1'),('2'); Loading @@ -1377,13 +1371,13 @@ drop table t1; # # Test that update changes internal auto-increment value # Test that update does not change internal auto-increment value # create table t1 (a int not null auto_increment primary key, val int) engine=InnoDB; insert into t1 (val) values (1); update t1 set a=2 where a=1; # We shouldn't get the following error # We should get the following error because InnoDB does not update the counter --error 1062 insert into t1 (val) values (1); select * from t1; Loading sql/ha_innodb.cc +17 −0 Original line number Diff line number Diff line Loading @@ -3221,6 +3221,23 @@ ha_innobase::write_row( } } /* A REPLACE command and LOAD DATA INFILE REPLACE handle a duplicate key error themselves, and we must update the autoinc counter if we are performing those statements. */ if (error == DB_DUPLICATE_KEY && auto_inc_used && (user_thd->lex->sql_command == SQLCOM_REPLACE || user_thd->lex->sql_command == SQLCOM_REPLACE_SELECT || (user_thd->lex->sql_command == SQLCOM_LOAD && user_thd->lex->duplicates == DUP_REPLACE))) { auto_inc = table->next_number_field->val_int(); if (auto_inc != 0) { dict_table_autoinc_update(prebuilt->table, auto_inc); } } innodb_srv_conc_exit_innodb(prebuilt->trx); error = convert_error_code_to_mysql(error, user_thd); Loading Loading
mysql-test/r/innodb.result +6 −6 Original line number Diff line number Diff line Loading @@ -2430,32 +2430,32 @@ drop table t1; CREATE TABLE t1 ( `a` int(11) NOT NULL auto_increment, `b` int(11) default NULL,PRIMARY KEY (`a`),UNIQUE KEY `b` (`b`)) ENGINE=innodb; insert into t1 (b) values (1); replace into t1 (b) values (2), (1), (3); ERROR 23000: Duplicate entry '3' for key 1 select * from t1; a b 1 1 3 1 2 2 4 3 truncate table t1; insert into t1 (b) values (1); replace into t1 (b) values (2); replace into t1 (b) values (1); replace into t1 (b) values (3); ERROR 23000: Duplicate entry '3' for key 1 select * from t1; a b 3 1 2 2 4 3 drop table t1; create table t1 (rowid int not null auto_increment, val int not null,primary key (rowid), unique(val)) engine=innodb; replace into t1 (val) values ('1'),('2'); replace into t1 (val) values ('1'),('2'); ERROR 23000: Duplicate entry '3' for key 1 insert into t1 (val) values ('1'),('2'); ERROR 23000: Duplicate entry '1' for key 2 select * from t1; rowid val 1 1 2 2 3 1 4 2 drop table t1; create table t1 (a int not null auto_increment primary key, val int) engine=InnoDB; insert into t1 (val) values (1); Loading
mysql-test/t/innodb.test +2 −8 Original line number Diff line number Diff line Loading @@ -1350,16 +1350,12 @@ drop table t1; CREATE TABLE t1 ( `a` int(11) NOT NULL auto_increment, `b` int(11) default NULL,PRIMARY KEY (`a`),UNIQUE KEY `b` (`b`)) ENGINE=innodb; insert into t1 (b) values (1); # We shouldn't get the following error --error 1062 replace into t1 (b) values (2), (1), (3); select * from t1; truncate table t1; insert into t1 (b) values (1); replace into t1 (b) values (2); replace into t1 (b) values (1); # We shouldn't get the following error --error 1062 replace into t1 (b) values (3); select * from t1; drop table t1; Loading @@ -1367,8 +1363,6 @@ drop table t1; create table t1 (rowid int not null auto_increment, val int not null,primary key (rowid), unique(val)) engine=innodb; replace into t1 (val) values ('1'),('2'); # We shouldn't get the following error --error 1062 replace into t1 (val) values ('1'),('2'); --error 1062 insert into t1 (val) values ('1'),('2'); Loading @@ -1377,13 +1371,13 @@ drop table t1; # # Test that update changes internal auto-increment value # Test that update does not change internal auto-increment value # create table t1 (a int not null auto_increment primary key, val int) engine=InnoDB; insert into t1 (val) values (1); update t1 set a=2 where a=1; # We shouldn't get the following error # We should get the following error because InnoDB does not update the counter --error 1062 insert into t1 (val) values (1); select * from t1; Loading
sql/ha_innodb.cc +17 −0 Original line number Diff line number Diff line Loading @@ -3221,6 +3221,23 @@ ha_innobase::write_row( } } /* A REPLACE command and LOAD DATA INFILE REPLACE handle a duplicate key error themselves, and we must update the autoinc counter if we are performing those statements. */ if (error == DB_DUPLICATE_KEY && auto_inc_used && (user_thd->lex->sql_command == SQLCOM_REPLACE || user_thd->lex->sql_command == SQLCOM_REPLACE_SELECT || (user_thd->lex->sql_command == SQLCOM_LOAD && user_thd->lex->duplicates == DUP_REPLACE))) { auto_inc = table->next_number_field->val_int(); if (auto_inc != 0) { dict_table_autoinc_update(prebuilt->table, auto_inc); } } innodb_srv_conc_exit_innodb(prebuilt->trx); error = convert_error_code_to_mysql(error, user_thd); Loading