1
###################### t/debug_sync.test ###############################
3
# Testing of the Debug Sync Facility. #
5
# There is important documentation within sql/debug_sync.cc #
7
# Used objects in this test case: #
8
# p0 - synchronization point 0. Non-existent dummy sync point. #
13
# 2008-02-18 istruewing #
15
########################################################################
18
# We need the Debug Sync Facility.
20
--source include/have_debug_sync.inc
23
# We are checking privileges, which the embedded server cannot do.
25
--source include/not_embedded.inc
28
# Preparative cleanup.
31
SET DEBUG_SYNC= 'RESET';
32
DROP TABLE IF EXISTS t1;
36
# Show the special system variable.
37
# It shows ON or OFF depending on the command line option --debug-sync.
38
# The test case assumes it is ON (command line option present).
40
SHOW VARIABLES LIKE 'DEBUG_SYNC';
43
# Syntax. Valid forms.
45
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3';
46
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2';
47
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 HIT_LIMIT 3';
48
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6';
49
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 EXECUTE 2 HIT_LIMIT 3';
50
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 EXECUTE 2';
51
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 HIT_LIMIT 3';
52
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2';
53
SET DEBUG_SYNC='p0 SIGNAL s1 EXECUTE 2 HIT_LIMIT 3';
54
SET DEBUG_SYNC='p0 SIGNAL s1 EXECUTE 2';
55
SET DEBUG_SYNC='p0 SIGNAL s1 HIT_LIMIT 3';
56
SET DEBUG_SYNC='p0 SIGNAL s1';
57
SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3';
58
SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2';
59
SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 HIT_LIMIT 3';
60
SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6';
61
SET DEBUG_SYNC='p0 WAIT_FOR s2 EXECUTE 2 HIT_LIMIT 3';
62
SET DEBUG_SYNC='p0 WAIT_FOR s2 EXECUTE 2';
63
SET DEBUG_SYNC='p0 WAIT_FOR s2 HIT_LIMIT 3';
64
SET DEBUG_SYNC='p0 WAIT_FOR s2';
65
SET DEBUG_SYNC='p0 HIT_LIMIT 3';
66
SET DEBUG_SYNC='p0 CLEAR';
67
SET DEBUG_SYNC='p0 TEST';
68
SET DEBUG_SYNC='RESET';
71
# Syntax. Valid forms. Lower case.
73
set debug_sync='p0 signal s1 wait_for s2 timeout 6 execute 2 hit_limit 3';
74
set debug_sync='p0 signal s1 wait_for s2 timeout 6 execute 2';
75
set debug_sync='p0 signal s1 wait_for s2 timeout 6 hit_limit 3';
76
set debug_sync='p0 signal s1 wait_for s2 timeout 6';
77
set debug_sync='p0 signal s1 wait_for s2 execute 2 hit_limit 3';
78
set debug_sync='p0 signal s1 wait_for s2 execute 2';
79
set debug_sync='p0 signal s1 wait_for s2 hit_limit 3';
80
set debug_sync='p0 signal s1 wait_for s2';
81
set debug_sync='p0 signal s1 execute 2 hit_limit 3';
82
set debug_sync='p0 signal s1 execute 2';
83
set debug_sync='p0 signal s1 hit_limit 3';
84
set debug_sync='p0 signal s1';
85
set debug_sync='p0 wait_for s2 timeout 6 execute 2 hit_limit 3';
86
set debug_sync='p0 wait_for s2 timeout 6 execute 2';
87
set debug_sync='p0 wait_for s2 timeout 6 hit_limit 3';
88
set debug_sync='p0 wait_for s2 timeout 6';
89
set debug_sync='p0 wait_for s2 execute 2 hit_limit 3';
90
set debug_sync='p0 wait_for s2 execute 2';
91
set debug_sync='p0 wait_for s2 hit_limit 3';
92
set debug_sync='p0 wait_for s2';
93
set debug_sync='p0 hit_limit 3';
94
set debug_sync='p0 clear';
95
set debug_sync='p0 test';
96
set debug_sync='reset';
99
# Syntax. Valid forms. Line wrap, leading, mid, trailing space.
101
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6
102
EXECUTE 2 HIT_LIMIT 3';
103
SET DEBUG_SYNC=' p0 SIGNAL s1 WAIT_FOR s2';
104
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2';
105
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 ';
106
SET DEBUG_SYNC=' p0 SIGNAL s1 WAIT_FOR s2 ';
107
SET DEBUG_SYNC=' p0 SIGNAL s1 WAIT_FOR s2 ';
110
# Syntax. Invalid forms.
112
--error ER_PARSE_ERROR
114
--error ER_PARSE_ERROR
116
--error ER_PARSE_ERROR
118
--error ER_PARSE_ERROR
119
SET DEBUG_SYNC='p0 EXECUTE 2';
120
--error ER_PARSE_ERROR
121
SET DEBUG_SYNC='p0 TIMEOUT 6 EXECUTE 2';
122
--error ER_PARSE_ERROR
123
SET DEBUG_SYNC='p0 TIMEOUT 6';
124
--error ER_PARSE_ERROR
125
SET DEBUG_SYNC='p0 WAIT_FOR s2 SIGNAL s1';
126
--error ER_PARSE_ERROR
127
SET DEBUG_SYNC='p0 WAIT_FOR s2 SIGNAL s1 EXECUTE 2';
128
--error ER_PARSE_ERROR
129
SET DEBUG_SYNC='p0 WAIT_FOR s2 SIGNAL s1 TIMEOUT 6 EXECUTE 2';
130
--error ER_PARSE_ERROR
131
SET DEBUG_SYNC='p0 WAIT_FOR s2 SIGNAL s1 TIMEOUT 6';
132
--error ER_PARSE_ERROR
133
SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 SIGNAL s1 EXECUTE 2';
134
--error ER_PARSE_ERROR
135
SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 SIGNAL s1';
136
--error ER_PARSE_ERROR
137
SET DEBUG_SYNC='p0 TIMEOUT 6 WAIT_FOR s2 EXECUTE 2';
138
--error ER_PARSE_ERROR
139
SET DEBUG_SYNC='p0 TIMEOUT 6 WAIT_FOR s2';
140
--error ER_PARSE_ERROR
141
SET DEBUG_SYNC='p0 SIGNAL s1 TIMEOUT 6 EXECUTE 2';
142
--error ER_PARSE_ERROR
143
SET DEBUG_SYNC='p0 SIGNAL s1 TIMEOUT 6';
144
--error ER_PARSE_ERROR
145
SET DEBUG_SYNC='p0 EXECUTE 2 SIGNAL s1 TIMEOUT 6';
146
--error ER_PARSE_ERROR
147
SET DEBUG_SYNC='p0 TIMEOUT 6 SIGNAL s1';
148
--error ER_PARSE_ERROR
149
SET DEBUG_SYNC='p0 EXECUTE 2 TIMEOUT 6 SIGNAL s1';
150
--error ER_PARSE_ERROR
151
SET DEBUG_SYNC='p0 CLEAR HIT_LIMIT 3';
152
--error ER_PARSE_ERROR
153
SET DEBUG_SYNC='CLEAR';
154
--error ER_PARSE_ERROR
155
SET DEBUG_SYNC='p0 CLEAR p0';
156
--error ER_PARSE_ERROR
157
SET DEBUG_SYNC='TEST';
158
--error ER_PARSE_ERROR
159
SET DEBUG_SYNC='p0 TEST p0';
160
--error ER_PARSE_ERROR
161
SET DEBUG_SYNC='p0 RESET';
162
--error ER_PARSE_ERROR
163
SET DEBUG_SYNC='RESET p0';
164
--error ER_PARSE_ERROR
165
SET DEBUG_SYNC='p0 RESET p0';
166
--error ER_PARSE_ERROR
167
SET DEBUG_SYNC='p0 SIGNAL ';
168
--error ER_PARSE_ERROR
169
SET DEBUG_SYNC='p0 WAIT_FOR ';
170
--error ER_PARSE_ERROR
171
SET DEBUG_SYNC='p0 SIGNAL s1 EXECUTE ';
174
# Syntax. Invalid keywords used.
176
--error ER_UNKNOWN_SYSTEM_VARIABLE
177
SET DEBUG_SYNCx='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3';
178
--error ER_PARSE_ERROR
179
SET DEBUG_SYNC='p0 SIGNAx s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3';
180
--error ER_PARSE_ERROR
181
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOx s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3';
182
--error ER_PARSE_ERROR
183
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUx 0 EXECUTE 2 HIT_LIMIT 3';
184
--error ER_PARSE_ERROR
185
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTx 2 HIT_LIMIT 3';
186
--error ER_PARSE_ERROR
187
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIx 3';
188
--error ER_PARSE_ERROR
189
SET DEBUG_SYNC='p0 CLEARx';
190
--error ER_PARSE_ERROR
191
SET DEBUG_SYNC='p0 TESTx';
192
--error ER_PARSE_ERROR
193
SET DEBUG_SYNC='RESETx';
196
# Syntax. Invalid numbers. Decimal only.
198
--error ER_PARSE_ERROR
199
SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 0x6 EXECUTE 2 HIT_LIMIT 3';
200
--error ER_PARSE_ERROR
201
SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 EXECUTE 0x2 HIT_LIMIT 3';
202
--error ER_PARSE_ERROR
203
SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 7 EXECUTE 2 HIT_LIMIT 0x3';
206
# Syntax. Invalid value type.
208
--error ER_WRONG_TYPE_FOR_VAR
212
# Syntax. DEBUG_SYNC is a SESSION-only variable.
214
--error ER_LOCAL_VARIABLE
215
SET GLOBAL DEBUG_SYNC= 'p0 CLEAR';
218
# Syntax. The variable value does not need to be a string literal.
220
SET @myvar= 'now SIGNAL from_myvar';
221
SET DEBUG_SYNC= @myvar;
222
SHOW VARIABLES LIKE 'DEBUG_SYNC';
224
SET DEBUG_SYNC= LEFT('now SIGNAL from_function_cut_here', 24);
225
SHOW VARIABLES LIKE 'DEBUG_SYNC';
230
# NOTE: There is the special synchronization point 'now'. It is placed
231
# immediately after setting of the DEBUG_SYNC variable.
232
# So it is executed before the SET statement ends.
234
# NOTE: There is only one global signal (say "signal post" or "flag mast").
235
# A SIGNAL action writes its signal into it ("sets a flag").
236
# The signal persists until explicitly overwritten.
237
# To avoid confusion for later tests, it is recommended to clear
238
# the signal by signalling "empty" ("setting the 'empty' flag"):
239
# SET DEBUG_SYNC= 'now SIGNAL empty';
240
# Preferably you can reset the whole facility with:
241
# SET DEBUG_SYNC= 'RESET';
242
# The signal is then '' (really empty) which connot be done otherwise.
246
# Time out immediately. This gives just a warning.
248
SET DEBUG_SYNC= 'now SIGNAL something';
249
SHOW VARIABLES LIKE 'DEBUG_SYNC';
250
# Suppress warning number
251
--replace_column 2 ####
252
SET DEBUG_SYNC= 'now WAIT_FOR nothing TIMEOUT 0';
254
# If signal is present already, TIMEOUT 0 does not give a warning.
256
SET DEBUG_SYNC= 'now SIGNAL nothing';
257
SHOW VARIABLES LIKE 'DEBUG_SYNC';
258
SET DEBUG_SYNC= 'now WAIT_FOR nothing TIMEOUT 0';
261
# EXECUTE 0 is effectively a no-op.
263
SET DEBUG_SYNC= 'now SIGNAL something EXECUTE 0';
264
SHOW VARIABLES LIKE 'DEBUG_SYNC';
265
SET DEBUG_SYNC= 'now WAIT_FOR anotherthing TIMEOUT 0 EXECUTE 0';
268
# Run into HIT_LIMIT. This gives an error.
270
--error ER_DEBUG_SYNC_HIT_LIMIT
271
SET DEBUG_SYNC= 'now HIT_LIMIT 1';
274
# Many actions. Watch the array growing and shrinking in the debug trace:
275
# egrep 'query:|debug_sync_action:' mysql-test/var/log/master.trace
277
SET DEBUG_SYNC= 'RESET';
278
SHOW VARIABLES LIKE 'DEBUG_SYNC';
279
SET DEBUG_SYNC= 'p1abcd SIGNAL s1 EXECUTE 2';
280
SET DEBUG_SYNC= 'p2abc SIGNAL s2 EXECUTE 2';
281
SET DEBUG_SYNC= 'p9abcdef SIGNAL s9 EXECUTE 2';
282
SET DEBUG_SYNC= 'p4a SIGNAL s4 EXECUTE 2';
283
SET DEBUG_SYNC= 'p5abcde SIGNAL s5 EXECUTE 2';
284
SET DEBUG_SYNC= 'p6ab SIGNAL s6 EXECUTE 2';
285
SET DEBUG_SYNC= 'p7 SIGNAL s7 EXECUTE 2';
286
SET DEBUG_SYNC= 'p8abcdef SIGNAL s8 EXECUTE 2';
287
SET DEBUG_SYNC= 'p3abcdef SIGNAL s3 EXECUTE 2';
289
# Execute some actions to show they exist. Each sets a distinct signal.
291
SET DEBUG_SYNC= 'p4a TEST';
292
SHOW VARIABLES LIKE 'DEBUG_SYNC';
293
SET DEBUG_SYNC= 'p1abcd TEST';
294
SHOW VARIABLES LIKE 'DEBUG_SYNC';
295
SET DEBUG_SYNC= 'p7 TEST';
296
SHOW VARIABLES LIKE 'DEBUG_SYNC';
297
SET DEBUG_SYNC= 'p9abcdef TEST';
298
SHOW VARIABLES LIKE 'DEBUG_SYNC';
299
SET DEBUG_SYNC= 'p3abcdef TEST';
300
SHOW VARIABLES LIKE 'DEBUG_SYNC';
304
SET DEBUG_SYNC= 'p1abcd CLEAR';
305
SET DEBUG_SYNC= 'p2abc CLEAR';
306
SET DEBUG_SYNC= 'p5abcde CLEAR';
307
SET DEBUG_SYNC= 'p6ab CLEAR';
308
SET DEBUG_SYNC= 'p8abcdef CLEAR';
309
SET DEBUG_SYNC= 'p9abcdef CLEAR';
310
SET DEBUG_SYNC= 'p3abcdef CLEAR';
311
SET DEBUG_SYNC= 'p4a CLEAR';
312
SET DEBUG_SYNC= 'p7 CLEAR';
314
# Execute some actions to show they have gone.
316
SET DEBUG_SYNC= 'p1abcd TEST';
317
SHOW VARIABLES LIKE 'DEBUG_SYNC';
318
SET DEBUG_SYNC= 'p7 TEST';
319
SHOW VARIABLES LIKE 'DEBUG_SYNC';
320
SET DEBUG_SYNC= 'p9abcdef TEST';
321
SHOW VARIABLES LIKE 'DEBUG_SYNC';
323
# Now cleanup. Actions are clear already, but signal needs to be cleared.
325
SET DEBUG_SYNC= 'RESET';
326
SHOW VARIABLES LIKE 'DEBUG_SYNC';
329
# Facility requires SUPER privilege.
331
CREATE USER mysqltest_1@localhost;
332
GRANT SUPER ON *.* TO mysqltest_1@localhost;
333
--echo connection con1, mysqltest_1
334
connect (con1,localhost,mysqltest_1,,);
335
SET DEBUG_SYNC= 'RESET';
337
--echo connection default
339
DROP USER mysqltest_1@localhost;
341
CREATE USER mysqltest_2@localhost;
342
GRANT ALL ON *.* TO mysqltest_2@localhost;
343
REVOKE SUPER ON *.* FROM mysqltest_2@localhost;
344
--echo connection con1, mysqltest_2
345
connect (con1,localhost,mysqltest_2,,);
346
--error ER_SPECIFIC_ACCESS_DENIED_ERROR
347
SET DEBUG_SYNC= 'RESET';
349
--echo connection default
351
DROP USER mysqltest_2@localhost;
356
# Preparative cleanup.
358
SET DEBUG_SYNC= 'RESET';
359
DROP TABLE IF EXISTS t1;
363
CREATE TABLE t1 (c1 INT);
364
--echo connection con1
365
connect (con1,localhost,root,,);
366
SET DEBUG_SYNC= 'before_lock_tables_takes_lock
367
SIGNAL opened WAIT_FOR flushed';
368
send INSERT INTO t1 VALUES(1);
369
--echo connection default
371
SET DEBUG_SYNC= 'now WAIT_FOR opened';
372
SET DEBUG_SYNC= 'after_flush_unlock SIGNAL flushed';
374
--echo connection con1
378
--echo connection default
385
# Preparative cleanup.
387
SET DEBUG_SYNC= 'RESET';
388
DROP TABLE IF EXISTS t1;
392
CREATE TABLE t1 (c1 INT);
394
--echo connection con1
395
connect (con1,localhost,root,,);
396
# Retain action after use. First used by general_log.
397
SET DEBUG_SYNC= 'wait_for_lock SIGNAL locked EXECUTE 2';
398
send INSERT INTO t1 VALUES (1);
399
--echo connection default
401
# Wait until INSERT waits for lock.
402
SET DEBUG_SYNC= 'now WAIT_FOR locked';
403
# let INSERT continue.
405
--echo connection con1
407
--echo retrieve INSERT result.
410
--echo connection default
415
# Cleanup after test case.
416
# Otherwise signal would contain 'flushed' here,
417
# which could confuse the next test.
419
SET DEBUG_SYNC= 'RESET';