File: is_lock_table.test

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (141 lines) | stat: -rw-r--r-- 4,065 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# 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;

--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;