mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 15:50:51 +03:00 
			
		
		
		
	MDEV-17614 flags INSERT…ON DUPLICATE KEY UPDATE unsafe for statement-based
replication when there are multiple unique indexes. This correctly fixes
something whose attempted fix in MySQL 5.7
in mysql/mysql-server@c93b0d9a97
caused lock conflicts. That change was reverted in MySQL 5.7.26
in mysql/mysql-server@066b6fdd43
(with a substantial amount of other changes).
In MDEV-17073 we already disabled the unfortunate MySQL change when
statement-based replication was not being used. Now, thanks to MDEV-17614,
we can actually remove the change altogether.
This reverts commit 8a346f31b9 (MDEV-17073)
and mysql/mysql-server@c93b0d9a97 while
keeping the test cases.
		
	
		
			
				
	
	
		
			158 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| ##########################################################################
 | |
| # LP bug #1035225 / MySQL bug #66301: INSERT ... ON DUPLICATE KEY UPDATE +
 | |
| # innodb_autoinc_lock_mode=1 is broken
 | |
| ##########################################################################
 | |
| 
 | |
| --source include/have_innodb.inc
 | |
| --source include/have_debug.inc
 | |
| --source include/have_debug_sync.inc
 | |
| --source include/innodb_binlog.inc
 | |
| 
 | |
| set global transaction isolation level repeatable read;
 | |
| 
 | |
| CREATE TABLE t1(
 | |
|        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 | |
|        k INT,
 | |
|        c CHAR(1),
 | |
|        UNIQUE KEY(k)) ENGINE=InnoDB;
 | |
| 
 | |
| SHOW CREATE TABLE t1;
 | |
| 
 | |
| --enable_info
 | |
| 
 | |
| --echo #
 | |
| --echo # Sequential execution
 | |
| --echo #
 | |
| 
 | |
| INSERT INTO t1(k) VALUES (1), (2), (3) ON DUPLICATE KEY UPDATE c='1';
 | |
| 
 | |
| --echo #
 | |
| --echo # 1 duplicate
 | |
| --echo #
 | |
| INSERT INTO t1(k) VALUES (2), (4), (5) ON DUPLICATE KEY UPDATE c='2';
 | |
| --echo #
 | |
| --echo # 5 rows, consecutive auto_inc values
 | |
| --echo #
 | |
| 
 | |
| SELECT * FROM t1 order by k;
 | |
| 
 | |
| DROP TABLE t1;
 | |
| 
 | |
| CREATE TABLE t1(
 | |
|        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 | |
|        k INT,
 | |
|        c CHAR(1),
 | |
|        UNIQUE KEY(k)) ENGINE=InnoDB;
 | |
| 
 | |
| --echo #
 | |
| --echo # Sequential execution 2
 | |
| --echo #
 | |
| 
 | |
| INSERT INTO t1(k) VALUES (2), (4), (5) ON DUPLICATE KEY UPDATE c='2';
 | |
| 
 | |
| --echo #
 | |
| --echo # 1 duplicate
 | |
| --echo #
 | |
| INSERT INTO t1(k) VALUES (1), (2), (3) ON DUPLICATE KEY UPDATE c='1';
 | |
| --echo #
 | |
| --echo # 5 rows, consecutive auto_inc values
 | |
| --echo #
 | |
| 
 | |
| SELECT * FROM t1 order by k;
 | |
| 
 | |
| DROP TABLE t1;
 | |
| 
 | |
| CREATE TABLE t1(
 | |
|        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 | |
|        k INT,
 | |
|        c CHAR(1),
 | |
|        UNIQUE KEY(k)) ENGINE=InnoDB;
 | |
| 
 | |
| --echo #
 | |
| --echo # Parallel execution
 | |
| --echo #
 | |
| 
 | |
| --connect(con2, localhost, root)
 | |
| --send SET DEBUG_SYNC='now WAIT_FOR write_row_done'
 | |
| 
 | |
| --connect(con1, localhost, root)
 | |
| SET DEBUG_SYNC='ha_write_row_end SIGNAL write_row_done WAIT_FOR continue';
 | |
| --send INSERT INTO t1(k) VALUES (1), (2), (3) ON DUPLICATE KEY UPDATE c='1'
 | |
| --connection con2
 | |
| --reap
 | |
| 
 | |
| SET DEBUG_SYNC='execute_command_after_close_tables SIGNAL continue';
 | |
| INSERT INTO t1(k) VALUES (2), (4), (5) ON DUPLICATE KEY UPDATE c='2';
 | |
| 
 | |
| --connection con1
 | |
| --echo #
 | |
| --echo # 2 duplicates
 | |
| --echo #
 | |
| --reap
 | |
| --connection default
 | |
| --echo #
 | |
| --echo # 3 rows
 | |
| --echo #
 | |
| 
 | |
| SELECT * FROM t1 order by k;
 | |
| 
 | |
| INSERT INTO t1(k) VALUES (2), (4), (5) ON DUPLICATE KEY UPDATE c='2';
 | |
| 
 | |
| SELECT * FROM t1 order by k;
 | |
| 
 | |
| 
 | |
| --disable_info
 | |
| 
 | |
| --disconnect con1
 | |
| --disconnect con2
 | |
| 
 | |
| --connection default
 | |
| 
 | |
| DROP TABLE t1;
 | |
| 
 | |
| --echo #
 | |
| --echo # Parallel test with read_committed
 | |
| --echo #
 | |
| 
 | |
| set global transaction isolation level read committed;
 | |
| 
 | |
| --disable_warnings
 | |
| drop table if exists t1;
 | |
| --enable_warnings
 | |
| 
 | |
| CREATE TABLE t1(
 | |
|        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 | |
|        k INT,
 | |
|        c CHAR(1),
 | |
|        UNIQUE KEY(k)) ENGINE=InnoDB;
 | |
| 
 | |
| --enable_info
 | |
| 
 | |
| --connect(con1, localhost, root)
 | |
| SET DEBUG_SYNC='ha_write_row_end SIGNAL continue2 WAIT_FOR continue1';
 | |
| --send INSERT INTO t1(k) VALUES (1), (2), (3) ON DUPLICATE KEY UPDATE c='1'
 | |
| 
 | |
| --connect(con2, localhost, root)
 | |
| SET DEBUG_SYNC='ha_write_row_start WAIT_FOR continue2';
 | |
| SET DEBUG_SYNC='after_mysql_insert SIGNAL continue1';
 | |
| INSERT INTO t1(k) VALUES (2), (4), (5) ON DUPLICATE KEY UPDATE c='2';
 | |
| --disconnect con2
 | |
| 
 | |
| --connection con1
 | |
| --reap
 | |
| --disable_info
 | |
| SET DEBUG_SYNC='RESET';
 | |
| 
 | |
| --echo #
 | |
| --echo # 5 rows, gap in autoinc values
 | |
| --echo #
 | |
| SELECT * FROM t1 ORDER BY k;
 | |
| 
 | |
| --disconnect con1
 | |
| 
 | |
| --connection default
 | |
| 
 | |
| DROP TABLE t1;
 | |
| 
 | |
| set global transaction isolation level repeatable read;
 |