if (`SELECT COUNT(*) = 0 FROM performance_schema.global_status WHERE LOWER(variable_name) = 'innodb_page_size' AND variable_value <= 16384`) { --skip Test requires InnoDB with page size not greater than 16k. } --echo # --echo # Full-column secondary index on an externally stored clustered field --echo # CREATE TABLE t1 ( id INT PRIMARY KEY, c VARCHAR(2000) CHARACTER SET latin1 NOT NULL, p1 VARCHAR(2000) CHARACTER SET latin1 NOT NULL, p2 VARCHAR(2000) CHARACTER SET latin1 NOT NULL, p3 VARCHAR(2000) CHARACTER SET latin1 NOT NULL, p4 VARCHAR(2000) CHARACTER SET latin1 NOT NULL, p5 VARCHAR(2000) CHARACTER SET latin1 NOT NULL, KEY k_c(c) ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; SET @p = REPEAT('b', 2000); INSERT INTO t1 VALUES (1, REPEAT('a', 2000), @p, @p, @p, @p, @p); SELECT id, LEFT(p1, 1) AS p1_prefix FROM t1 FORCE INDEX(k_c) WHERE c = REPEAT('a', 2000); --echo # --echo # READ UNCOMMITTED forces the secondary-to-clustered consistency check --echo # SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT id, LEFT(p1, 1) AS p1_prefix FROM t1 FORCE INDEX(k_c) WHERE c = REPEAT('a', 2000); --echo # --echo # READ COMMITTED current clustered version control --echo # SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT id, LEFT(p1, 1) AS p1_prefix FROM t1 FORCE INDEX(k_c) WHERE c = REPEAT('a', 2000); SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; --echo # --echo # Old clustered version reached through the same full-column secondary --echo # --connect (con1,localhost,root,,) SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; START TRANSACTION; SELECT id FROM t1 WHERE id = 1; --connection default UPDATE t1 SET p5 = REPEAT('c', 2000) WHERE id = 1; --connection con1 SELECT id, LEFT(p1, 1) AS p1_prefix FROM t1 FORCE INDEX(k_c) WHERE c = REPEAT('a', 2000); COMMIT; --disconnect con1 --connection default --echo # --echo # READ COMMITTED old version while another transaction is uncommitted --echo # --connect (con2,localhost,root,,) SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; START TRANSACTION; --connection default START TRANSACTION; UPDATE t1 SET p5 = REPEAT('d', 2000) WHERE id = 1; --connection con2 SELECT id, LEFT(p1, 1) AS p1_prefix FROM t1 FORCE INDEX(k_c) WHERE c = REPEAT('a', 2000); COMMIT; --disconnect con2 --connection default ROLLBACK; DROP TABLE t1;