-
Notifications
You must be signed in to change notification settings - Fork 4k
/
Copy pathalter_table-big.test
384 lines (348 loc) · 11.8 KB
/
alter_table-big.test
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
#
# Tests for various concurrency-related aspects of ALTER TABLE implemetation
#
# This test takes rather long time so let us run it only in --big-test mode
--source include/big_test.inc
# We are using some debug-only features in this test
--source include/have_debug.inc
# Also we are using SBR to check that statements are executed
# in proper order.
--source include/force_binlog_format_statement.inc
--source include/count_sessions.inc
#
# Additional coverage for the main ALTER TABLE case
#
# We should be sure that table being altered is properly
# locked during statement execution and in particular that
# no DDL or DML statement can sneak in and get access to
# the table when real operation has already taken place
# but this fact has not been noted in binary log yet.
--disable_warnings
drop table if exists t1, t2, t3;
--enable_warnings
connect (addconroot, localhost, root,,);
connect (addconroot2, localhost, root,,);
connection default;
create table t1 (i int);
# We are going to check that statements are logged in correct order
reset master;
set debug_sync='alter_table_before_main_binlog SIGNAL parked WAIT_FOR go';
--send alter table t1 change i c char(10) default 'Test1';
connection addconroot;
# Wait until ALTER TABLE acquires metadata lock.
set debug_sync='now WAIT_FOR parked';
--send insert into t1 values ();
connection addconroot2;
# Wait until the above INSERT INTO t1 is blocked due to ALTER
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Waiting for table metadata lock" and
info = "insert into t1 values ()";
--source include/wait_condition.inc
# Resume ALTER execution.
set debug_sync='now SIGNAL go';
connection default;
--reap
connection addconroot;
--reap
connection default;
select * from t1;
set debug_sync='alter_table_before_main_binlog SIGNAL parked WAIT_FOR go';
--send alter table t1 change c vc varchar(100) default 'Test2';
connection addconroot;
# Wait until ALTER TABLE acquires metadata lock.
set debug_sync='now WAIT_FOR parked';
--send rename table t1 to t2;
connection addconroot2;
# Wait until the above RENAME TABLE is blocked due to ALTER
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Waiting for table metadata lock" and
info = "rename table t1 to t2";
--source include/wait_condition.inc
# Resume ALTER execution.
set debug_sync='now SIGNAL go';
connection default;
--reap
connection addconroot;
--reap
connection default;
drop table t2;
# And now tests for ALTER TABLE with RENAME clause. In this
# case target table name should be properly locked as well.
create table t1 (i int);
set debug_sync='alter_table_before_main_binlog SIGNAL parked WAIT_FOR go';
--send alter table t1 change i c char(10) default 'Test3', rename to t2;
connection addconroot;
# Wait until ALTER TABLE acquires metadata lock.
set debug_sync='now WAIT_FOR parked';
--send insert into t2 values();
connection addconroot2;
# Wait until the above INSERT INTO t2 is blocked due to ALTER
let $wait_condition=
select count(*) = 1 from information_schema.processlist
where state = "Waiting for table metadata lock" and
info = "insert into t2 values()";
--source include/wait_condition.inc
# Resume ALTER execution.
set debug_sync='now SIGNAL go';
connection default;
--reap
connection addconroot;
--reap
connection default;
select * from t2;
--send alter table t2 change c vc varchar(100) default 'Test2', rename to t1;
connection addconroot;
connection default;
--reap
rename table t1 to t3;
disconnect addconroot;
disconnect addconroot2;
drop table t3;
set debug_sync='alter_table_before_main_binlog SIGNAL parked WAIT_FOR go';
set debug_sync='RESET';
# Check that all statements were logged in correct order
source include/show_binlog_events.inc;
--echo End of 5.1 tests
--source include/restore_default_binlog_format.inc
--echo #
--echo # Additional coverage for WL#7743 "New data dictionary: changes
--echo # to DDL-related parts of SE API".
--echo #
--echo # Killed ALTER TABLE on temporary table sometimes led to assertion
--echo # failure on connection close.
--enable_connect_log
--connect (con1, localhost, root,,)
create temporary table t1 (i int) engine=innodb;
set debug= "+d,mysql_lock_tables_kill_query";
--error ER_QUERY_INTERRUPTED
alter table t1 add index (i);
set debug= "-d,mysql_lock_tables_kill_query";
--echo # The below disconnect should drop temporary table automagically.
--disconnect con1
--source include/wait_until_disconnected.inc
connection default;
--disable_connect_log
--echo #
--echo # Test coverage for new (since 8.0) behavior of ALTER TABLE RENAME
--echo # under LOCK TABLES.
--echo #
--enable_connect_log
connect (con1, localhost, root,,);
SET @old_lock_wait_timeout= @@lock_wait_timeout;
connection default;
--echo #
--echo # 1) Simple ALTER TABLE RENAME.
--echo #
--echo # 1.1) Successfull ALTER TABLE RENAME.
--echo #
CREATE TABLE t1 (i INT);
LOCK TABLES t1 WRITE;
ALTER TABLE t1 RENAME TO t2;
--echo # Table is available under new name under LOCK TABLES.
SELECT * FROM t2;
connection con1;
--echo # Access by new name from other connections should be blocked.
SET @@lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t2;
SET @@lock_wait_timeout= @old_lock_wait_timeout;
--echo # But not for old table name.
--error ER_NO_SUCH_TABLE
SELECT * FROM t1;
connection default;
UNLOCK TABLES;
--echo #
--echo # 1.2) ALTER TABLE RENAME in case when several tables are locked.
--echo #
CREATE TABLE t1 (i INT);
LOCK TABLES t1 READ, t2 WRITE;
ALTER TABLE t2 RENAME TO t3;
--echo # Table t1 should be still locked, and t2 should be available as t3
--echo # with correct lock type.
SELECT * FROM t1;
INSERT INTO t3 values (1);
UNLOCK TABLES;
--echo #
--echo # 1.3) ALTER TABLE RENAME in case when same table locked more than once.
--echo #
LOCK TABLES t1 READ, t3 WRITE, t3 AS a WRITE, t3 AS b READ;
ALTER TABLE t3 RENAME TO t4;
--echo # Check that tables are locked under correct aliases and with modes.
SELECT * FROM t4 AS a, t4 AS b;
INSERT INTO t4 VALUES (2);
DELETE a FROM t4 AS a, t4 AS b;
--error ER_TABLE_NOT_LOCKED_FOR_WRITE
DELETE b FROM t4 AS a, t4 AS b;
UNLOCK TABLES;
DROP TABLES t1, t4;
--echo # 1.4) ALTER TABLE RENAME to different schema.
--echo #
CREATE TABLE t1 (i INT);
CREATE DATABASE mysqltest;
LOCK TABLES t1 WRITE;
ALTER TABLE t1 RENAME TO mysqltest.t1;
--echo # Table is available in new schema under LOCK TABLES.
SELECT * FROM mysqltest.t1;
connection con1;
--echo # Access by new name from other connections should be blocked.
SET @@lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM mysqltest.t1;
SET @@lock_wait_timeout= @old_lock_wait_timeout;
--echo # But not to old schema and table name.
--error ER_NO_SUCH_TABLE
SELECT * FROM t1;
--echo # Also IX lock on new schema should be kept.
SET @@lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
ALTER DATABASE mysqltest CHARACTER SET latin1;
SET @@lock_wait_timeout= @old_lock_wait_timeout;
connection default;
UNLOCK TABLES;
DROP DATABASE mysqltest;
--echo #
--echo # 2) ALTER TABLE INPLACE with RENAME clause.
--echo #
--echo # 2.1) Successful ALTER TABLE INPLACE with RENAME clause.
--echo #
CREATE TABLE t1 (i INT);
LOCK TABLES t1 WRITE;
ALTER TABLE t1 ADD COLUMN j INT, RENAME TO t2, ALGORITHM=INPLACE;
--echo # Table is available under new name under LOCK TABLES.
SELECT * FROM t2;
connection con1;
--echo # Access by new name from other connections should be blocked.
SET @@lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t2;
SET @@lock_wait_timeout= @old_lock_wait_timeout;
--echo # But not for old table name.
--error ER_NO_SUCH_TABLE
SELECT * FROM t1;
connection default;
UNLOCK TABLES;
--echo #
--echo # 2.2) ALTER TABLE INPLACE with RENAME clause in case when several
--echo # tables are locked.
--echo #
CREATE TABLE t1 (i INT);
LOCK TABLES t1 READ, t2 WRITE;
ALTER TABLE t2 ADD COLUMN k INT, RENAME TO t3, ALGORITHM=INPLACE;
--echo # Table t1 should be still locked, and t2 should be available as t3
--echo # with correct lock type.
SELECT * FROM t1;
INSERT INTO t3 values (1, 2, 3);
UNLOCK TABLES;
--echo #
--echo # 2.3) ALTER TABLE INPLACE with RENAME clause in case when same table
--echo # locked more than once.
--echo #
LOCK TABLES t1 READ, t3 WRITE, t3 AS a WRITE, t3 AS b READ;
ALTER TABLE t3 ADD COLUMN l INT, RENAME TO t4, ALGORITHM=INPLACE;
--echo # Check that tables are locked under correct aliases and with modes.
SELECT * FROM t4 AS a, t4 AS b;
INSERT INTO t4 VALUES (2, 3, 4, 5);
DELETE a FROM t4 AS a, t4 AS b;
--error ER_TABLE_NOT_LOCKED_FOR_WRITE
DELETE b FROM t4 AS a, t4 AS b;
UNLOCK TABLES;
DROP TABLES t1, t4;
--echo # 2.4) ALTER TABLE INPLACE with RENAME clause to different schema.
--echo #
CREATE TABLE t1 (i INT);
CREATE DATABASE mysqltest;
LOCK TABLES t1 WRITE;
ALTER TABLE t1 ADD COLUMN k INT, RENAME TO mysqltest.t1, ALGORITHM=INPLACE;
--echo # Table is available in new schema under LOCK TABLES.
SELECT * FROM mysqltest.t1;
connection con1;
--echo # Access by new name from other connections should be blocked.
SET @@lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM mysqltest.t1;
SET @@lock_wait_timeout= @old_lock_wait_timeout;
--echo # But not to old schema and table name.
--error ER_NO_SUCH_TABLE
SELECT * FROM t1;
--echo # Also IX lock on new schema should be kept.
SET @@lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
ALTER DATABASE mysqltest CHARACTER SET latin1;
SET @@lock_wait_timeout= @old_lock_wait_timeout;
connection default;
UNLOCK TABLES;
DROP DATABASE mysqltest;
--echo #
--echo # 3) ALTER TABLE COPY with RENAME clause.
--echo #
--echo # 3.1) Successful ALTER TABLE COPY with RENAME clause.
--echo #
CREATE TABLE t1 (i INT);
LOCK TABLES t1 WRITE;
ALTER TABLE t1 ADD COLUMN j INT, RENAME TO t2, ALGORITHM=COPY;
--echo # Table is available under new name under LOCK TABLES.
SELECT * FROM t2;
connection con1;
--echo # Access by new name from other connections should be blocked.
SET @@lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t2;
SET @@lock_wait_timeout= @old_lock_wait_timeout;
--echo # But not for old table name.
--error ER_NO_SUCH_TABLE
SELECT * FROM t1;
connection default;
UNLOCK TABLES;
--echo #
--echo # 3.2) ALTER TABLE COPY with RENAME clause in case when several
--echo # tables are locked.
--echo #
CREATE TABLE t1 (i INT);
LOCK TABLES t1 READ, t2 WRITE;
ALTER TABLE t2 ADD COLUMN k INT, RENAME TO t3, ALGORITHM=COPY;
--echo # Table t1 should be still locked, and t2 should be available as t3
--echo # with correct lock type.
SELECT * FROM t1;
INSERT INTO t3 values (1, 2, 3);
UNLOCK TABLES;
--echo #
--echo # 3.3) ALTER TABLE COPY with RENAME clause in case when same table
--echo # locked more than once.
--echo #
LOCK TABLES t1 READ, t3 WRITE, t3 AS a WRITE, t3 AS b READ;
ALTER TABLE t3 ADD COLUMN l INT, RENAME TO t4, ALGORITHM=COPY;
--echo # Check that tables are locked under correct aliases and with modes.
SELECT * FROM t4 AS a, t4 AS b;
INSERT INTO t4 VALUES (2, 3, 4, 5);
DELETE a FROM t4 AS a, t4 AS b;
--error ER_TABLE_NOT_LOCKED_FOR_WRITE
DELETE b FROM t4 AS a, t4 AS b;
UNLOCK TABLES;
DROP TABLES t1, t4;
--echo # 3.4) ALTER TABLE COPY with RENAME clause to different schema.
--echo #
CREATE TABLE t1 (i INT);
CREATE DATABASE mysqltest;
LOCK TABLES t1 WRITE;
ALTER TABLE t1 ADD COLUMN k INT, RENAME TO mysqltest.t1, ALGORITHM=COPY;
--echo # Table is available in new schema under LOCK TABLES.
SELECT * FROM mysqltest.t1;
connection con1;
--echo # Access by new name from other connections should be blocked.
SET @@lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM mysqltest.t1;
SET @@lock_wait_timeout= @old_lock_wait_timeout;
--echo # But not to old schema and table name.
--error ER_NO_SUCH_TABLE
SELECT * FROM t1;
--echo # Also IX lock on new schema should be kept.
SET @@lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
ALTER DATABASE mysqltest CHARACTER SET latin1;
SET @@lock_wait_timeout= @old_lock_wait_timeout;
connection default;
UNLOCK TABLES;
DROP DATABASE mysqltest;