mirror of
https://github.com/MariaDB/server.git
synced 2025-01-24 15:54:37 +01:00
190 lines
3.8 KiB
Text
190 lines
3.8 KiB
Text
|
#
|
||
|
# Test behavior of MAX_STATEMENT_TIME.
|
||
|
#
|
||
|
|
||
|
--source include/not_embedded.inc
|
||
|
--source include/have_innodb.inc
|
||
|
|
||
|
--echo
|
||
|
--echo # Test the MAX_STATEMENT_TIME option.
|
||
|
--echo
|
||
|
|
||
|
SET @@MAX_STATEMENT_TIME=2;
|
||
|
select @@max_statement_time;
|
||
|
SELECT SLEEP(1);
|
||
|
SELECT SLEEP(3);
|
||
|
SET @@MAX_STATEMENT_TIME=0;
|
||
|
SELECT SLEEP(1);
|
||
|
SHOW STATUS LIKE "max_statement_time_exceeded";
|
||
|
|
||
|
CREATE TABLE t1 (a INT, b VARCHAR(300)) engine=myisam;
|
||
|
|
||
|
INSERT INTO t1 VALUES (1, 'string');
|
||
|
|
||
|
--disable_result_log
|
||
|
--disable_query_log
|
||
|
|
||
|
SET @@MAX_STATEMENT_TIME=2;
|
||
|
|
||
|
SET @@MAX_STATEMENT_TIME=0.1;
|
||
|
WHILE (! $mysql_errno)
|
||
|
{
|
||
|
SET @@MAX_STATEMENT_TIME=0;
|
||
|
INSERT INTO t1 SELECT * FROM t1;
|
||
|
SET @@MAX_STATEMENT_TIME=0.1;
|
||
|
--error 0,ER_STATEMENT_TIMEOUT
|
||
|
SELECT COUNT(*) FROM t1 WHERE b LIKE '%z%';
|
||
|
}
|
||
|
SET @@MAX_STATEMENT_TIME=0;
|
||
|
|
||
|
--enable_query_log
|
||
|
--enable_result_log
|
||
|
|
||
|
eval SELECT $mysql_errno;
|
||
|
|
||
|
--echo
|
||
|
--echo # Test the MAX_STATEMENT_TIME option with SF (should have no effect).
|
||
|
--echo
|
||
|
|
||
|
DELIMITER |;
|
||
|
|
||
|
CREATE PROCEDURE p1()
|
||
|
BEGIN
|
||
|
declare tmp int;
|
||
|
SET @@MAX_STATEMENT_TIME=0.0001;
|
||
|
SELECT COUNT(*) INTO tmp FROM t1 WHERE b LIKE '%z%';
|
||
|
SET @@MAX_STATEMENT_TIME=0;
|
||
|
END|
|
||
|
|
||
|
CREATE PROCEDURE p2()
|
||
|
BEGIN
|
||
|
SET @@MAX_STATEMENT_TIME=5;
|
||
|
END|
|
||
|
|
||
|
DELIMITER ;|
|
||
|
|
||
|
SELECT @@MAX_STATEMENT_TIME;
|
||
|
CALL p1();
|
||
|
CALL p2();
|
||
|
SELECT @@MAX_STATEMENT_TIME;
|
||
|
SET @@MAX_STATEMENT_TIME=0;
|
||
|
|
||
|
DROP PROCEDURE p1;
|
||
|
DROP PROCEDURE p2;
|
||
|
DROP TABLE t1;
|
||
|
|
||
|
--echo
|
||
|
--echo # MAX_STATEMENT_TIME account resource
|
||
|
--echo
|
||
|
|
||
|
GRANT USAGE ON *.* TO user1@localhost WITH MAX_STATEMENT_TIME 1.005;
|
||
|
|
||
|
--echo # con1
|
||
|
connect(con1,localhost,user1,,test,,);
|
||
|
SELECT @@max_statement_time;
|
||
|
disconnect con1;
|
||
|
|
||
|
--echo # restart and reconnect
|
||
|
connection default;
|
||
|
source include/restart_mysqld.inc;
|
||
|
|
||
|
set @global.userstat=1;
|
||
|
connect(con1,localhost,user1,,test,,);
|
||
|
SELECT @@global.max_statement_time,@@session.max_statement_time;
|
||
|
select sleep(100);
|
||
|
SHOW STATUS LIKE "max_statement_time_exceeded";
|
||
|
disconnect con1;
|
||
|
|
||
|
connection default;
|
||
|
show grants for user1@localhost;
|
||
|
--disable_parsing
|
||
|
select max_user_timeouts from information_schema.user_statistics where user="user1";
|
||
|
--enable_parsing
|
||
|
|
||
|
set @global.userstat=0;
|
||
|
DROP USER user1@localhost;
|
||
|
|
||
|
--echo
|
||
|
--echo # MAX_STATEMENT_TIME status variables.
|
||
|
--echo
|
||
|
|
||
|
flush status;
|
||
|
|
||
|
SET @@max_statement_time=0;
|
||
|
SELECT CONVERT(VARIABLE_VALUE, UNSIGNED) INTO @time_exceeded
|
||
|
FROM INFORMATION_SCHEMA.GLOBAL_STATUS
|
||
|
WHERE VARIABLE_NAME = 'max_statement_time_exceeded';
|
||
|
|
||
|
SET @@max_statement_time=0.5;
|
||
|
SELECT SLEEP(2);
|
||
|
SHOW STATUS LIKE '%timeout%';
|
||
|
SET @@max_statement_time=0;
|
||
|
|
||
|
--echo # Ensure that the counters for:
|
||
|
--echo # - statements that exceeded their maximum execution time
|
||
|
--echo # are incremented.
|
||
|
|
||
|
SELECT 1 AS STATUS FROM INFORMATION_SCHEMA.GLOBAL_STATUS
|
||
|
WHERE VARIABLE_NAME = 'max_statement_time_exceeded'
|
||
|
AND CONVERT(VARIABLE_VALUE, UNSIGNED) > @time_exceeded;
|
||
|
|
||
|
--echo
|
||
|
--echo # Check that the appropriate error status is set.
|
||
|
--echo
|
||
|
|
||
|
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
||
|
INSERT INTO t1 VALUES (1);
|
||
|
|
||
|
START TRANSACTION;
|
||
|
SELECT * FROM t1 FOR UPDATE;
|
||
|
|
||
|
connect (con1,localhost,root,,test,,);
|
||
|
SET @@SESSION.max_statement_time = 0.5;
|
||
|
--error ER_STATEMENT_TIMEOUT
|
||
|
UPDATE t1 SET a = 2;
|
||
|
SHOW WARNINGS;
|
||
|
disconnect con1;
|
||
|
|
||
|
connection default;
|
||
|
ROLLBACK;
|
||
|
DROP TABLE t1;
|
||
|
|
||
|
--echo
|
||
|
--echo # Test interaction with lock waits.
|
||
|
--echo
|
||
|
|
||
|
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
||
|
INSERT INTO t1 VALUES (1);
|
||
|
|
||
|
connect (con1,localhost,root,,test,,);
|
||
|
SET @@SESSION.max_statement_time= 0.5;
|
||
|
|
||
|
connection default;
|
||
|
LOCK TABLES t1 WRITE;
|
||
|
|
||
|
connection con1;
|
||
|
SELECT @@SESSION.max_statement_time;
|
||
|
--error ER_STATEMENT_TIMEOUT
|
||
|
LOCK TABLES t1 READ;
|
||
|
|
||
|
connection default;
|
||
|
UNLOCK TABLES;
|
||
|
BEGIN;
|
||
|
SELECT * FROM t1;
|
||
|
|
||
|
connection con1;
|
||
|
--error ER_STATEMENT_TIMEOUT
|
||
|
ALTER TABLE t1 ADD COLUMN b INT;
|
||
|
|
||
|
connection default;
|
||
|
ROLLBACK;
|
||
|
SELECT GET_LOCK('lock', 1);
|
||
|
|
||
|
connection con1;
|
||
|
SELECT GET_LOCK('lock', 1);
|
||
|
|
||
|
disconnect con1;
|
||
|
connection default;
|
||
|
SELECT RELEASE_LOCK('lock');
|
||
|
DROP TABLE t1;
|