MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
partition_exchange.inc
1 # Include file to test PARTITION EXCHANGE usable with different engines
2 # Written by Mattias.Jonsson@Sun.Com
3 
4 --echo # Test with AUTO_INCREMENT
5 eval CREATE TABLE tp
6 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
7  b varchar(24))
8 ENGINE = $engine
9 PARTITION BY HASH (a) PARTITIONS 4;
10 CREATE TABLE t LIKE tp;
11 ALTER TABLE t REMOVE PARTITIONING;
12 SHOW CREATE TABLE tp;
13 SHOW CREATE TABLE t;
14 INSERT INTO tp (b) VALUES ("One"), ("Two"), ("Three"), ("Four"), ("Five"),
15 ("Six"), ("Seven"), ("Eight"), ("Nine"), ("Ten"), ("Eleven"), ("Twelwe");
16 if ($no_update)
17 {
18 # Archive handles auto inc by only allowing increasing values,
19 # so this must be inserted before a higher value is inserted.
20 INSERT INTO tp VALUES (41, "One hundred one");
21 }
22 INSERT INTO tp VALUES (97, "Ninety seven");
23 if (!$no_delete)
24 {
25 INSERT INTO tp VALUES (111, "One hundred eleven");
26 }
27 if (!$no_update)
28 {
29 INSERT INTO tp VALUES (101, "One hundred one");
30 }
31 SET INSERT_ID = 13;
32 INSERT INTO t (b) VALUES ("Thirteen");
33 if ($no_update)
34 {
35 SET INSERT_ID = 17;
36 INSERT INTO t (b) VALUES ("Twenty five");
37 }
38 SET INSERT_ID = 21;
39 INSERT INTO t (b) VALUES ("Twenty one");
40 if (!$no_update)
41 {
42 SET INSERT_ID = 25;
43 INSERT INTO t (b) VALUES ("Twenty five");
44 }
45 if (!$no_delete)
46 {
47 SET INSERT_ID = 55;
48 INSERT INTO t (b) VALUES ("Fifty five");
49 DELETE FROM tp WHERE a = 111;
50 DELETE FROM t WHERE a = 55;
51 }
52 if (!$no_update)
53 {
54 UPDATE tp SET a = 41 WHERE a = 101;
55 UPDATE t SET a = 17 WHERE a = 25;
56 }
57 -- disable_query_log
58 -- disable_result_log
59 ANALYZE TABLE tp;
60 -- enable_result_log
61 -- enable_query_log
62 SELECT PARTITION_NAME, IF(TABLE_ROWS, 'YES', 'NO') AS HAVE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA ='test' AND TABLE_NAME = 'tp';
63 SELECT IF(TABLE_ROWS, 'YES', 'NO') AS HAVE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA ='test' AND TABLE_NAME = 't';
64 ALTER TABLE tp EXCHANGE PARTITION p1 WITH TABLE t;
65 -- disable_query_log
66 -- disable_result_log
67 ANALYZE TABLE tp;
68 -- enable_result_log
69 -- enable_query_log
70 SELECT PARTITION_NAME, IF(TABLE_ROWS, 'YES', 'NO') AS HAVE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA ='test' AND TABLE_NAME = 'tp';
71 SELECT IF(TABLE_ROWS, 'YES', 'NO') AS HAVE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA ='test' AND TABLE_NAME = 't';
72 SELECT * FROM tp ORDER BY a;
73 SELECT * FROM t ORDER BY a;
74 SHOW CREATE TABLE tp;
75 SHOW CREATE TABLE t;
76 DROP TABLE tp, t;
77 
78 # set a DEBUG_SYNC after open table and before verifying is done
79 # Test that one can read from the table but not write, test that one can both
80 # read and write to the partition
81 # Verify that one must close the other instances of the table before the rename
82 # takes place (i.e. no need for LOCK_open)
83 # Test that it is not possible to drop, create, truncate either the tables or
84 # partition
85 # Test that it waits for ongoing transactions
86 
87 if ($no_keys)
88 {
89 eval CREATE TABLE t
90 (a INT,
91  b VARCHAR(55))
92 ENGINE = $engine;
93 eval CREATE TABLE tp
94 (a INT,
95  b VARCHAR(55))
96 ENGINE = $engine
97 PARTITION BY RANGE (a)
98 (PARTITION p0 VALUES LESS THAN (100),
99  PARTITION p1 VALUES LESS THAN MAXVALUE);
100 eval CREATE TABLE tsp
101 (a INT,
102  b VARCHAR(55))
103 ENGINE = $engine
104 PARTITION BY RANGE (a)
105 SUBPARTITION BY HASH(a)
106 (PARTITION p0 VALUES LESS THAN (100)
107  (SUBPARTITION sp0,
108  SUBPARTITION sp1),
109  PARTITION p1 VALUES LESS THAN MAXVALUE
110  (SUBPARTITION sp2,
111  SUBPARTITION sp3));
112 }
113 if (!$no_keys)
114 {
115 eval CREATE TABLE t
116 (a INT,
117  b VARCHAR(55),
118  PRIMARY KEY (a))
119 ENGINE = $engine;
120 eval CREATE TABLE tp
121 (a INT,
122  b VARCHAR(55),
123  PRIMARY KEY (a))
124 ENGINE = $engine
125 PARTITION BY RANGE (a)
126 (PARTITION p0 VALUES LESS THAN (100),
127  PARTITION p1 VALUES LESS THAN MAXVALUE);
128 eval CREATE TABLE tsp
129 (a INT,
130  b VARCHAR(55),
131  PRIMARY KEY (a))
132 ENGINE = $engine
133 PARTITION BY RANGE (a)
134 SUBPARTITION BY HASH(a)
135 (PARTITION p0 VALUES LESS THAN (100)
136  (SUBPARTITION sp0,
137  SUBPARTITION sp1),
138  PARTITION p1 VALUES LESS THAN MAXVALUE
139  (SUBPARTITION sp2,
140  SUBPARTITION sp3));
141 }
142 
143 INSERT INTO t VALUES (1, "First value"), (3, "Three"), (5, "Five"), (99, "End of values");
144 INSERT INTO tp VALUES (2, "First value"), (10, "Ten"), (50, "Fifty"), (200, "Two hundred, end of values"), (61, "Sixty one"), (62, "Sixty two"), (63, "Sixty three"), (64, "Sixty four"), (161, "161"), (162, "162"), (163, "163"), (164, "164");
145 INSERT INTO tsp VALUES (2, "First value"), (10, "Ten"), (50, "Fifty"), (200, "Two hundred, end of values"), (61, "Sixty one"), (62, "Sixty two"), (63, "Sixty three"), (64, "Sixty four"), (161, "161"), (162, "162"), (163, "163"), (164, "164");
146 --sorted_result
147 SELECT * FROM t;
148 --sorted_result
149 SELECT * FROM tp;
150 
151 --echo # Start by testing read/write locking
152 SET AUTOCOMMIT = 1;
153 
154 connect(con1, localhost, root,,);
155 --echo # con1
156 SET DEBUG_SYNC= 'swap_partition_after_compare_tables SIGNAL swap_in_progress WAIT_FOR goto_verification';
157 SET DEBUG_SYNC= 'swap_partition_first_row_read SIGNAL swap_in_progress WAIT_FOR goto_wait';
158 SET DEBUG_SYNC= 'swap_partition_after_wait SIGNAL swap_in_progress WAIT_FOR goto_rename';
159 SET DEBUG_SYNC= 'swap_partition_before_rename SIGNAL swap_in_progress WAIT_FOR test_done';
160 send ALTER TABLE tp EXCHANGE PARTITION p0 WITH TABLE t;
161 
162 connection default;
163 --echo # con default
164 SET DEBUG_SYNC= 'now WAIT_FOR swap_in_progress';
165 --echo # select from t and select/update/delete/insert from tp should work
166 SELECT * FROM t WHERE a = 99;
167 SELECT * FROM tp WHERE a = 61;
168 --echo # any write (update/delete/insert) into t or tp should fail
169 SET SESSION lock_wait_timeout=1;
170 if (!$no_update)
171 {
172 --error ER_LOCK_WAIT_TIMEOUT
173 UPDATE tp SET a = 53, b = concat("Fifty three, was ", b) WHERE a = 63;
174 }
175 --error ER_LOCK_WAIT_TIMEOUT
176 INSERT INTO tp VALUES (63, "Sixty three, new"), (59, "To be deleted");
177 if (!$no_delete)
178 {
179 --error ER_LOCK_WAIT_TIMEOUT
180 DELETE FROM tp WHERE a = 59;
181 }
182 if (!$no_update)
183 {
184 --error ER_LOCK_WAIT_TIMEOUT
185 UPDATE t SET a = 53, b = "Fifty three, was three" WHERE a = 3;
186 }
187 --error ER_LOCK_WAIT_TIMEOUT
188 INSERT INTO t VALUES (63, "Sixty three, new"), (59, "To be deleted");
189 if (!$no_delete)
190 {
191 --error ER_LOCK_WAIT_TIMEOUT
192 DELETE FROM t WHERE a = 3;
193 }
194 --error ER_LOCK_WAIT_TIMEOUT
195 eval ALTER TABLE t ENGINE = $engine;
196 --error ER_LOCK_WAIT_TIMEOUT
197 eval ALTER TABLE tp ENGINE = $engine;
198 SHOW CREATE TABLE t;
199 SHOW CREATE TABLE tp;
200 SET DEBUG_SYNC= 'now SIGNAL goto_verification';
201 SET DEBUG_SYNC= 'now WAIT_FOR swap_in_progress';
202 --echo # select from t and select/update/delete/insert from tp should work
203 SELECT * FROM t WHERE a = 99;
204 SELECT * FROM tp WHERE a = 61;
205 if (!$no_update)
206 {
207 --error ER_LOCK_WAIT_TIMEOUT
208 UPDATE tp SET a = 43, b = concat("Fifty three, was ", b) WHERE a = 63;
209 }
210 --error ER_LOCK_WAIT_TIMEOUT
211 INSERT INTO tp VALUES (63, "Sixty three, new 2"), (59, "To be deleted");
212 if (!$no_delete)
213 {
214 --error ER_LOCK_WAIT_TIMEOUT
215 DELETE FROM tp WHERE a = 59;
216 }
217 --echo # any write (update/delete/insert) into t should fail
218 if (!$no_update)
219 {
220 --error ER_LOCK_WAIT_TIMEOUT
221 UPDATE t SET a = 53, b = "Fifty three, was three" WHERE a = 3;
222 }
223 --error ER_LOCK_WAIT_TIMEOUT
224 INSERT INTO t VALUES (63, "Sixty three, new"), (59, "To be deleted");
225 if (!$no_delete)
226 {
227 --error ER_LOCK_WAIT_TIMEOUT
228 DELETE FROM t WHERE a = 3;
229 }
230 --error ER_LOCK_WAIT_TIMEOUT
231 eval ALTER TABLE t ENGINE = $engine;
232 --error ER_LOCK_WAIT_TIMEOUT
233 eval ALTER TABLE tp ENGINE = $engine;
234 SHOW CREATE TABLE t;
235 SHOW CREATE TABLE tp;
236 SET DEBUG_SYNC= 'now SIGNAL goto_wait';
237 SET DEBUG_SYNC= 'now WAIT_FOR swap_in_progress';
238 --echo # Both tables should now be under exclusive lock, even SHOW should fail
239 --error ER_LOCK_WAIT_TIMEOUT
240 SELECT * FROM t WHERE a = 99;
241 --error ER_LOCK_WAIT_TIMEOUT
242 SELECT * FROM tp WHERE a = 61;
243 if (!$no_update)
244 {
245 --error ER_LOCK_WAIT_TIMEOUT
246 UPDATE tp SET a = 53, b = concat("Fifty three, was ", b) WHERE a = 63;
247 }
248 --error ER_LOCK_WAIT_TIMEOUT
249 INSERT INTO tp VALUES (63, "Sixty three, new 2"), (59, "To be deleted");
250 if (!$no_delete)
251 {
252 --error ER_LOCK_WAIT_TIMEOUT
253 DELETE FROM tp WHERE a = 59;
254 }
255 if (!$no_update)
256 {
257 --error ER_LOCK_WAIT_TIMEOUT
258 UPDATE t SET a = 53, b = "Fifty three, was three" WHERE a = 3;
259 }
260 --error ER_LOCK_WAIT_TIMEOUT
261 INSERT INTO t VALUES (63, "Sixty three, new"), (59, "To be deleted");
262 if (!$no_delete)
263 {
264 --error ER_LOCK_WAIT_TIMEOUT
265 DELETE FROM t WHERE a = 3;
266 }
267 --error ER_LOCK_WAIT_TIMEOUT
268 SHOW CREATE TABLE t;
269 --error ER_LOCK_WAIT_TIMEOUT
270 SHOW CREATE TABLE tp;
271 --error ER_LOCK_WAIT_TIMEOUT
272 eval ALTER TABLE t ENGINE = $engine;
273 --error ER_LOCK_WAIT_TIMEOUT
274 eval ALTER TABLE tp ENGINE = $engine;
275 SET DEBUG_SYNC= 'now SIGNAL goto_rename';
276 SET DEBUG_SYNC= 'now WAIT_FOR swap_in_progress';
277 --echo # Both tables should now be under exclusive lock
278 --error ER_LOCK_WAIT_TIMEOUT
279 SELECT * FROM t WHERE a = 99;
280 --error ER_LOCK_WAIT_TIMEOUT
281 SELECT * FROM tp WHERE a = 61;
282 if (!$no_update)
283 {
284 --error ER_LOCK_WAIT_TIMEOUT
285 UPDATE tp SET a = 53, b = concat("Fifty three, was ", b) WHERE a = 63;
286 }
287 --error ER_LOCK_WAIT_TIMEOUT
288 INSERT INTO tp VALUES (63, "Sixty three, new 2"), (59, "To be deleted");
289 if (!$no_delete)
290 {
291 --error ER_LOCK_WAIT_TIMEOUT
292 DELETE FROM tp WHERE a = 59;
293 }
294 if (!$no_update)
295 {
296 --error ER_LOCK_WAIT_TIMEOUT
297 UPDATE t SET a = 53, b = "Fifty three, was three" WHERE a = 3;
298 }
299 --error ER_LOCK_WAIT_TIMEOUT
300 INSERT INTO t VALUES (63, "Sixty three, new"), (59, "To be deleted");
301 if (!$no_delete)
302 {
303 --error ER_LOCK_WAIT_TIMEOUT
304 DELETE FROM t WHERE a = 3;
305 }
306 --error ER_LOCK_WAIT_TIMEOUT
307 eval ALTER TABLE t ENGINE = $engine;
308 --error ER_LOCK_WAIT_TIMEOUT
309 eval ALTER TABLE tp ENGINE = $engine;
310 --error ER_LOCK_WAIT_TIMEOUT
311 SHOW CREATE TABLE t;
312 --error ER_LOCK_WAIT_TIMEOUT
313 SHOW CREATE TABLE tp;
314 
315 SET DEBUG_SYNC= 'now SIGNAL test_done';
316 
317 connection con1;
318 --echo # con1
319 --reap
320 connection default;
321 --echo # con default
322 --echo # Tables should now be as normal
323 SHOW CREATE TABLE t;
324 SHOW CREATE TABLE tp;
325 SELECT * FROM tp WHERE a = 99;
326 SELECT * FROM t WHERE a = 61;
327 if (!$no_update)
328 {
329 UPDATE t SET a = 53, b = "Fifty three, was sixty three" WHERE a = 63;
330 }
331 INSERT INTO t VALUES (63, "Sixty three, new"), (59, "To be deleted");
332 if (!$no_delete)
333 {
334 DELETE FROM t WHERE a = 59;
335 }
336 if (!$no_update)
337 {
338 UPDATE tp SET a = 53, b = "Fifty three, was three" WHERE a = 3;
339 }
340 INSERT INTO tp VALUES (63, "Sixty three, new"), (59, "To be deleted");
341 if (!$no_delete)
342 {
343 DELETE FROM tp WHERE a = 3;
344 }
345 eval ALTER TABLE t ENGINE = $engine;
346 eval ALTER TABLE tp ENGINE = $engine;
347 
348 disconnect con1;
349 connection default;
350 --echo # con default
351 SET DEBUG_SYNC= 'RESET';
352 SHOW CREATE TABLE t;
353 SHOW CREATE TABLE tp;
354 --sorted_result
355 SELECT * FROM t;
356 --sorted_result
357 SELECT * FROM tp;
358 
359 DROP TABLE t, tp, tsp;
360 
361