1###################### t/debug_sync.test ###############################
2#                                                                      #
3# Testing of the Debug Sync Facility.                                  #
4#                                                                      #
5# There is important documentation within sql/debug_sync.cc            #
6#                                                                      #
7# Used objects in this test case:                                      #
8# p0 - synchronization point 0. Non-existent dummy sync point.         #
9# s1 - signal 1.                                                       #
10# s2 - signal 2.                                                       #
11#                                                                      #
12# Creation:                                                            #
13# 2008-02-18 istruewing                                                #
14#                                                                      #
15########################################################################
16
17#
18# We need the Debug Sync Facility.
19#
20--source include/have_debug_sync.inc
21
22#
23# We are checking privileges, which the embedded server cannot do.
24#
25--source include/not_embedded.inc
26
27#
28# Preparative cleanup.
29#
30--disable_warnings
31SET DEBUG_SYNC= 'RESET';
32DROP TABLE IF EXISTS t1;
33--enable_warnings
34
35#
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).
39#
40SHOW VARIABLES LIKE 'DEBUG_SYNC';
41
42#
43# Syntax. Valid forms.
44#
45SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3';
46SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2';
47SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6           HIT_LIMIT 3';
48SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6';
49SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2           EXECUTE 2 HIT_LIMIT 3';
50SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2           EXECUTE 2';
51SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2                     HIT_LIMIT 3';
52SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2';
53SET DEBUG_SYNC='p0 SIGNAL s1                       EXECUTE 2 HIT_LIMIT 3';
54SET DEBUG_SYNC='p0 SIGNAL s1                       EXECUTE 2';
55SET DEBUG_SYNC='p0 SIGNAL s1                                 HIT_LIMIT 3';
56SET DEBUG_SYNC='p0 SIGNAL s1';
57SET DEBUG_SYNC='p0           WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3';
58SET DEBUG_SYNC='p0           WAIT_FOR s2 TIMEOUT 6 EXECUTE 2';
59SET DEBUG_SYNC='p0           WAIT_FOR s2 TIMEOUT 6           HIT_LIMIT 3';
60SET DEBUG_SYNC='p0           WAIT_FOR s2 TIMEOUT 6';
61SET DEBUG_SYNC='p0           WAIT_FOR s2           EXECUTE 2 HIT_LIMIT 3';
62SET DEBUG_SYNC='p0           WAIT_FOR s2           EXECUTE 2';
63SET DEBUG_SYNC='p0           WAIT_FOR s2                     HIT_LIMIT 3';
64SET DEBUG_SYNC='p0           WAIT_FOR s2';
65SET DEBUG_SYNC='p0                                           HIT_LIMIT 3';
66SET DEBUG_SYNC='p0 CLEAR';
67SET DEBUG_SYNC='p0 TEST';
68SET DEBUG_SYNC='RESET';
69
70#
71# Syntax. Valid forms. Lower case.
72#
73set debug_sync='p0 signal s1 wait_for s2 timeout 6 execute 2 hit_limit 3';
74set debug_sync='p0 signal s1 wait_for s2 timeout 6 execute 2';
75set debug_sync='p0 signal s1 wait_for s2 timeout 6           hit_limit 3';
76set debug_sync='p0 signal s1 wait_for s2 timeout 6';
77set debug_sync='p0 signal s1 wait_for s2           execute 2 hit_limit 3';
78set debug_sync='p0 signal s1 wait_for s2           execute 2';
79set debug_sync='p0 signal s1 wait_for s2                     hit_limit 3';
80set debug_sync='p0 signal s1 wait_for s2';
81set debug_sync='p0 signal s1                       execute 2 hit_limit 3';
82set debug_sync='p0 signal s1                       execute 2';
83set debug_sync='p0 signal s1                                 hit_limit 3';
84set debug_sync='p0 signal s1';
85set debug_sync='p0           wait_for s2 timeout 6 execute 2 hit_limit 3';
86set debug_sync='p0           wait_for s2 timeout 6 execute 2';
87set debug_sync='p0           wait_for s2 timeout 6           hit_limit 3';
88set debug_sync='p0           wait_for s2 timeout 6';
89set debug_sync='p0           wait_for s2           execute 2 hit_limit 3';
90set debug_sync='p0           wait_for s2           execute 2';
91set debug_sync='p0           wait_for s2                     hit_limit 3';
92set debug_sync='p0           wait_for s2';
93set debug_sync='p0                                           hit_limit 3';
94set debug_sync='p0 clear';
95set debug_sync='p0 test';
96set debug_sync='reset';
97
98#
99# Syntax. Valid forms. Line wrap, leading, mid, trailing space.
100#
101SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6
102                EXECUTE 2 HIT_LIMIT 3';
103SET DEBUG_SYNC='   p0 SIGNAL s1 WAIT_FOR s2';
104SET DEBUG_SYNC='p0    SIGNAL    s1    WAIT_FOR    s2';
105SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2   ';
106SET DEBUG_SYNC='   p0 SIGNAL s1 WAIT_FOR s2   ';
107SET DEBUG_SYNC='   p0    SIGNAL    s1    WAIT_FOR    s2   ';
108
109#
110# Syntax. Invalid forms.
111#
112--error ER_PARSE_ERROR
113SET DEBUG_SYNC='';
114--error ER_PARSE_ERROR
115SET DEBUG_SYNC=' ';
116--error ER_PARSE_ERROR
117SET DEBUG_SYNC='p0';
118--error ER_PARSE_ERROR
119SET DEBUG_SYNC='p0                                          EXECUTE 2';
120--error ER_PARSE_ERROR
121SET DEBUG_SYNC='p0                                TIMEOUT 6 EXECUTE 2';
122--error ER_PARSE_ERROR
123SET DEBUG_SYNC='p0                                TIMEOUT 6';
124--error ER_PARSE_ERROR
125SET DEBUG_SYNC='p0 WAIT_FOR s2 SIGNAL s1';
126--error ER_PARSE_ERROR
127SET DEBUG_SYNC='p0 WAIT_FOR s2 SIGNAL s1           EXECUTE 2';
128--error ER_PARSE_ERROR
129SET DEBUG_SYNC='p0 WAIT_FOR s2 SIGNAL s1 TIMEOUT 6 EXECUTE 2';
130--error ER_PARSE_ERROR
131SET DEBUG_SYNC='p0 WAIT_FOR s2 SIGNAL s1 TIMEOUT 6';
132--error ER_PARSE_ERROR
133SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 SIGNAL s1 EXECUTE 2';
134--error ER_PARSE_ERROR
135SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 SIGNAL s1';
136--error ER_PARSE_ERROR
137SET DEBUG_SYNC='p0 TIMEOUT 6 WAIT_FOR s2 EXECUTE 2';
138--error ER_PARSE_ERROR
139SET DEBUG_SYNC='p0 TIMEOUT 6 WAIT_FOR s2';
140--error ER_PARSE_ERROR
141SET DEBUG_SYNC='p0                  SIGNAL s1 TIMEOUT 6 EXECUTE 2';
142--error ER_PARSE_ERROR
143SET DEBUG_SYNC='p0                  SIGNAL s1 TIMEOUT 6';
144--error ER_PARSE_ERROR
145SET DEBUG_SYNC='p0 EXECUTE 2 SIGNAL s1 TIMEOUT 6';
146--error ER_PARSE_ERROR
147SET DEBUG_SYNC='p0 TIMEOUT 6 SIGNAL s1';
148--error ER_PARSE_ERROR
149SET DEBUG_SYNC='p0 EXECUTE 2 TIMEOUT 6 SIGNAL s1';
150--error ER_PARSE_ERROR
151SET DEBUG_SYNC='p0 CLEAR HIT_LIMIT 3';
152--error ER_PARSE_ERROR
153SET DEBUG_SYNC='CLEAR';
154--error ER_PARSE_ERROR
155SET DEBUG_SYNC='p0 CLEAR p0';
156--error ER_PARSE_ERROR
157SET DEBUG_SYNC='TEST';
158--error ER_PARSE_ERROR
159SET DEBUG_SYNC='p0 TEST p0';
160--error ER_PARSE_ERROR
161SET DEBUG_SYNC='p0 RESET';
162--error ER_PARSE_ERROR
163SET DEBUG_SYNC='RESET p0';
164--error ER_PARSE_ERROR
165SET DEBUG_SYNC='p0 RESET p0';
166--error ER_PARSE_ERROR
167SET DEBUG_SYNC='p0 SIGNAL ';
168--error ER_PARSE_ERROR
169SET DEBUG_SYNC='p0 WAIT_FOR ';
170--error ER_PARSE_ERROR
171SET DEBUG_SYNC='p0 SIGNAL s1 EXECUTE ';
172
173#
174# Syntax. Invalid keywords used.
175#
176--error ER_UNKNOWN_SYSTEM_VARIABLE
177SET DEBUG_SYNCx='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3';
178--error ER_PARSE_ERROR
179SET DEBUG_SYNC='p0 SIGNAx s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3';
180--error ER_PARSE_ERROR
181SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOx s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3';
182--error ER_PARSE_ERROR
183SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUx 0 EXECUTE 2 HIT_LIMIT 3';
184--error ER_PARSE_ERROR
185SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTx 2 HIT_LIMIT 3';
186--error ER_PARSE_ERROR
187SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIx 3';
188--error ER_PARSE_ERROR
189SET DEBUG_SYNC='p0 CLEARx';
190--error ER_PARSE_ERROR
191SET DEBUG_SYNC='p0 TESTx';
192--error ER_PARSE_ERROR
193SET DEBUG_SYNC='RESETx';
194
195#
196# Syntax. Invalid numbers. Decimal only.
197#
198--error ER_PARSE_ERROR
199SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 0x6 EXECUTE 2 HIT_LIMIT 3';
200--error ER_PARSE_ERROR
201SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 6 EXECUTE 0x2 HIT_LIMIT 3';
202--error ER_PARSE_ERROR
203SET DEBUG_SYNC='p0 WAIT_FOR s2 TIMEOUT 7 EXECUTE 2 HIT_LIMIT 0x3';
204
205#
206# Syntax. Invalid value type.
207#
208--error ER_WRONG_TYPE_FOR_VAR
209SET DEBUG_SYNC= 7;
210
211#
212# Syntax. DEBUG_SYNC is a SESSION-only variable.
213#
214--error ER_LOCAL_VARIABLE
215SET GLOBAL DEBUG_SYNC= 'p0 CLEAR';
216
217#
218# Syntax. The variable value does not need to be a string literal.
219#
220SET @myvar= 'now SIGNAL from_myvar';
221SET DEBUG_SYNC= @myvar;
222SHOW VARIABLES LIKE 'DEBUG_SYNC';
223#
224SET DEBUG_SYNC= LEFT('now SIGNAL from_function_cut_here', 24);
225SHOW VARIABLES LIKE 'DEBUG_SYNC';
226
227#
228# Functional tests.
229#
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.
233#
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.
243#
244
245#
246# Time out immediately. This gives just a warning.
247#
248SET DEBUG_SYNC= 'now SIGNAL something';
249SHOW VARIABLES LIKE 'DEBUG_SYNC';
250# Suppress warning number
251--replace_column 2 ####
252SET DEBUG_SYNC= 'now WAIT_FOR nothing TIMEOUT 0';
253#
254# If signal is present already, TIMEOUT 0 does not give a warning.
255#
256SET DEBUG_SYNC= 'now SIGNAL nothing';
257SHOW VARIABLES LIKE 'DEBUG_SYNC';
258SET DEBUG_SYNC= 'now WAIT_FOR nothing TIMEOUT 0';
259
260#
261# EXECUTE 0 is effectively a no-op.
262#
263SET DEBUG_SYNC= 'now SIGNAL something EXECUTE 0';
264SHOW VARIABLES LIKE 'DEBUG_SYNC';
265SET DEBUG_SYNC= 'now WAIT_FOR anotherthing TIMEOUT 0 EXECUTE 0';
266
267#
268# Run into HIT_LIMIT. This gives an error.
269#
270--error ER_DEBUG_SYNC_HIT_LIMIT
271SET DEBUG_SYNC= 'now HIT_LIMIT 1';
272
273#
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
276#
277SET DEBUG_SYNC= 'RESET';
278SHOW VARIABLES LIKE 'DEBUG_SYNC';
279SET DEBUG_SYNC= 'p1abcd   SIGNAL s1 EXECUTE 2';
280SET DEBUG_SYNC= 'p2abc    SIGNAL s2 EXECUTE 2';
281SET DEBUG_SYNC= 'p9abcdef SIGNAL s9 EXECUTE 2';
282SET DEBUG_SYNC= 'p4a      SIGNAL s4 EXECUTE 2';
283SET DEBUG_SYNC= 'p5abcde  SIGNAL s5 EXECUTE 2';
284SET DEBUG_SYNC= 'p6ab     SIGNAL s6 EXECUTE 2';
285SET DEBUG_SYNC= 'p7       SIGNAL s7 EXECUTE 2';
286SET DEBUG_SYNC= 'p8abcdef SIGNAL s8 EXECUTE 2';
287SET DEBUG_SYNC= 'p3abcdef SIGNAL s3 EXECUTE 2';
288#
289# Execute some actions to show they exist. Each sets a distinct signal.
290#
291SET DEBUG_SYNC= 'p4a      TEST';
292SHOW VARIABLES LIKE 'DEBUG_SYNC';
293SET DEBUG_SYNC= 'p1abcd   TEST';
294SHOW VARIABLES LIKE 'DEBUG_SYNC';
295SET DEBUG_SYNC= 'p7       TEST';
296SHOW VARIABLES LIKE 'DEBUG_SYNC';
297SET DEBUG_SYNC= 'p9abcdef TEST';
298SHOW VARIABLES LIKE 'DEBUG_SYNC';
299SET DEBUG_SYNC= 'p3abcdef TEST';
300SHOW VARIABLES LIKE 'DEBUG_SYNC';
301#
302# Clear the actions.
303#
304SET DEBUG_SYNC= 'p1abcd   CLEAR';
305SET DEBUG_SYNC= 'p2abc    CLEAR';
306SET DEBUG_SYNC= 'p5abcde  CLEAR';
307SET DEBUG_SYNC= 'p6ab     CLEAR';
308SET DEBUG_SYNC= 'p8abcdef CLEAR';
309SET DEBUG_SYNC= 'p9abcdef CLEAR';
310SET DEBUG_SYNC= 'p3abcdef CLEAR';
311SET DEBUG_SYNC= 'p4a      CLEAR';
312SET DEBUG_SYNC= 'p7       CLEAR';
313#
314# Execute some actions to show they have gone.
315#
316SET DEBUG_SYNC= 'p1abcd   TEST';
317SHOW VARIABLES LIKE 'DEBUG_SYNC';
318SET DEBUG_SYNC= 'p7       TEST';
319SHOW VARIABLES LIKE 'DEBUG_SYNC';
320SET DEBUG_SYNC= 'p9abcdef TEST';
321SHOW VARIABLES LIKE 'DEBUG_SYNC';
322#
323# Now cleanup. Actions are clear already, but signal needs to be cleared.
324#
325SET DEBUG_SYNC= 'RESET';
326SHOW VARIABLES LIKE 'DEBUG_SYNC';
327
328#
329# Facility requires SUPER privilege.
330#
331CREATE USER mysqltest_1@localhost;
332GRANT SUPER ON *.* TO mysqltest_1@localhost;
333connect (con1,localhost,mysqltest_1,,);
334SET DEBUG_SYNC= 'RESET';
335disconnect con1;
336connection default;
337DROP USER mysqltest_1@localhost;
338#
339CREATE USER mysqltest_2@localhost;
340GRANT ALL ON *.* TO mysqltest_2@localhost;
341REVOKE SUPER ON *.* FROM mysqltest_2@localhost;
342connect (con1,localhost,mysqltest_2,,);
343--error ER_SPECIFIC_ACCESS_DENIED_ERROR
344SET DEBUG_SYNC= 'RESET';
345disconnect con1;
346connection default;
347DROP USER mysqltest_2@localhost;
348
349#
350# Example 1.
351#
352# Preparative cleanup.
353--disable_warnings
354SET DEBUG_SYNC= 'RESET';
355DROP TABLE IF EXISTS t1;
356--enable_warnings
357#
358# Test.
359CREATE TABLE t1 (c1 INT);
360    connect (con1,localhost,root,,);
361    SET DEBUG_SYNC= 'before_lock_tables_takes_lock
362      SIGNAL opened WAIT_FOR flushed';
363    send INSERT INTO t1 VALUES(1);
364connection default;
365SET DEBUG_SYNC= 'now WAIT_FOR opened';
366SET DEBUG_SYNC= 'after_flush_unlock SIGNAL flushed';
367FLUSH TABLE t1;
368    connection con1;
369    reap;
370    disconnect con1;
371connection default;
372DROP TABLE t1;
373
374#
375# Example 2.
376#
377# Preparative cleanup.
378--disable_warnings
379SET DEBUG_SYNC= 'RESET';
380DROP TABLE IF EXISTS t1;
381--enable_warnings
382#
383# Test.
384CREATE TABLE t1 (c1 INT) ENGINE=MyISAM;
385INSERT INTO t1 VALUES (1);
386SELECT GET_LOCK('mysqltest_lock', 100);
387
388connect (con1,localhost,root,,);
389--echo # Sending:
390--send UPDATE t1 SET c1=GET_LOCK('mysqltest_lock', 100);
391
392connect (con2,localhost,root,,);
393let $wait_condition=
394  select count(*) = 1 from information_schema.processlist
395  where state = "User lock" and
396        info = "UPDATE t1 SET c1=GET_LOCK('mysqltest_lock', 100)";
397--source include/wait_condition.inc
398
399# Retain action after use. First used by general_log.
400SET DEBUG_SYNC= 'wait_for_lock SIGNAL locked EXECUTE 2';
401send INSERT INTO t1 VALUES (1);
402
403connection default;
404# Wait until INSERT waits for lock.
405SET DEBUG_SYNC= 'now WAIT_FOR locked';
406# let UPDATE continue.
407SELECT RELEASE_LOCK('mysqltest_lock');
408connection con1;
409--echo # Reaping UPDATE
410reap;
411SELECT RELEASE_LOCK('mysqltest_lock');
412
413connection con2;
414--echo retrieve INSERT result.
415reap;
416disconnect con1;
417disconnect con2;
418connection default;
419DROP TABLE t1;
420
421#
422# Cleanup after test case.
423# Otherwise signal would contain 'flushed' here,
424# which could confuse the next test.
425#
426SET DEBUG_SYNC= 'RESET';
427
428