summaryrefslogtreecommitdiffstats
path: root/mysql-test/main/mdl.test
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/main/mdl.test')
-rw-r--r--mysql-test/main/mdl.test137
1 files changed, 137 insertions, 0 deletions
diff --git a/mysql-test/main/mdl.test b/mysql-test/main/mdl.test
new file mode 100644
index 00000000..65d02d77
--- /dev/null
+++ b/mysql-test/main/mdl.test
@@ -0,0 +1,137 @@
+--source include/have_metadata_lock_info.inc
+--source include/have_innodb.inc
+
+--echo #
+--echo # MDEV-12882 - Assertion `mdl_ticket->m_type == MDL_SHARED_UPGRADABLE ||
+--echo # mdl_ticket->m_type == MDL_SHARED_NO_WRITE ||
+--echo # mdl_ticket->m_type == MDL_SHARED_NO_READ_WRITE ||
+--echo # mdl_ticket->m_type == MDL_SHARED_READ'
+--echo # failed in MDL_context::upgrade_shared_lock
+--echo #
+--disable_service_connection
+CREATE TABLE t1(a INT) ENGINE=InnoDB;
+CREATE TABLE t3(a INT) ENGINE=myisam;
+LOCK TABLES t1 WRITE CONCURRENT, t1 AS t2 READ;
+SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info
+WHERE TABLE_NAME NOT LIKE 'innodb_%_stats';
+UNLOCK TABLES;
+LOCK TABLES t1 AS t2 READ, t1 WRITE CONCURRENT;
+SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info
+WHERE TABLE_NAME NOT LIKE 'innodb_%_stats';
+UNLOCK TABLES;
+LOCK TABLES t1 WRITE CONCURRENT, t3 WRITE;
+SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info
+WHERE TABLE_NAME NOT LIKE 'innodb_%_stats';
+UNLOCK TABLES;
+LOCK TABLES t3 WRITE, t1 WRITE CONCURRENT;
+SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info
+WHERE TABLE_NAME NOT LIKE 'innodb_%_stats';
+UNLOCK TABLES;
+LOCK TABLES t1 WRITE, mysql.user WRITE;
+SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info
+WHERE TABLE_NAME NOT LIKE 'innodb_%_stats';
+UNLOCK TABLES;
+--error ER_CANT_LOCK_LOG_TABLE
+LOCK TABLES mysql.general_log WRITE;
+# The following may work in embedded server
+--error 0,ER_DBACCESS_DENIED_ERROR
+LOCK TABLES t1 WRITE,information_schema.tables READ;
+UNLOCK TABLES;
+DROP TABLE t1,t3;
+
+--echo #
+--echo # Check MDL locks taken for different kind of tables by open
+--echo #
+
+CREATE TABLE t1(a INT) ENGINE=InnoDB;
+CREATE TABLE t3(a INT) ENGINE=myisam;
+connect(purge_control,localhost,root,,);
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+connect (locker,localhost,root,,);
+connection default;
+
+FLUSH TABLES WITH READ LOCK;
+connection locker;
+--send insert into t1 values (1)
+connection default;
+# Wait till above update gets blocked on a user lock.
+let $wait_condition=
+ select count(*) > 0 from information_schema.processlist
+ where state = "Waiting for backup lock";
+--source include/wait_condition.inc
+connection default;
+SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info
+WHERE TABLE_NAME NOT LIKE 'innodb_%_stats';
+unlock tables;
+connection locker;
+--reap
+unlock tables;
+connection default;
+
+FLUSH TABLES WITH READ LOCK;
+connection locker;
+--send insert into t3 values (2)
+connection default;
+# Wait till above update gets blocked on a user lock.
+let $wait_condition=
+ select count(*) > 0 from information_schema.processlist
+ where state = "Waiting for backup lock";
+--source include/wait_condition.inc
+connection default;
+SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info
+WHERE TABLE_NAME NOT LIKE 'innodb_%_stats';
+unlock tables;
+connection locker;
+--reap
+unlock tables;
+disconnect purge_control;
+connection default;
+
+disconnect locker;
+DROP TABLE t1,t3;
+--enable_service_connection
+
+--echo #
+--echo # MDEV-28820 MyISAM wrong server status flags
+--echo #
+--disable_view_protocol
+# MyISAM alone doesn't start a transaction or takes transactional MDL
+create table t1 (a int);
+set autocommit=0;
+select @@in_transaction;
+select * from t1;
+select @@in_transaction;
+connect foo,localhost,root;
+drop table t1;
+connection default;
+set autocommit=1;
+
+# MyISAM in a transaction (started by InnoDB) takes transactional MDL all right
+create table t1 (a int);
+create table t2 (b int) engine=innodb;
+set autocommit=0;
+select @@in_transaction;
+select * from t2;
+select @@in_transaction;
+select * from t1;
+connection foo;
+send drop table t1;
+connection default;
+let $wait_condition=
+ select count(*) > 0 from information_schema.processlist
+ where state = "Waiting for table metadata lock";
+--source include/wait_condition.inc
+select * from t1;
+commit;
+
+connection foo;
+reap;
+disconnect foo;
+connection default;
+set autocommit=default;
+drop table t2;
+--enable_view_protocol
+
+--echo #
+--echo # End of 10.4 tests
+--echo #