mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-30 04:26:45 +03:00 
			
		
		
		
	a too large value": the bug was that if MySQL generated a value for an auto_increment column, based on auto_increment_* variables, and this value was bigger than the column's max possible value, then that max possible value was inserted (after issuing a warning). But this didn't honour auto_increment_* variables (and so could cause conflicts in a master-master replication where one master is supposed to generated only even numbers, and the other only odd numbers), so now we "round down" this max possible value to honour auto_increment_* variables, before inserting it. mysql-test/r/rpl_auto_increment.result: result update. Before the fix, the result was that master inserted 127 in t1 (which didn't honour auto_increment_* variables!), instead of failing with "duplicate key 125" like now. mysql-test/t/rpl_auto_increment.test: Test for BUG#20524 "auto_increment_* not observed when inserting a too large value". We also check the pathological case (table t2) where it's impossible to "round down". The fixer of BUG#20573 will be able to use table t2 for testing his fix. sql/handler.cc: If handler::update_auto_increment() generates a value larger than the field's max possible value, we used to simply insert this max possible value (after pushing a warning). Now we "round down" this max possible value to honour auto_increment_* variables (if at all possible), before trying the insertion.
		
			
				
	
	
		
			143 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| #
 | |
| # Test of auto_increment with offset
 | |
| #
 | |
| source include/have_innodb.inc;
 | |
| source include/master-slave.inc;
 | |
| 
 | |
| create table t1 (a int not null auto_increment,b int, primary key (a)) engine=myisam auto_increment=3;
 | |
| insert into t1 values (NULL,1),(NULL,2),(NULL,3);
 | |
| select * from t1;
 | |
| 
 | |
| sync_slave_with_master;
 | |
| select * from t1;
 | |
| connection master;
 | |
| drop table t1;
 | |
| 
 | |
| create table t1 (a int not null auto_increment,b int, primary key (a)) engine=myisam;
 | |
| insert into t1 values (1,1),(NULL,2),(3,3),(NULL,4);
 | |
| delete from t1 where b=4;
 | |
| insert into t1 values (NULL,5),(NULL,6);
 | |
| select * from t1;
 | |
| 
 | |
| sync_slave_with_master;
 | |
| select * from t1;
 | |
| connection master;
 | |
| 
 | |
| drop table t1;
 | |
| 
 | |
| set @@session.auto_increment_increment=100, @@session.auto_increment_offset=10;
 | |
| show variables like "%auto_inc%";
 | |
| 
 | |
| create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
 | |
| # Insert with 2 insert statements to get better testing of logging
 | |
| insert into t1 values (NULL),(5),(NULL);
 | |
| insert into t1 values (250),(NULL);
 | |
| select * from t1;
 | |
| insert into t1 values (1000);
 | |
| set @@insert_id=400;
 | |
| insert into t1 values(NULL),(NULL);
 | |
| select * from t1;
 | |
| 
 | |
| sync_slave_with_master;
 | |
| select * from t1;
 | |
| connection master;
 | |
| drop table t1;
 | |
| 
 | |
| #
 | |
| # Same test with innodb (as the innodb code is a bit different)
 | |
| #
 | |
| create table t1 (a int not null auto_increment, primary key (a)) engine=innodb;
 | |
| # Insert with 2 insert statements to get better testing of logging
 | |
| insert into t1 values (NULL),(5),(NULL);
 | |
| insert into t1 values (250),(NULL);
 | |
| select * from t1;
 | |
| insert into t1 values (1000);
 | |
| set @@insert_id=400;
 | |
| insert into t1 values(NULL),(NULL);
 | |
| select * from t1;
 | |
| 
 | |
| sync_slave_with_master;
 | |
| select * from t1;
 | |
| connection master;
 | |
| drop table t1;
 | |
| 
 | |
| set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
 | |
| create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
 | |
| # Insert with 2 insert statements to get better testing of logging
 | |
| insert into t1 values (NULL),(5),(NULL),(NULL);
 | |
| insert into t1 values (500),(NULL),(502),(NULL),(NULL);
 | |
| select * from t1;
 | |
| set @@insert_id=600;
 | |
| --error 1062
 | |
| insert into t1 values(600),(NULL),(NULL);
 | |
| set @@insert_id=600;
 | |
| insert ignore into t1 values(600),(NULL),(NULL),(610),(NULL);
 | |
| select * from t1;
 | |
| 
 | |
| sync_slave_with_master;
 | |
| select * from t1;
 | |
| connection master;
 | |
| drop table t1;
 | |
| 
 | |
| #
 | |
| # Test that auto-increment works when slave has rows in the table
 | |
| #
 | |
| set @@session.auto_increment_increment=10, @@session.auto_increment_offset=1;
 | |
| 
 | |
| create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
 | |
| 
 | |
| sync_slave_with_master;
 | |
| insert into t1 values(2),(12),(22),(32),(42);
 | |
| connection master;
 | |
| 
 | |
| insert into t1 values (NULL),(NULL);
 | |
| insert into t1 values (3),(NULL),(NULL);
 | |
| select * from t1;
 | |
| 
 | |
| sync_slave_with_master;
 | |
| select * from t1;
 | |
| 
 | |
| # Test for BUG#20524 "auto_increment_* not observed when inserting
 | |
| # a too large value". When an autogenerated value was bigger than the
 | |
| # maximum possible value of the field, it was truncated to that max
 | |
| # possible value, without being "rounded down" to still honour
 | |
| # auto_increment_* variables.
 | |
| 
 | |
| connection master;
 | |
| drop table t1;
 | |
| create table t1 (a tinyint not null auto_increment primary key) engine=myisam;
 | |
| insert into t1 values(103);
 | |
| set auto_increment_increment=11;
 | |
| set auto_increment_offset=4;
 | |
| insert into t1 values(null);
 | |
| insert into t1 values(null);
 | |
| --error 1062
 | |
| insert into t1 values(null);
 | |
| select a, mod(a-@@auto_increment_offset,@@auto_increment_increment) from t1 order by a;
 | |
| 
 | |
| # same but with a larger value
 | |
| create table t2 (a tinyint unsigned not null auto_increment primary key) engine=myisam;
 | |
| set auto_increment_increment=10;
 | |
| set auto_increment_offset=1;
 | |
| set insert_id=1000;
 | |
| insert into t2 values(null);
 | |
| select a, mod(a-@@auto_increment_offset,@@auto_increment_increment) from t2 order by a;
 | |
| 
 | |
| # An offset so big that even first value does not fit
 | |
| create table t3 like t1;
 | |
| set auto_increment_increment=1000;
 | |
| set auto_increment_offset=700;
 | |
| insert into t3 values(null);
 | |
| select * from t3 order by a;
 | |
| sync_slave_with_master;
 | |
| select * from t1 order by a;
 | |
| select * from t2 order by a;
 | |
| select * from t3 order by a;
 | |
| 
 | |
| connection master;
 | |
| 
 | |
| drop table t1,t2,t3;
 | |
| 
 | |
| # End cleanup
 | |
| sync_slave_with_master;
 |