1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
source include/have_debug.inc;
# Test for BUG #34982949: dirty reads with repeatable read isolation when "Using index for skip scan"
--echo # Test setup.
CREATE TABLE `demo` (
`id` varchar(40) NOT NULL,
`col_1` varchar(40) NOT NULL,
`col_2` varchar(40) DEFAULT NULL,
`col_3` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_sec` (`col_2`,`col_3`,`col_1`)
) ENGINE=InnoDB;
INSERT INTO demo (id, col_1, col_2, col_3) VALUES (1, 'same_value_col1', 'same_value_col2', 'different_value');
DELIMITER |;
CREATE PROCEDURE insert_demo_data()
BEGIN
DECLARE i INT DEFAULT 2;
DECLARE col_1 VARCHAR(40);
DECLARE col_2 VARCHAR(40);
DECLARE col_3 VARCHAR(45);
WHILE i <= 500 DO
IF i % 7 = 0 THEN
SET col_1 = 'another_value_col1';
SET col_2 = 'another_value_col1';
SET col_3 = 'another_value_col1';
ELSE
SET col_1 = 'same_value_col1';
SET col_2 = 'same_value_col2';
SET col_3 = 'same_value_col3';
END IF;
INSERT INTO demo (id, col_1, col_2, col_3) VALUES
(i, col_1, col_2, col_3);
SET i = i + 1;
END WHILE;
END |
DELIMITER ;|
CALL insert_demo_data();
connect (conn1, localhost, root,'', );
connect (conn2, localhost, root,'', );
connection conn1;
SET @@autocommit=0;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
connection conn2;
SET @@autocommit=0;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
--echo # Start transaction in conn1
connection conn1;
SELECT COUNT(*) FROM demo WHERE col_1='same_value_col1' AND col_3 IS NOT NULL;
--echo # Start transaction in conn2 which makes many uncommited rows, and should come before the readable rows with same key prefix.
connection conn2;
BEGIN;
UPDATE demo SET col_3 = NULL WHERE col_1='same_value_col1' AND col_3='same_value_col3';
--echo # In conn1 try repeating the previous query. The result should be same for REPEATABLE READ
connection conn1;
SELECT COUNT(*) FROM demo WHERE col_1='same_value_col1' AND col_3 IS NOT NULL;
connection conn2;
ROLLBACK;
connection conn1;
ROLLBACK;
--echo # Test cleanup
DROP PROCEDURE IF EXISTS insert_demo_data;
DROP TABLE demo;
|