set @old_concurrent_insert= @@global.concurrent_insert; set @@global.concurrent_insert= 0; SET @dft_xengine_lock_wait_timeout = @@global.xengine_lock_wait_timeout; SET GLOBAL xengine_lock_wait_timeout = 100; SET @old_log_output = @@global.log_output; SET GLOBAL LOG_OUTPUT = 'FILE'; flush status; show status like 'Table_lock%'; Variable_name Value Table_locks_immediate 1 Table_locks_waited 0 select * from performance_schema.session_status where variable_name like 'Table_lock%'; VARIABLE_NAME VARIABLE_VALUE Table_locks_immediate 2 Table_locks_waited 0 set sql_log_bin=0; set @old_general_log = @@global.general_log; set global general_log = 'OFF'; drop table if exists t1; create table t1(n int); insert into t1 values(1); select get_lock('mysqltest_lock', 100); get_lock('mysqltest_lock', 100) 1 # Switched to connection: con2 # Sending: update t1 set n = get_lock('mysqltest_lock', 100) ; # Switched to connection: con1 # Wait for the first UPDATE to get blocked. # Sending: update t1 set n = 3; # Switched to connection: default # wait for the second UPDATE to get blocked Timeout in wait_condition.inc for select 1 from INFORMATION_SCHEMA.PROCESSLIST where ID = (select connection_id()) and STATE = "Waiting for table level lock" select release_lock('mysqltest_lock'); release_lock('mysqltest_lock') 1 # Switched to connection: con2 # Reaping first UPDATE select release_lock('mysqltest_lock'); release_lock('mysqltest_lock') 1 # Switched to connection: con1 # Reaping second UPDATE show status like 'Table_locks_waited'; Variable_name Value Table_locks_waited 0 # Switched to connection: default drop table t1; set global general_log = @old_general_log; select 1; 1 1 show status like 'last_query_cost'; Variable_name Value Last_query_cost 0.000000 create table t1 (a int); insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); analyze table t1; Table Op Msg_type Msg_text test.t1 analyze status OK select * from t1 where a=6; a 6 6 6 6 6 show status like 'last_query_cost'; Variable_name Value Last_query_cost 8.124000 show status like 'last_query_cost'; Variable_name Value Last_query_cost 8.124000 select 1; 1 1 show status like 'last_query_cost'; Variable_name Value Last_query_cost 0.000000 drop table t1; FLUSH STATUS; SHOW STATUS LIKE 'max_used_connections'; Variable_name Value Max_used_connections 1 SELECT * FROM performance_schema.session_status WHERE VARIABLE_NAME LIKE 'max_used_connections'; VARIABLE_NAME VARIABLE_VALUE Max_used_connections 1 SET @save_thread_cache_size=@@thread_cache_size; SET GLOBAL thread_cache_size=3; SHOW STATUS LIKE 'max_used_connections'; Variable_name Value Max_used_connections 3 SELECT * FROM performance_schema.session_status WHERE VARIABLE_NAME LIKE 'max_used_connections'; VARIABLE_NAME VARIABLE_VALUE Max_used_connections 3 FLUSH STATUS; SHOW STATUS LIKE 'max_used_connections'; Variable_name Value Max_used_connections 2 SELECT * FROM performance_schema.session_status WHERE VARIABLE_NAME LIKE 'max_used_connections'; VARIABLE_NAME VARIABLE_VALUE Max_used_connections 2 SHOW STATUS LIKE 'max_used_connections'; Variable_name Value Max_used_connections 3 SELECT * FROM performance_schema.session_status WHERE VARIABLE_NAME LIKE 'max_used_connections'; VARIABLE_NAME VARIABLE_VALUE Max_used_connections 3 SHOW STATUS LIKE 'max_used_connections'; Variable_name Value Max_used_connections 4 SELECT * FROM performance_schema.session_status WHERE VARIABLE_NAME LIKE 'max_used_connections'; VARIABLE_NAME VARIABLE_VALUE Max_used_connections 4 SET GLOBAL thread_cache_size=@save_thread_cache_size; CREATE TABLE t1 ( a INT ); INSERT INTO t1 VALUES (1), (2); analyze table t1; Table Op Msg_type Msg_text test.t1 analyze status OK SELECT a FROM t1 LIMIT 1; a 1 SHOW SESSION STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 2.724000 EXPLAIN SELECT a FROM t1; id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 NULL ALL NULL NULL NULL NULL 2 100.00 NULL Warnings: Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a` from `test`.`t1` SHOW SESSION STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 2.724000 SELECT a FROM t1 UNION SELECT a FROM t1 ORDER BY a; a 1 2 SHOW SESSION STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 5.448000 EXPLAIN SELECT a FROM t1 UNION SELECT a FROM t1 ORDER BY a; id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t1 NULL ALL NULL NULL NULL NULL 2 100.00 NULL 2 UNION t1 NULL ALL NULL NULL NULL NULL 2 100.00 NULL NULL UNION RESULT NULL ALL NULL NULL NULL NULL NULL NULL Using temporary; Using filesort Warnings: Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a` from `test`.`t1` union /* select#2 */ select `test`.`t1`.`a` AS `a` from `test`.`t1` order by ``.`a` SHOW SESSION STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 5.448000 SELECT a IN (SELECT a FROM t1) FROM t1 LIMIT 1; a IN (SELECT a FROM t1) 1 SHOW SESSION STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 5.448000 SELECT (SELECT a FROM t1 LIMIT 1) x FROM t1 LIMIT 1; x 1 SHOW SESSION STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 5.448000 SELECT * FROM t1 a, t1 b LIMIT 1; a a 2 1 SHOW SESSION STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 5.649096 DROP TABLE t1; flush status; show status like 'Com%function'; Variable_name Value Com_alter_function 0 Com_create_function 0 Com_drop_function 0 create function f1 (x INTEGER) returns integer begin declare ret integer; set ret = x * 10; return ret; end // drop function f1; show status like 'Com%function'; Variable_name Value Com_alter_function 0 Com_create_function 1 Com_drop_function 1 create database db37908; create table db37908.t1(f1 int); insert into db37908.t1 values(1); create user mysqltest_1@localhost; grant usage,execute on test.* to mysqltest_1@localhost; create procedure proc37908() begin select 1; end | create function func37908() returns int sql security invoker return (select * from db37908.t1 limit 1)| select * from db37908.t1; ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 't1' show status where variable_name ='uptime' and 2 in (select * from db37908.t1); ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 't1' show procedure status where name ='proc37908' and 1 in (select f1 from db37908.t1); ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 't1' show function status where name ='func37908' and 1 in (select func37908()); ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 't1' drop database db37908; drop procedure proc37908; drop function func37908; REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost; DROP USER mysqltest_1@localhost; DROP PROCEDURE IF EXISTS p1; DROP FUNCTION IF EXISTS f1; CREATE FUNCTION f1() RETURNS INTEGER BEGIN DECLARE foo INTEGER; DECLARE bar INTEGER; SET foo=1; SET bar=2; RETURN foo; END $$ CREATE PROCEDURE p1() BEGIN SELECT 1; END $$ SELECT f1(); f1() 1 CALL p1(); 1 1 SELECT 9; 9 9 DROP PROCEDURE p1; DROP FUNCTION f1; # # Test coverage for status variables which were introduced by # WL#5772 "Add partitioned Table Definition Cache to avoid # using LOCK_open and its derivatives in DML queries". # create table t1 (i int); create table t2 (j int); create table t3 (k int); # Flush table cache to ensure that it is empty and reset status # variables. Since to test cache overflow we will need to reduce # its size, also save original table cache size. flush tables; flush status; set @old_table_open_cache= @@table_open_cache; # Check that after reset all status variables are zero. show status like 'table_open_cache_%'; Variable_name Value Table_open_cache_hits 0 Table_open_cache_misses 0 Table_open_cache_overflows 0 # The first statement accessing t1 after flush should result # in table cache miss. select * from t1; i show status like 'table_open_cache_%'; Variable_name Value Table_open_cache_hits 1 Table_open_cache_misses 16 Table_open_cache_overflows 0 # The second statement accessing the same table should # result in table cache hit. select * from t1; i show status like 'table_open_cache_%'; Variable_name Value Table_open_cache_hits 2 Table_open_cache_misses 16 Table_open_cache_overflows 0 # Again table cache miss if accessing different table. select * from t2; j show status like 'table_open_cache_%'; Variable_name Value Table_open_cache_hits 18 Table_open_cache_misses 17 Table_open_cache_overflows 0 # And cache hit then accessing it second time. select * from t2; j show status like 'table_open_cache_%'; Variable_name Value Table_open_cache_hits 19 Table_open_cache_misses 17 Table_open_cache_overflows 0 # The below statement should result in 2 cache hits and # 4 cache misses since it needs 6 table instances in total. select * from t1 as a, t2 as b, t1 as c, t2 as d, t1 as e, t2 as f; i j i j i j show status like 'table_open_cache_%'; Variable_name Value Table_open_cache_hits 21 Table_open_cache_misses 21 Table_open_cache_overflows 0 # Reduce size of table cache to check that status # variable tracking cache overflows works. set @@global.table_open_cache= 4; # The below statement should result in table cache hit, but # as a side effect it should result in trimming of table # cache by 2 TABLE instances, meaning that overflow counter # will get increased by 2. select * from t1; i show status like 'table_open_cache_%'; Variable_name Value Table_open_cache_hits 22 Table_open_cache_misses 21 Table_open_cache_overflows 19 # This statement should result in 4 cache hits, 2 cache misses/ # overflows. select * from t1 as a, t2 as b, t1 as c, t2 as d, t1 as e, t2 as f; i j i j i j show status like 'table_open_cache_%'; Variable_name Value Table_open_cache_hits 25 Table_open_cache_misses 24 Table_open_cache_overflows 22 # Finally, the below statement should result in 1 cache miss # and 1 overflow since it accesses table which is not yet in # cache and table cache is full. select * from t3; k show status like 'table_open_cache_%'; Variable_name Value Table_open_cache_hits 25 Table_open_cache_misses 41 Table_open_cache_overflows 39 # Cleanup set @@global.table_open_cache= @old_table_open_cache; drop tables t1, t2, t3; SHOW STATUS LIKE 'max_used_connections_time'; Variable_name Value Max_used_connections_time DTVALUE # Should report 4 SHOW STATUS LIKE 'max_used_connections'; Variable_name Value Max_used_connections 4 # Should report 4 SHOW STATUS LIKE 'max_used_connections'; Variable_name Value Max_used_connections 4 # This should report 0 as it must have the same value as above TIMESTAMPDIFF(SECOND,'DTVALUE','DTVALUE') <> 0 0 # This should report 0 as timestamp is updated only when connection count strictly exceeds the previos highest value TIMESTAMPDIFF(SECOND,'DTVALUE','DTVALUE') <> 0 0 FLUSH STATUS; # This should not report 0 as FLUSH STATUS is called. TIMESTAMPDIFF(SECOND,'DTVALUE','DTVALUE') <> 0 1 set @@global.concurrent_insert= @old_concurrent_insert; SET GLOBAL log_output = @old_log_output; # # Bug#28786951 SET LAST_QUERY_COST FOR QUERIES WITH SUBQUERIES AND UNIONS # CREATE TABLE t1(x INT, y INT); INSERT INTO t1 VALUES (1, 2), (3, 4), (5, 6); ANALYZE TABLE t1; Table Op Msg_type Msg_text test.t1 analyze status OK EXPLAIN SELECT * FROM t1; id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 NULL ALL NULL NULL NULL NULL 3 100.00 NULL Warnings: Note 1003 /* select#1 */ select `test`.`t1`.`x` AS `x`,`test`.`t1`.`y` AS `y` from `test`.`t1` SHOW STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 2.836500 EXPLAIN SELECT (SELECT MAX(x) FROM t1) FROM t1; id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t1 NULL ALL NULL NULL NULL NULL 3 100.00 NULL 2 SUBQUERY t1 NULL ALL NULL NULL NULL NULL 3 100.00 NULL Warnings: Note 1003 /* select#1 */ select (/* select#2 */ select max(`test`.`t1`.`x`) from `test`.`t1`) AS `(SELECT MAX(x) FROM t1)` from `test`.`t1` SHOW STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 5.673000 EXPLAIN SELECT * FROM t1 WHERE x IN (SELECT MAX(x) FROM t1); id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t1 NULL ALL NULL NULL NULL NULL 3 100.00 Using where 2 SUBQUERY t1 NULL ALL NULL NULL NULL NULL 3 100.00 NULL Warnings: Note 1003 /* select#1 */ select `test`.`t1`.`x` AS `x`,`test`.`t1`.`y` AS `y` from `test`.`t1` where (`test`.`t1`.`x`,`test`.`t1`.`x` in ( (/* select#2 */ select max(`test`.`t1`.`x`) from `test`.`t1` having true ), (`test`.`t1`.`x` in on where ((`test`.`t1`.`x` = `materialized-subquery`.`MAX(x)`))))) SHOW STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 5.673000 EXPLAIN SELECT /*+ NO_MERGE(a) */ * FROM (SELECT * FROM t1) a, t1 b; id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 PRIMARY NULL ALL NULL NULL NULL NULL 3 100.00 NULL 1 PRIMARY b NULL ALL NULL NULL NULL NULL 3 100.00 Using join buffer (Block Nested Loop) 2 DERIVED t1 NULL ALL NULL NULL NULL NULL 3 100.00 NULL Warnings: Note 1003 /* select#1 */ select /*+ NO_MERGE(`a`@`select#1`) */ `a`.`x` AS `x`,`a`.`y` AS `y`,`test`.`b`.`x` AS `x`,`test`.`b`.`y` AS `y` from (/* select#2 */ select `test`.`t1`.`x` AS `x`,`test`.`t1`.`y` AS `y` from `test`.`t1`) `a` join `test`.`t1` `b` SHOW STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 9.110761 EXPLAIN SELECT * FROM t1 WHERE x > 0; id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 NULL ALL NULL NULL NULL NULL 3 33.33 Using where Warnings: Note 1003 /* select#1 */ select `test`.`t1`.`x` AS `x`,`test`.`t1`.`y` AS `y` from `test`.`t1` where (`test`.`t1`.`x` > 0) SHOW STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 2.836500 EXPLAIN SELECT * FROM t1 WHERE y > 0; id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 NULL ALL NULL NULL NULL NULL 3 33.33 Using where Warnings: Note 1003 /* select#1 */ select `test`.`t1`.`x` AS `x`,`test`.`t1`.`y` AS `y` from `test`.`t1` where (`test`.`t1`.`y` > 0) SHOW STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 2.836500 EXPLAIN SELECT * FROM t1 WHERE x > 0 UNION ALL SELECT * FROM t1 WHERE y > 0; id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t1 NULL ALL NULL NULL NULL NULL 3 33.33 Using where 2 UNION t1 NULL ALL NULL NULL NULL NULL 3 33.33 Using where Warnings: Note 1003 /* select#1 */ select `test`.`t1`.`x` AS `x`,`test`.`t1`.`y` AS `y` from `test`.`t1` where (`test`.`t1`.`x` > 0) union all /* select#2 */ select `test`.`t1`.`x` AS `x`,`test`.`t1`.`y` AS `y` from `test`.`t1` where (`test`.`t1`.`y` > 0) SHOW STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 5.673000 EXPLAIN SELECT * FROM t1 WHERE x > 0 UNION DISTINCT SELECT * FROM t1 WHERE y > 0; id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t1 NULL ALL NULL NULL NULL NULL 3 33.33 Using where 2 UNION t1 NULL ALL NULL NULL NULL NULL 3 33.33 Using where NULL UNION RESULT NULL ALL NULL NULL NULL NULL NULL NULL Using temporary Warnings: Note 1003 /* select#1 */ select `test`.`t1`.`x` AS `x`,`test`.`t1`.`y` AS `y` from `test`.`t1` where (`test`.`t1`.`x` > 0) union /* select#2 */ select `test`.`t1`.`x` AS `x`,`test`.`t1`.`y` AS `y` from `test`.`t1` where (`test`.`t1`.`y` > 0) SHOW STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 5.673000 EXPLAIN INSERT INTO t1 SELECT * FROM t1; id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 INSERT t1 NULL ALL NULL NULL NULL NULL NULL NULL NULL 1 SIMPLE t1 NULL ALL NULL NULL NULL NULL 3 100.00 Using temporary Warnings: Note 1003 insert into `test`.`t1` /* select#1 */ select sql_buffer_result `test`.`t1`.`x` AS `x`,`test`.`t1`.`y` AS `y` from `test`.`t1` SHOW STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 2.836500 EXPLAIN INSERT INTO t1 SELECT * FROM t1 WHERE x > 0 UNION ALL SELECT * FROM t1 WHERE y > 0; id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 INSERT t1 NULL ALL NULL NULL NULL NULL NULL NULL NULL 1 PRIMARY t1 NULL ALL NULL NULL NULL NULL 3 33.33 Using where 2 UNION t1 NULL ALL NULL NULL NULL NULL 3 33.33 Using where NULL UNION RESULT NULL ALL NULL NULL NULL NULL NULL NULL Using temporary Warnings: Note 1003 insert into `test`.`t1` /* select#1 */ select `test`.`t1`.`x` AS `x`,`test`.`t1`.`y` AS `y` from `test`.`t1` where (`test`.`t1`.`x` > 0) union all /* select#2 */ select `test`.`t1`.`x` AS `x`,`test`.`t1`.`y` AS `y` from `test`.`t1` where (`test`.`t1`.`y` > 0) SHOW STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 5.673000 EXPLAIN INSERT INTO t1 SELECT * FROM t1 WHERE x > 0 UNION DISTINCT SELECT * FROM t1 WHERE y > 0; id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 INSERT t1 NULL ALL NULL NULL NULL NULL NULL NULL NULL 1 PRIMARY t1 NULL ALL NULL NULL NULL NULL 3 33.33 Using where 2 UNION t1 NULL ALL NULL NULL NULL NULL 3 33.33 Using where NULL UNION RESULT NULL ALL NULL NULL NULL NULL NULL NULL Using temporary Warnings: Note 1003 insert into `test`.`t1` /* select#1 */ select `test`.`t1`.`x` AS `x`,`test`.`t1`.`y` AS `y` from `test`.`t1` where (`test`.`t1`.`x` > 0) union /* select#2 */ select `test`.`t1`.`x` AS `x`,`test`.`t1`.`y` AS `y` from `test`.`t1` where (`test`.`t1`.`y` > 0) SHOW STATUS LIKE 'Last_query_cost'; Variable_name Value Last_query_cost 5.673000 DROP TABLE t1; SET @@global.xengine_lock_wait_timeout = @dft_xengine_lock_wait_timeout;