2012-09-18 23:34:16 +03:00
|
|
|
##########################################################################
|
|
|
|
# LP bug #1035225 / MySQL bug #66301: INSERT ... ON DUPLICATE KEY UPDATE +
|
|
|
|
# innodb_autoinc_lock_mode=1 is broken
|
|
|
|
##########################################################################
|
|
|
|
|
|
|
|
--source include/have_innodb.inc
|
2018-11-02 14:17:19 +02:00
|
|
|
--source include/have_debug.inc
|
2012-09-18 23:34:16 +03:00
|
|
|
--source include/have_debug_sync.inc
|
2018-11-02 14:17:19 +02:00
|
|
|
--source include/innodb_binlog.inc
|
2012-09-18 23:34:16 +03:00
|
|
|
|
2018-11-02 14:17:19 +02:00
|
|
|
let $stmt= `SELECT @@GLOBAL.log_bin`;
|
2012-09-18 23:34:16 +03:00
|
|
|
|
2016-09-14 11:28:40 +03:00
|
|
|
set global transaction isolation level repeatable read;
|
|
|
|
|
2012-09-18 23:34:16 +03:00
|
|
|
CREATE TABLE t1(
|
|
|
|
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
|
|
|
k INT,
|
|
|
|
c CHAR(1),
|
|
|
|
UNIQUE KEY(k)) ENGINE=InnoDB;
|
|
|
|
|
2016-09-14 11:28:40 +03:00
|
|
|
SHOW CREATE TABLE t1;
|
|
|
|
|
2012-09-18 23:34:16 +03:00
|
|
|
--enable_info
|
|
|
|
|
2016-09-14 11:28:40 +03:00
|
|
|
--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;
|
2018-11-02 14:17:19 +02:00
|
|
|
|
2016-09-14 11:28:40 +03:00
|
|
|
--echo #
|
|
|
|
--echo # Parallel execution
|
|
|
|
--echo #
|
|
|
|
|
2012-09-18 23:34:16 +03:00
|
|
|
--connect(con2, localhost, root)
|
2016-09-19 19:55:49 +02:00
|
|
|
--send SET DEBUG_SYNC='now WAIT_FOR write_row_done'
|
2018-11-02 14:17:19 +02:00
|
|
|
|
|
|
|
--connect(con1, localhost, root)
|
2016-09-19 19:55:49 +02:00
|
|
|
SET DEBUG_SYNC='ha_write_row_end SIGNAL write_row_done WAIT_FOR continue';
|
2016-09-14 11:28:40 +03:00
|
|
|
--send INSERT INTO t1(k) VALUES (1), (2), (3) ON DUPLICATE KEY UPDATE c='1'
|
|
|
|
--connection con2
|
2016-09-19 19:55:49 +02:00
|
|
|
--reap
|
2018-11-02 14:17:19 +02:00
|
|
|
|
2016-09-19 19:55:49 +02:00
|
|
|
SET DEBUG_SYNC='execute_command_after_close_tables SIGNAL continue';
|
2018-11-02 14:17:19 +02:00
|
|
|
if ($stmt) {
|
2016-09-19 19:55:49 +02:00
|
|
|
--error ER_LOCK_WAIT_TIMEOUT
|
2016-09-14 11:28:40 +03:00
|
|
|
INSERT INTO t1(k) VALUES (2), (4), (5) ON DUPLICATE KEY UPDATE c='2';
|
2018-11-02 14:17:19 +02:00
|
|
|
}
|
|
|
|
if (!$stmt) {
|
|
|
|
INSERT INTO t1(k) VALUES (2), (4), (5) ON DUPLICATE KEY UPDATE c='2';
|
|
|
|
}
|
2016-09-14 11:28:40 +03:00
|
|
|
|
|
|
|
--connection con1
|
|
|
|
--echo #
|
|
|
|
--echo # 2 duplicates
|
|
|
|
--echo #
|
|
|
|
--reap
|
|
|
|
--connection default
|
|
|
|
--echo #
|
|
|
|
--echo # 3 rows
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
SELECT * FROM t1 order by k;
|
2012-09-18 23:34:16 +03:00
|
|
|
|
2016-09-14 11:28:40 +03:00
|
|
|
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)
|
2012-09-18 23:34:16 +03:00
|
|
|
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'
|
|
|
|
|
2018-11-02 14:17:19 +02:00
|
|
|
--connect(con2, localhost, root)
|
2012-10-31 18:45:25 +01:00
|
|
|
SET DEBUG_SYNC='ha_write_row_start WAIT_FOR continue2';
|
2012-09-18 23:34:16 +03:00
|
|
|
SET DEBUG_SYNC='after_mysql_insert SIGNAL continue1';
|
|
|
|
INSERT INTO t1(k) VALUES (2), (4), (5) ON DUPLICATE KEY UPDATE c='2';
|
2018-11-02 14:17:19 +02:00
|
|
|
--disconnect con2
|
2012-09-18 23:34:16 +03:00
|
|
|
|
|
|
|
--connection con1
|
|
|
|
--reap
|
|
|
|
--disable_info
|
|
|
|
SET DEBUG_SYNC='RESET';
|
2016-09-14 11:28:40 +03:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # 5 rows, gap in autoinc values
|
|
|
|
--echo #
|
2012-09-18 23:34:16 +03:00
|
|
|
SELECT * FROM t1 ORDER BY k;
|
|
|
|
|
|
|
|
--disconnect con1
|
|
|
|
|
|
|
|
--connection default
|
|
|
|
|
|
|
|
DROP TABLE t1;
|
2016-09-14 11:28:40 +03:00
|
|
|
|
|
|
|
set global transaction isolation level repeatable read;
|