diff options
-rw-r--r-- | mysql-test/r/innodb_mysql_lock.result | 32 | ||||
-rw-r--r-- | mysql-test/t/innodb_mysql_lock.test | 68 |
2 files changed, 100 insertions, 0 deletions
diff --git a/mysql-test/r/innodb_mysql_lock.result b/mysql-test/r/innodb_mysql_lock.result index 95adf712cb4..bf1c3a89f40 100644 --- a/mysql-test/r/innodb_mysql_lock.result +++ b/mysql-test/r/innodb_mysql_lock.result @@ -116,3 +116,35 @@ Table Op Msg_type Msg_text test.t1 optimize note Table does not support optimize, doing recreate + analyze instead test.t1 optimize status OK DROP TABLE t1; +# +# Bug#49891 View DDL breaks REPEATABLE READ +# +DROP TABLE IF EXISTS t1, t2; +DROP VIEW IF EXISTS v2; +CREATE TABLE t1 ( f1 INTEGER ) ENGINE = innodb; +CREATE TABLE t2 ( f1 INTEGER ); +CREATE VIEW v1 AS SELECT 1 FROM t1; +# Connection con3 +LOCK TABLE t1 WRITE; +# Connection default +START TRANSACTION; +# Sending: +SELECT * FROM v1; +# Connection con2 +# Waiting for 'SELECT * FROM v1' to sync in. +# Sending: +ALTER VIEW v1 AS SELECT 2 FROM t2; +# Connection con3 +# Waiting for 'ALTER VIEW v1 AS SELECT 2 FROM t2' to sync in. +UNLOCK TABLES; +# Connection default; +# Reaping: SELECT * FROM v1 +1 +SELECT * FROM v1; +1 +COMMIT; +# Connection con2 +# Reaping: ALTER VIEW v1 AS SELECT 2 FROM t2 +# Connection default +DROP TABLE t1, t2; +DROP VIEW v1; diff --git a/mysql-test/t/innodb_mysql_lock.test b/mysql-test/t/innodb_mysql_lock.test index 36d09b4c411..c8ece729b19 100644 --- a/mysql-test/t/innodb_mysql_lock.test +++ b/mysql-test/t/innodb_mysql_lock.test @@ -209,6 +209,74 @@ disconnect con1; DROP TABLE t1; +--echo # +--echo # Bug#49891 View DDL breaks REPEATABLE READ +--echo # + +--disable_warnings +DROP TABLE IF EXISTS t1, t2; +DROP VIEW IF EXISTS v2; +--enable_warnings + +CREATE TABLE t1 ( f1 INTEGER ) ENGINE = innodb; +CREATE TABLE t2 ( f1 INTEGER ); +CREATE VIEW v1 AS SELECT 1 FROM t1; + +connect (con2, localhost, root); +connect (con3, localhost, root); + +--echo # Connection con3 +connection con3; +LOCK TABLE t1 WRITE; + +--echo # Connection default +connection default; +START TRANSACTION; +# This should block due to t1 being locked. +--echo # Sending: +--send SELECT * FROM v1 + +--echo # Connection con2 +connection con2; +--echo # Waiting for 'SELECT * FROM v1' to sync in. +let $wait_condition= + SELECT COUNT(*) = 1 FROM information_schema.processlist + WHERE state = "Waiting for table" AND info = "SELECT * FROM v1"; +--source include/wait_condition.inc +# This should block due to v1 being locked. +--echo # Sending: +--send ALTER VIEW v1 AS SELECT 2 FROM t2 + +--echo # Connection con3 +connection con3; +--echo # Waiting for 'ALTER VIEW v1 AS SELECT 2 FROM t2' to sync in. +let $wait_condition= + SELECT COUNT(*) = 1 FROM information_schema.processlist + WHERE state = "Waiting for table" AND info = "ALTER VIEW v1 AS SELECT 2 FROM t2"; +--source include/wait_condition.inc +# Unlock t1 allowing SELECT * FROM v1 to proceed. +UNLOCK TABLES; + +--echo # Connection default; +connection default; +--echo # Reaping: SELECT * FROM v1 +--reap +SELECT * FROM v1; +COMMIT; + +--echo # Connection con2 +connection con2; +--echo # Reaping: ALTER VIEW v1 AS SELECT 2 FROM t2 +--reap + +--echo # Connection default +connection default; +DROP TABLE t1, t2; +DROP VIEW v1; +disconnect con2; +disconnect con3; + + # Check that all connections opened by test cases in this file are really # gone so execution of other tests won't be affected by their presence. --source include/wait_until_count_sessions.inc |