Loading mysql-test/r/delayed.result +30 −0 Original line number Diff line number Diff line Loading @@ -39,3 +39,33 @@ select * from t1; a 1 drop table t1; CREATE TABLE t1 ( a int(10) NOT NULL auto_increment, PRIMARY KEY (a)); insert delayed into t1 values(null); insert into t1 values(null); insert into t1 values(null); insert delayed into t1 values(null); insert delayed into t1 values(null); insert delayed into t1 values(null); insert into t1 values(null); insert into t1 values(null); insert into t1 values(null); delete from t1 where a=6; insert delayed into t1 values(null); insert delayed into t1 values(null); insert delayed into t1 values(null); insert delayed into t1 values(null); select * from t1 order by a; a 1 2 3 4 5 7 8 9 10 11 12 13 DROP TABLE t1; mysql-test/t/delayed.test +49 −0 Original line number Diff line number Diff line Loading @@ -50,3 +50,52 @@ insert into t1 values (1); insert delayed into t1 values (1); select * from t1; drop table t1; # # Bug #20195: INSERT DELAYED with auto_increment is assigned wrong values # CREATE TABLE t1 ( a int(10) NOT NULL auto_increment, PRIMARY KEY (a)); # Make one delayed insert to start the separate thread insert delayed into t1 values(null); # Do some normal inserts insert into t1 values(null); insert into t1 values(null); # Discarded, since the delayed-counter is 2, which is already used insert delayed into t1 values(null); # Discarded, since the delayed-counter is 3, which is already used insert delayed into t1 values(null); # Works, since the delayed-counter is 4, which is unused insert delayed into t1 values(null); # Do some more inserts insert into t1 values(null); insert into t1 values(null); insert into t1 values(null); # Delete one of the above to make a hole delete from t1 where a=6; # Discarded, since the delayed-counter is 5, which is already used insert delayed into t1 values(null); # Works, since the delayed-counter is 6, which is unused (the row we deleted) insert delayed into t1 values(null); # Discarded, since the delayed-counter is 7, which is already used insert delayed into t1 values(null); # Works, since the delayed-counter is 8, which is unused insert delayed into t1 values(null); # Check what we have now # must wait so that the delayed thread finishes # Note: this must be increased if the test fails --sleep 1 select * from t1 order by a; DROP TABLE t1; sql/sql_insert.cc +8 −0 Original line number Diff line number Diff line Loading @@ -1938,6 +1938,14 @@ bool delayed_insert::handle_inserts(void) if (!using_bin_log) table->file->extra(HA_EXTRA_WRITE_CACHE); pthread_mutex_lock(&mutex); /* Reset auto-increment cacheing */ if (thd.clear_next_insert_id) { thd.next_insert_id= 0; thd.clear_next_insert_id= 0; } while ((row=rows.get())) { stacked_inserts--; Loading Loading
mysql-test/r/delayed.result +30 −0 Original line number Diff line number Diff line Loading @@ -39,3 +39,33 @@ select * from t1; a 1 drop table t1; CREATE TABLE t1 ( a int(10) NOT NULL auto_increment, PRIMARY KEY (a)); insert delayed into t1 values(null); insert into t1 values(null); insert into t1 values(null); insert delayed into t1 values(null); insert delayed into t1 values(null); insert delayed into t1 values(null); insert into t1 values(null); insert into t1 values(null); insert into t1 values(null); delete from t1 where a=6; insert delayed into t1 values(null); insert delayed into t1 values(null); insert delayed into t1 values(null); insert delayed into t1 values(null); select * from t1 order by a; a 1 2 3 4 5 7 8 9 10 11 12 13 DROP TABLE t1;
mysql-test/t/delayed.test +49 −0 Original line number Diff line number Diff line Loading @@ -50,3 +50,52 @@ insert into t1 values (1); insert delayed into t1 values (1); select * from t1; drop table t1; # # Bug #20195: INSERT DELAYED with auto_increment is assigned wrong values # CREATE TABLE t1 ( a int(10) NOT NULL auto_increment, PRIMARY KEY (a)); # Make one delayed insert to start the separate thread insert delayed into t1 values(null); # Do some normal inserts insert into t1 values(null); insert into t1 values(null); # Discarded, since the delayed-counter is 2, which is already used insert delayed into t1 values(null); # Discarded, since the delayed-counter is 3, which is already used insert delayed into t1 values(null); # Works, since the delayed-counter is 4, which is unused insert delayed into t1 values(null); # Do some more inserts insert into t1 values(null); insert into t1 values(null); insert into t1 values(null); # Delete one of the above to make a hole delete from t1 where a=6; # Discarded, since the delayed-counter is 5, which is already used insert delayed into t1 values(null); # Works, since the delayed-counter is 6, which is unused (the row we deleted) insert delayed into t1 values(null); # Discarded, since the delayed-counter is 7, which is already used insert delayed into t1 values(null); # Works, since the delayed-counter is 8, which is unused insert delayed into t1 values(null); # Check what we have now # must wait so that the delayed thread finishes # Note: this must be increased if the test fails --sleep 1 select * from t1 order by a; DROP TABLE t1;
sql/sql_insert.cc +8 −0 Original line number Diff line number Diff line Loading @@ -1938,6 +1938,14 @@ bool delayed_insert::handle_inserts(void) if (!using_bin_log) table->file->extra(HA_EXTRA_WRITE_CACHE); pthread_mutex_lock(&mutex); /* Reset auto-increment cacheing */ if (thd.clear_next_insert_id) { thd.next_insert_id= 0; thd.clear_next_insert_id= 0; } while ((row=rows.get())) { stacked_inserts--; Loading