用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

571 lines
17 KiB

# This test requires that --log-output includes 'table', and the general
# log is on
# When running with valgrind, we switch off --check-testcases, and get
# different connection_id below, and a content mismatch error.
-- source include/not_valgrind.inc
# Save the initial number of concurrent sessions
--source include/count_sessions.inc
# Disable concurrent inserts to avoid sporadic test failures as it might
# affect the the value of variables used throughout the test case.
set @old_concurrent_insert= @@global.concurrent_insert;
set @@global.concurrent_insert= 0;
# Disable logging to table, since this will also cause table locking and unlocking, which will
# show up in SHOW STATUS and may cause sporadic failures
SET @old_log_output = @@global.log_output;
SET GLOBAL LOG_OUTPUT = 'FILE';
# PS causes different statistics
--disable_ps_protocol
connect (con1,localhost,root,,);
connect (con2,localhost,root,,);
connection default;
flush status;
show status like 'Table_lock%';
--disable_warnings
select * from performance_schema.session_status where variable_name like 'Table_lock%';
--enable_warnings
set sql_log_bin=0;
set @old_general_log = @@global.general_log;
set global general_log = 'OFF';
--disable_warnings
drop table if exists t1;
--enable_warnings
create table t1(n int);
insert into t1 values(1);
select get_lock('mysqltest_lock', 100);
connection con2;
--echo # Switched to connection: con2
--echo # Sending:
--send update t1 set n = get_lock('mysqltest_lock', 100)
connection con1;
--echo # Switched to connection: con1
--echo # Wait for the first UPDATE to get blocked.
let $wait_condition= select count(*) from INFORMATION_SCHEMA.PROCESSLIST
where STATE = "User lock" and
INFO = "update t1 set n = get_lock('mysqltest_lock', 100)";
--source include/wait_condition.inc
--echo # Sending:
--send update t1 set n = 3
connection default;
--echo # Switched to connection: default
--echo # wait for the second UPDATE to get blocked
let $wait_condition= select 1 from INFORMATION_SCHEMA.PROCESSLIST
where ID = (select connection_id()) and STATE = "Waiting for table level lock";
--source include/wait_condition.inc
select release_lock('mysqltest_lock');
connection con2;
--echo # Switched to connection: con2
--echo # Reaping first UPDATE
--reap
select release_lock('mysqltest_lock');
connection con1;
--echo # Switched to connection: con1
--echo # Reaping second UPDATE
reap;
show status like 'Table_locks_waited';
connection default;
--echo # Switched to connection: default
drop table t1;
set global general_log = @old_general_log;
disconnect con2;
disconnect con1;
# End of 4.1 tests
#
# last_query_cost
#
select 1;
show status like 'last_query_cost';
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;
select * from t1 where a=6;
show status like 'last_query_cost';
# Ensure value dosn't change by second status call
show status like 'last_query_cost';
select 1;
show status like 'last_query_cost';
drop table t1;
#
# Test for Bug#15933 max_used_connections is wrong after FLUSH STATUS
# if connections are cached
#
#
# The first suggested fix from the bug report was chosen
# (see http://bugs.mysql.com/bug.php?id=15933):
#
# a) On flushing the status, set max_used_connections to
# threads_connected, not to 0.
#
# b) Check if it is necessary to increment max_used_connections when
# taking a thread from the cache as well as when creating new threads
#
# Wait for at most $disconnect_timeout seconds for disconnects to finish.
let $disconnect_timeout = 10;
# Wait for any previous disconnects to finish.
FLUSH STATUS;
--disable_query_log
--disable_result_log
eval SET @wait_left = $disconnect_timeout;
let $max_used_connections = `SHOW STATUS LIKE 'max_used_connections'`;
eval SET @max_used_connections = SUBSTRING('$max_used_connections', 21)+0;
let $wait_more = `SELECT @max_used_connections != 1 && @wait_left > 0`;
while ($wait_more)
{
sleep 1;
FLUSH STATUS;
SET @wait_left = @wait_left - 1;
let $max_used_connections = `SHOW STATUS LIKE 'max_used_connections'`;
eval SET @max_used_connections = SUBSTRING('$max_used_connections', 21)+0;
let $wait_more = `SELECT @max_used_connections != 1 && @wait_left > 0`;
}
--enable_query_log
--enable_result_log
# Prerequisite.
SHOW STATUS LIKE 'max_used_connections';
--disable_warnings
SELECT * FROM performance_schema.session_status WHERE VARIABLE_NAME LIKE 'max_used_connections';
--enable_warnings
# Save original setting.
SET @save_thread_cache_size=@@thread_cache_size;
SET GLOBAL thread_cache_size=3;
connect (con1,localhost,root,,);
connect (con2,localhost,root,,);
connection con1;
disconnect con2;
# Check that max_used_connections still reflects maximum value.
SHOW STATUS LIKE 'max_used_connections';
--disable_warnings
SELECT * FROM performance_schema.session_status WHERE VARIABLE_NAME LIKE 'max_used_connections';
--enable_warnings
# Check that after flush max_used_connections equals to current number
# of connections. First wait for previous disconnect to finish.
FLUSH STATUS;
--disable_query_log
--disable_result_log
eval SET @wait_left = $disconnect_timeout;
let $max_used_connections = `SHOW STATUS LIKE 'max_used_connections'`;
eval SET @max_used_connections = SUBSTRING('$max_used_connections', 21)+0;
let $wait_more = `SELECT @max_used_connections != 2 && @wait_left > 0`;
while ($wait_more)
{
sleep 1;
FLUSH STATUS;
SET @wait_left = @wait_left - 1;
let $max_used_connections = `SHOW STATUS LIKE 'max_used_connections'`;
eval SET @max_used_connections = SUBSTRING('$max_used_connections', 21)+0;
let $wait_more = `SELECT @max_used_connections != 2 && @wait_left > 0`;
}
--enable_query_log
--enable_result_log
# Check that we don't count disconnected thread any longer.
SHOW STATUS LIKE 'max_used_connections';
--disable_warnings
SELECT * FROM performance_schema.session_status WHERE VARIABLE_NAME LIKE 'max_used_connections';
--enable_warnings
# Check that max_used_connections is updated when cached thread is
# reused...
connect (con2,localhost,root,,);
SHOW STATUS LIKE 'max_used_connections';
--disable_warnings
SELECT * FROM performance_schema.session_status WHERE VARIABLE_NAME LIKE 'max_used_connections';
--enable_warnings
# ...and when new thread is created.
connect (con3,localhost,root,,);
SHOW STATUS LIKE 'max_used_connections';
--disable_warnings
SELECT * FROM performance_schema.session_status WHERE VARIABLE_NAME LIKE 'max_used_connections';
--enable_warnings
# Restore original setting.
connection default;
SET GLOBAL thread_cache_size=@save_thread_cache_size;
disconnect con3;
disconnect con2;
disconnect con1;
#
# Bug#30377 EXPLAIN loses last_query_cost when used with UNION
#
CREATE TABLE t1 ( a INT );
INSERT INTO t1 VALUES (1), (2);
analyze table t1;
SELECT a FROM t1 LIMIT 1;
SHOW SESSION STATUS LIKE 'Last_query_cost';
EXPLAIN SELECT a FROM t1;
SHOW SESSION STATUS LIKE 'Last_query_cost';
SELECT a FROM t1 UNION SELECT a FROM t1 ORDER BY a;
SHOW SESSION STATUS LIKE 'Last_query_cost';
EXPLAIN SELECT a FROM t1 UNION SELECT a FROM t1 ORDER BY a;
SHOW SESSION STATUS LIKE 'Last_query_cost';
SELECT a IN (SELECT a FROM t1) FROM t1 LIMIT 1;
SHOW SESSION STATUS LIKE 'Last_query_cost';
SELECT (SELECT a FROM t1 LIMIT 1) x FROM t1 LIMIT 1;
SHOW SESSION STATUS LIKE 'Last_query_cost';
SELECT * FROM t1 a, t1 b ORDER BY a.a, b.a LIMIT 1;
SHOW SESSION STATUS LIKE 'Last_query_cost';
DROP TABLE t1;
#
# Bug#30252 Com_create_function is not incremented.
#
flush status;
show status like 'Com%function';
DELIMITER //;
create function f1 (x INTEGER) returns integer
begin
declare ret integer;
set ret = x * 10;
return ret;
end //
DELIMITER ;//
drop function f1;
show status like 'Com%function';
#
# Bug#37908 Skipped access right check caused server crash.
#
connect (root, localhost, root,,test);
connection root;
let $root_connection_id= `select connection_id()`;
--disable_warnings
create database db37908;
--enable_warnings
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;
delimiter |;
create procedure proc37908() begin select 1; end |
create function func37908() returns int sql security invoker
return (select * from db37908.t1 limit 1)|
delimiter ;|
connect (user1,localhost,mysqltest_1,,test);
connection user1;
let $user1_connection_id= `select connection_id()`;
--error ER_TABLEACCESS_DENIED_ERROR
select * from db37908.t1;
--error ER_TABLEACCESS_DENIED_ERROR
show status where variable_name ='uptime' and 2 in (select * from db37908.t1);
--error ER_TABLEACCESS_DENIED_ERROR
show procedure status where name ='proc37908' and 1 in (select f1 from db37908.t1);
--error ER_TABLEACCESS_DENIED_ERROR
show function status where name ='func37908' and 1 in (select func37908());
connection default;
disconnect user1;
disconnect root;
drop database db37908;
drop procedure proc37908;
drop function func37908;
REVOKE ALL PRIVILEGES, GRANT OPTION FROM mysqltest_1@localhost;
DROP USER mysqltest_1@localhost;
# Wait till the sessions user1 and root are disconnected
let $wait_condition =
SELECT COUNT(*) = 0
FROM information_schema.processlist
WHERE id in ('$root_connection_id','$user1_connection_id');
--source include/wait_condition.inc
#
# Bug#41131 "Questions" fails to increment - ignores statements instead stored procs
#
connect (con1,localhost,root,,);
connection con1;
--disable_warnings
DROP PROCEDURE IF EXISTS p1;
DROP FUNCTION IF EXISTS f1;
--enable_warnings
DELIMITER $$;
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 $$
DELIMITER ;$$
let $org_queries= `SHOW STATUS LIKE 'Queries'`;
SELECT f1();
CALL p1();
let $new_queries= `SHOW STATUS LIKE 'Queries'`;
--disable_query_log
let $diff= `SELECT SUBSTRING('$new_queries',9)-SUBSTRING('$org_queries',9)`;
--enable_query_log
eval SELECT $diff;
disconnect con1;
connection default;
DROP PROCEDURE p1;
DROP FUNCTION f1;
# End of 5.1 tests
--echo #
--echo # Test coverage for status variables which were introduced by
--echo # WL#5772 "Add partitioned Table Definition Cache to avoid
--echo # using LOCK_open and its derivatives in DML queries".
--echo #
create table t1 (i int);
create table t2 (j int);
create table t3 (k int);
--echo # Flush table cache to ensure that it is empty and reset status
--echo # variables. Since to test cache overflow we will need to reduce
--echo # its size, also save original table cache size.
flush tables;
flush status;
set @old_table_open_cache= @@table_open_cache;
--echo # Check that after reset all status variables are zero.
show status like 'table_open_cache_%';
--echo # The first statement accessing t1 after flush should result
--echo # in table cache miss.
select * from t1;
show status like 'table_open_cache_%';
--echo # The second statement accessing the same table should
--echo # result in table cache hit.
select * from t1;
show status like 'table_open_cache_%';
--echo # Again table cache miss if accessing different table.
select * from t2;
show status like 'table_open_cache_%';
--echo # And cache hit then accessing it second time.
select * from t2;
show status like 'table_open_cache_%';
--echo # The below statement should result in 2 cache hits and
--echo # 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;
show status like 'table_open_cache_%';
--echo # Reduce size of table cache to check that status
--echo # variable tracking cache overflows works.
set @@global.table_open_cache= 4;
--echo # The below statement should result in table cache hit, but
--echo # as a side effect it should result in trimming of table
--echo # cache by 2 TABLE instances, meaning that overflow counter
--echo # will get increased by 2.
select * from t1;
show status like 'table_open_cache_%';
--echo # This statement should result in 4 cache hits, 2 cache misses/
--echo # overflows.
select * from t1 as a, t2 as b, t1 as c, t2 as d, t1 as e, t2 as f;
show status like 'table_open_cache_%';
--echo # Finally, the below statement should result in 1 cache miss
--echo # and 1 overflow since it accesses table which is not yet in
--echo # cache and table cache is full.
select * from t3;
show status like 'table_open_cache_%';
--echo # Cleanup
set @@global.table_open_cache= @old_table_open_cache;
drop tables t1, t2, t3;
#
# Bug#11766596: UPDATE A TIMESTAMP VARIABLE EVERY TIME REACHES MAX_USED_CONNECTIONS
#
connect (con1,localhost,root,,);
--replace_regex /[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]*/DTVALUE/
SHOW STATUS LIKE 'max_used_connections_time';
--sleep 1
connect (con2,localhost,root,,);
--sleep 1
connect (con3,localhost,root,,);
--echo # Should report 4
SHOW STATUS LIKE 'max_used_connections';
let $time_1=`SELECT VARIABLE_VALUE FROM performance_schema.session_status WHERE VARIABLE_NAME LIKE 'max_used_connections_time'`;
--sleep 1
disconnect con2;
let $time_2=`SELECT VARIABLE_VALUE FROM performance_schema.session_status WHERE VARIABLE_NAME LIKE 'max_used_connections_time'`;
--sleep 1
connect (con4,localhost,root,,);
--echo # Should report 4
SHOW STATUS LIKE 'max_used_connections';
let $time_3=`SELECT VARIABLE_VALUE FROM performance_schema.session_status WHERE VARIABLE_NAME LIKE 'max_used_connections_time'`;
--echo # This should report 0 as it must have the same value as above
--replace_regex /[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]*/DTVALUE/
--disable_query_log ONCE
--eval SELECT TIMESTAMPDIFF(SECOND,'$time_1','$time_2') <> 0
--echo # This should report 0 as timestamp is updated only when connection count strictly exceeds the previos highest value
--replace_regex /[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]*/DTVALUE/
--disable_query_log ONCE
--eval SELECT TIMESTAMPDIFF(SECOND,'$time_1','$time_3') <> 0
disconnect con1;
disconnect con3;
--sleep 1
FLUSH STATUS;
let $time_4=`SELECT VARIABLE_VALUE FROM performance_schema.session_status WHERE VARIABLE_NAME LIKE 'max_used_connections_time'`;
--echo # This should not report 0 as FLUSH STATUS is called.
--replace_regex /[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]*/DTVALUE/
--disable_query_log ONCE
--eval SELECT TIMESTAMPDIFF(SECOND,'$time_4','$time_3') <> 0
disconnect con4;
# Restore global concurrent_insert value. Keep in the end of the test file.
--connection default
set @@global.concurrent_insert= @old_concurrent_insert;
SET GLOBAL log_output = @old_log_output;
# Wait till we reached the initial number of concurrent sessions
--source include/wait_until_count_sessions.inc
--echo #
--echo # Bug#28786951 SET LAST_QUERY_COST FOR QUERIES WITH SUBQUERIES AND UNIONS
--echo #
CREATE TABLE t1(x INT, y INT);
INSERT INTO t1 VALUES (1, 2), (3, 4), (5, 6);
ANALYZE TABLE t1;
EXPLAIN SELECT * FROM t1;
SHOW STATUS LIKE 'Last_query_cost';
EXPLAIN SELECT (SELECT MAX(x) FROM t1) FROM t1;
SHOW STATUS LIKE 'Last_query_cost';
EXPLAIN SELECT * FROM t1 WHERE x IN (SELECT MAX(x) FROM t1);
SHOW STATUS LIKE 'Last_query_cost';
EXPLAIN SELECT /*+ NO_MERGE(a) */ * FROM (SELECT * FROM t1) a, t1 b;
SHOW STATUS LIKE 'Last_query_cost';
EXPLAIN SELECT * FROM t1 WHERE x > 0;
SHOW STATUS LIKE 'Last_query_cost';
EXPLAIN SELECT * FROM t1 WHERE y > 0;
SHOW STATUS LIKE 'Last_query_cost';
EXPLAIN SELECT * FROM t1 WHERE x > 0
UNION ALL
SELECT * FROM t1 WHERE y > 0;
SHOW STATUS LIKE 'Last_query_cost';
EXPLAIN SELECT * FROM t1 WHERE x > 0
UNION DISTINCT
SELECT * FROM t1 WHERE y > 0;
SHOW STATUS LIKE 'Last_query_cost';
EXPLAIN INSERT INTO t1 SELECT * FROM t1;
SHOW STATUS LIKE 'Last_query_cost';
EXPLAIN INSERT INTO t1
SELECT * FROM t1 WHERE x > 0
UNION ALL
SELECT * FROM t1 WHERE y > 0;
SHOW STATUS LIKE 'Last_query_cost';
EXPLAIN INSERT INTO t1
SELECT * FROM t1 WHERE x > 0
UNION DISTINCT
SELECT * FROM t1 WHERE y > 0;
SHOW STATUS LIKE 'Last_query_cost';
DROP TABLE t1;
--echo #
--echo # Bug#28884359: LAST_QUERY_COST IS NEGATIVE AFTER ORDER BY/LIMIT QUERY
--echo #
CREATE TABLE t1 (pk INTEGER PRIMARY KEY,
i1 INTEGER,
i2 INTEGER NOT NULL,
INDEX k1 (i1),
INDEX k2 (i1, i2));
INSERT INTO t1 VALUES
(1, NULL, 43), (11, NULL, 103), (10, 32,50), (9, 12, 43),
(8, NULL, 13), (7, 48, 90), (6, 56, 90), (5, 87, 84),
(4, 58, 98), (3, 30, 82), (2, 54, 57), (12, 232, 43),
(13, 43, 103), (14, 32, 45), (15, 12, 43), (16, 89, 23),
(17, 48, 90), (18, 56, 90), (19, 87, 84);
CREATE TABLE t2 (pk INTEGER PRIMARY KEY,
i1 INTEGER NOT NULL,
INDEX k1 (i1));
INSERT INTO t2 VALUES
(3, 89), (4, 98), (5, 84), (6, 8), (7, 99), (8, 110),
(9, 84), (10, 98), (11, 103), (12, 50), (13, 84),
(14, 57), (15, 82), (16, 103), (2, 98), (1, 90);
ANALYZE TABLE t1, t2;
EXPLAIN SELECT * FROM t1, t2 WHERE t1.i1 = t2.i1 ORDER BY t1.i1 LIMIT 10;
SHOW STATUS LIKE 'Last_query_cost';
DROP TABLE t1, t2;