145 lines
4.1 KiB
Plaintext
145 lines
4.1 KiB
Plaintext
# WL#6599 - Testing IS queries in LOCK TABLES.
|
|
# The details about why we have special focus about LOCK TABLE
|
|
# and IS queries can be found in commit message.
|
|
|
|
# Note that we are going to hide DD tables from users
|
|
# so that we avoid direct use of DD tables in user queries.
|
|
# So the below test do not include such cases.
|
|
|
|
CREATE TABLE t1 (f1 int);
|
|
INSERT INTO t1 VALUES (1);
|
|
CREATE TABLE t2 AS SELECT * FROM t1;
|
|
CREATE TABLE t3 AS SELECT * FROM t1;
|
|
CREATE VIEW v1 AS SELECT * FROM t3;
|
|
|
|
|
|
--echo Case 1: IS query under 'FLUSH TABLES' command.
|
|
|
|
FLUSH TABLES WITH READ LOCK;
|
|
SELECT COUNT(*) FROM information_schema.columns
|
|
WHERE table_name='db';
|
|
UNLOCK TABLES;
|
|
|
|
|
|
--echo Case 2: Simple IS query under 'LOCK TABLE' command.
|
|
|
|
LOCK TABLE t1 READ, v1 READ;
|
|
SELECT COUNT(*) FROM t1;
|
|
SELECT COUNT(*) FROM v1;
|
|
|
|
--echo Test that IS view will be opened without explicit LOCK TABLE on them.
|
|
SELECT COUNT(*) FROM information_schema.columns WHERE table_name='db';
|
|
|
|
--echo Test that join between two IS views work fine in LOCK TABLE mode.
|
|
SELECT COUNT(*) FROM information_schema.tables m
|
|
JOIN information_schema.columns n
|
|
ON m.table_name = n.table_name
|
|
WHERE m.table_name='db';
|
|
|
|
--echo Test that IS view will be opened along with other locked tables.
|
|
SELECT COUNT(*) FROM information_schema.columns, t1
|
|
WHERE table_name='db';
|
|
SELECT COUNT(*) FROM information_schema.columns, v1
|
|
WHERE table_name='db';
|
|
|
|
--echo Test that we fail when tring to use user table that is not locked
|
|
--echo along with IS view.
|
|
--error ER_TABLE_NOT_LOCKED
|
|
SELECT COUNT(*) FROM information_schema.columns, t2
|
|
WHERE table_name='db';
|
|
|
|
UNLOCK TABLES;
|
|
|
|
|
|
--echo Case 3: IS query inside SP + SF + LOCK TABLE combination.
|
|
|
|
DELIMITER $;
|
|
CREATE FUNCTION func1()
|
|
RETURNS INT DETERMINISTIC
|
|
BEGIN
|
|
DECLARE a int;
|
|
SELECT COUNT(*) INTO a
|
|
FROM information_schema.columns
|
|
WHERE table_name='db';
|
|
RETURN a;
|
|
END $
|
|
|
|
CREATE PROCEDURE proc1()
|
|
BEGIN
|
|
DECLARE i INT;
|
|
SELECT (func1() + COUNT(*)) INTO i
|
|
FROM information_schema.tables m
|
|
JOIN information_schema.columns n
|
|
ON m.table_name = n.table_name
|
|
WHERE m.table_name='db';
|
|
INSERT INTO t1 VALUES (i);
|
|
END $
|
|
DELIMITER ;$
|
|
|
|
--echo Testing IS view inside SP + SF, not in LOCK TABLE.
|
|
CALL proc1();
|
|
SELECT * FROM t1;
|
|
|
|
--echo Enter LOCK TABLE mode.
|
|
LOCK TABLE t1 WRITE, t1 as X READ, t3 READ;
|
|
|
|
--echo Testing IS view inside SF.
|
|
SELECT func1() as COUNT_FROM_SP FROM t3;
|
|
|
|
--echo Testing IS view in outer query and also inside a SF.
|
|
SELECT func1() as COUNT_FROM_SP, COUNT(*) FROM information_schema.tables m
|
|
JOIN information_schema.columns n
|
|
ON m.table_name = n.table_name
|
|
WHERE m.table_name='db';
|
|
|
|
--echo Testing IS view inside SP + SF, in LOCK TABLE mode.
|
|
CALL proc1();
|
|
SELECT * FROM t1 as X;
|
|
|
|
UNLOCK TABLES;
|
|
|
|
--echo Case 3: IS query inside SP + Trigger + LOCK TABLE combination.
|
|
|
|
CREATE TRIGGER trig1 AFTER INSERT ON t1 FOR EACH ROW
|
|
INSERT INTO t2 SELECT COUNT(*)>1 FROM information_schema.columns;
|
|
|
|
--echo Invoking trigger with IS not in LOCK TABLE mode.
|
|
INSERT INTO t1 VALUES(1);
|
|
SELECT * FROM t2;
|
|
|
|
LOCK TABLE t1 WRITE, t2 WRITE;
|
|
|
|
--echo Invoking trigger with IS in LOCK TABLE mode.
|
|
INSERT INTO t1 VALUES(1);
|
|
SELECT * FROM t2;
|
|
|
|
UNLOCK TABLES;
|
|
|
|
#comment by xengine
|
|
#--echo Case 4: IS query under SERIALIZABLE ISOLATION + AUTO_COMMIT OFF
|
|
#--echo + LOCK TABLE + I_S query + DROP TABLE.
|
|
#--echo
|
|
#--echo DROP TABLE should success. If I_S query doesn't do non-locking read,
|
|
#--echo then the DROP TABLE would block, waiting for innodb lock to be release
|
|
#--echo until transaction is committed.
|
|
#SET TRANSACTION_ISOLATION='SERIALIZABLE';
|
|
#SET AUTOCOMMIT=0;
|
|
#LOCK TABLES t1 READ;
|
|
#SELECT COUNT(*) > 0 FROM information_schema.tables;
|
|
#connect (con1, localhost, root,,);
|
|
DROP TABLE t2;
|
|
#connection default;
|
|
#UNLOCK TABLES;
|
|
#disconnect con1;
|
|
#SET TRANSACTION_ISOLATION=default;
|
|
#SET AUTOCOMMIT=default;
|
|
|
|
# Cleanup
|
|
DROP TABLE t1, t3;
|
|
DROP VIEW v1;
|
|
DROP FUNCTION func1;
|
|
DROP PROCEDURE proc1;
|
|
|
|
|
|
--source suite/xengine/include/check_xengine_log_error.inc
|