1#
2# Coverage for GET_LOCK, RELEASE_LOCK, RELEASE_ALL_LOCKS,
3# IS_USED_LOCK and IS_FREE_LOCK functions.
4#
5# Tests for WL#1159 "Allow multiple locks in GET_LOCK()".
6#
7# FT-1: The current connection has no user-level lock aquired at all.
8#       There is no parallel connection holding the lock 'test'.
9# FT-1.1: IS_USED_LOCK returns NULL if the lock is unused.
10SELECT IS_USED_LOCK('test') IS NULL AS expect_1;
11expect_1
121
13# FT-1.2: IS_FREE_LOCK returns 1 if the lock is unused.
14SELECT IS_FREE_LOCK('test') = 1 AS expect_1;
15expect_1
161
17# FT-1.3: RELEASE_LOCK returns NULL when none of the existing connections
18#         holds the lock 'test'.
19SELECT RELEASE_LOCK('test') IS NULL AS expect_1;
20expect_1
211
22# FT-1.4: RELEASE_ALL_LOCKS returns the number of own locks freed.
23#         This is 0 because the connection had no locks acquired.
24SELECT RELEASE_ALL_LOCKS() = 0 AS expect_1;
25expect_1
261
27# FT-2: The current connection has success in aquiring a user level lock.
28# FT-2.1: GET_LOCK returns 1 if it manages to acquire a lock.
29SELECT GET_LOCK('test', 0) = 1 AS expect_1;
30expect_1
311
32# FT-2.2: IS_USED_LOCK returns our connection id because its our lock.
33SELECT IS_USED_LOCK('test') = CONNECTION_ID() AS expect_1;
34expect_1
351
36# FT-2.3: IS_FREE_LOCK returns 0 because the lock is held by our connection.
37SELECT IS_FREE_LOCK('test') = 0 AS expect_1;
38expect_1
391
40connect  con1,localhost,root,,;
41connection con1;
42# FT-3: Another connection holds a user-level lock.
43# FT-3.1: IS_USED_LOCK returns the id of the other connection default
44#         which holds that lock. The result fits to FT-2.2.
45SET @aux = <default_id>;
46SELECT IS_USED_LOCK('test') = @aux AS expect_1;
47expect_1
481
49# FT-3.2: IS_FREE_LOCK returns 0 because the lock is held by the other
50#         connection default.
51SELECT IS_FREE_LOCK('test') = 0 AS expect_1;
52expect_1
531
54# FT-3.3: GET_LOCK returns 0 if it can't acquire a lock (wait timeout).
55SELECT GET_LOCK('test', 0) = 0 expect_1;
56expect_1
571
58# FT-3.4: RELEASE_LOCK returns 0 if the lock belongs to another connection.
59SELECT RELEASE_LOCK('test') = 0 AS expect_1;
60expect_1
611
62# FT-3.5: RELEASE_ALL_LOCKS returns the number of own locks freed.
63#         This is 0 because the connection had no locks acquired and
64#         we also cannot free locks held by others.
65SELECT RELEASE_ALL_LOCKS() = 0 AS expect_1;
66expect_1
671
68connection default;
69# FT-4.1: RELEASE_LOCK returns 1 if it successfully releases a lock.
70SELECT RELEASE_LOCK('test') = 1 AS expect_1;
71expect_1
721
73# FT-4.2: RELEASE_LOCK returns NULL if it doesn't release a lock and
74#         and there is no such lock. It also does not matter that we
75#         held that lock somewhere before.
76SELECT RELEASE_LOCK('test') IS NULL;
77RELEASE_LOCK('test') IS NULL
781
79# FT-5: A connection can hold multiple user-level locks.
80# FT-5.1: Several statements aquiring one lock per statement.
81SELECT GET_LOCK('test1',0);
82GET_LOCK('test1',0)
831
84SELECT GET_LOCK('test2',0);
85GET_LOCK('test2',0)
861
87#         The connection holds two locks.
88SELECT IS_USED_LOCK('test1') = CONNECTION_ID()
89AND IS_USED_LOCK('test2') = CONNECTION_ID() AS expect_1;
90expect_1
911
92# FT-5.2: RELEASE_LOCK() frees the assigned user level lock only.
93SELECT RELEASE_LOCK('test1') = 1 AS expect_1;
94expect_1
951
96SELECT IS_FREE_LOCK('test1') = 1 AS expect_1;
97expect_1
981
99SELECT IS_FREE_LOCK('test2') = 0 AS expect_1;
100expect_1
1011
102SELECT RELEASE_LOCK('test2') = 1 AS expect_1;
103expect_1
1041
105# FT-5.3: RELEASE_ALL_LOCKS frees all locks all at once
106#         and returns the number of locks freed.
107SELECT GET_LOCK('test1',0);
108GET_LOCK('test1',0)
1091
110SELECT GET_LOCK('test2',0);
111GET_LOCK('test2',0)
1121
113SELECT RELEASE_ALL_LOCKS() = 2 AS expect_1;
114expect_1
1151
116SELECT IS_FREE_LOCK('test1') AND IS_FREE_LOCK('test2') AS expect_1;
117expect_1
1181
119# FT-5.4: One statement aquiring more than one lock works the same way.
120# FT-5.4.1: More than one result expression with GET_LOCK, one row.
121SELECT GET_LOCK('test1',0), GET_LOCK('test2',0);
122GET_LOCK('test1',0)	GET_LOCK('test2',0)
1231	1
124#         The connections holds two locks.
125SELECT IS_USED_LOCK('test1') = CONNECTION_ID()
126AND IS_USED_LOCK('test2') = CONNECTION_ID() AS expect_1;
127expect_1
1281
129SELECT RELEASE_ALL_LOCKS() = 2 AS expect_1;
130expect_1
1311
132SELECT IS_USED_LOCK('test1') IS NULL AND IS_USED_LOCK('test2') IS NULL AS expect_1;
133expect_1
1341
135# FT-5.4.2: More than one time GET_LOCK somewhere, one row.
136SELECT GET_LOCK('test1',0) FROM (SELECT 1 AS col1) AS my_tab
137WHERE GET_LOCK('test2',0) = 1;
138GET_LOCK('test1',0)
1391
140SELECT IS_USED_LOCK('test1') = CONNECTION_ID()
141AND IS_USED_LOCK('test2') = CONNECTION_ID() AS expect_1;
142expect_1
1431
144SELECT RELEASE_ALL_LOCKS() = 2 AS expect_1;
145expect_1
1461
147SELECT IS_USED_LOCK('test1') IS NULL AND IS_USED_LOCK('test2') IS NULL AS expect_1;
148expect_1
1491
150# FT-5.4.3: One result expression with GET_LOCK, more than one result row.
151SELECT GET_LOCK(col1,0) FROM (SELECT 'test1' AS col1 UNION SELECT 'test2') AS my_tab;
152GET_LOCK(col1,0)
1531
1541
155SELECT IS_USED_LOCK('test1') = CONNECTION_ID()
156AND IS_USED_LOCK('test2') = CONNECTION_ID() AS expect_1;
157expect_1
1581
159SELECT RELEASE_ALL_LOCKS() = 2 AS expect_1;
160expect_1
1611
162SELECT IS_USED_LOCK('test1') IS NULL AND IS_USED_LOCK('test2') IS NULL AS expect_1;
163expect_1
1641
165# FT-6: A connection can hold multiple user-level locks with same name.
166# FT-6.1: GET_LOCK() and RELEASE_LOCK() work recursively.
167SELECT GET_LOCK('test', 0);
168GET_LOCK('test', 0)
1691
170SELECT GET_LOCK('test', 0);
171GET_LOCK('test', 0)
1721
173SELECT GET_LOCK('test', 0);
174GET_LOCK('test', 0)
1751
176SELECT RELEASE_LOCK('test');
177RELEASE_LOCK('test')
1781
179SELECT RELEASE_LOCK('test');
180RELEASE_LOCK('test')
1811
182SELECT RELEASE_LOCK('test');
183RELEASE_LOCK('test')
1841
185#         Once the last instance of the lock is released,
186#         the next call returns NULL.
187SELECT RELEASE_LOCK('test') IS NULL AS expect_1;
188expect_1
1891
190# FT-6.2: Counting in RELEASE_ALL_LOCKS() for recursive locks is correct.
191SELECT GET_LOCK('test', 0), GET_LOCK('test', 0);
192GET_LOCK('test', 0)	GET_LOCK('test', 0)
1931	1
194SELECT RELEASE_ALL_LOCKS() = 2 AS expect_1;
195expect_1
1961
197# FT-7: Check a statement with GET_LOCK() getting killed.
198# FT-7.1: KILL arrives when waiting for the user lock
199#         The statement must return ER_QUERY_INTERRUPTED.
200SELECT GET_LOCK('test', 0);
201GET_LOCK('test', 0)
2021
203connection con1;
204# Send statement and reap result later.
205SELECT GET_LOCK('test', 7200);
206connection default;
207SET @aux = <con1_id>;
208KILL QUERY @aux;
209connection con1;
210# Reap result of "SELECT GET_LOCK('test', 7200)".
211ERROR 70100: Query execution was interrupted
212# Check that Connection con1 sees the right state.
213SELECT IS_FREE_LOCK('test') = 0 AS expect_1;
214expect_1
2151
216SELECT IS_USED_LOCK('test') <> CONNECTION_ID() AS expect_1;
217expect_1
2181
219connection default;
220SELECT RELEASE_LOCK('test') = 1 AS expect_1;
221expect_1
2221
223# FT-7.2: The lock is not held by some other connection.
224#         KILL arrives during the SLEEP phase after the lock is taken.
225connection con1;
226# Send statement and reap result later.
227SELECT GET_LOCK('test', 7200), SLEEP(10);
228connection default;
229SET @aux = <con1_id>;
230KILL QUERY @aux;
231# Connection con1 has got the lock.
232SELECT IS_FREE_LOCK('test') = 0 AS expect_1;
233expect_1
2341
235connection con1;
236# Reap result of "SELECT GET_LOCK('test', 7200), SLEEP(10)".
237# We intentionally do not print the result.
238# If a statement killed in the 'user sleep' phase harvests finally
239# success or ER_QUERY_INTERRUPTED is NOT in the scope of current check.
240# The essential is that the connection con1 has got that lock.
241SELECT IS_FREE_LOCK('test') = 0 AS expect_1;
242expect_1
2431
244SELECT IS_USED_LOCK('test') = CONNECTION_ID() AS expect_1;
245expect_1
2461
247connection default;
248SELECT IS_FREE_LOCK('test') = 0 AS expect_1;
249expect_1
2501
251connection con1;
252SELECT RELEASE_LOCK('test') = 1 AS expect_1;
253expect_1
2541
255# FT-8: Check that user locks disappear if the session is killed.
256connection con1;
257SELECT GET_LOCK('test1', 0);
258GET_LOCK('test1', 0)
2591
260SELECT GET_LOCK('test1', 0);
261GET_LOCK('test1', 0)
2621
263connection default;
264SELECT IS_FREE_LOCK('test1') = 0 AS expect_1;
265expect_1
2661
267SET @aux = <con1_id>;
268KILL @aux;
269SELECT IS_FREE_LOCK('test1') = 1 AS expect_1;
270expect_1
2711
272connection con1;
273disconnect con1;
274connect  con1,localhost,root,,;
275# FT-9: Check that Deadlocks are detected e.g. in case of a mutual wait.
276connection default;
277SELECT GET_LOCK('test1', 0);
278GET_LOCK('test1', 0)
2791
280connection con1;
281SELECT GET_LOCK('test2', 0);
282GET_LOCK('test2', 0)
2831
284# Send statement and reap result later.
285SELECT GET_LOCK('test1', 7200);
286connection default;
287SELECT GET_LOCK('test2', 7200);
288ERROR HY000: Deadlock found when trying to get user-level lock; try rolling back transaction/releasing locks and restarting lock acquisition.
289SELECT RELEASE_LOCK('test1');
290RELEASE_LOCK('test1')
2911
292connection con1;
293# Reap result of "SELECT GET_LOCK('test1', 7200)".
294GET_LOCK('test1', 7200)
2951
296#       Two RELEASE_LOCK in one statement must work too.
297SELECT RELEASE_LOCK('test2') + RELEASE_LOCK('test1') = 2 AS expect_1;
298expect_1
2991
300# FT-10: Non user lock related locking/unlocking does not free
301#        user locks.
302# FT-10.1: LOCK/UNLOCK TABLES
303connection default;
304CREATE TABLE t1 (id INT);
305SELECT GET_LOCK('test1', 0);
306GET_LOCK('test1', 0)
3071
308LOCK TABLE t1 WRITE;
309SELECT GET_LOCK('test2', 0);
310GET_LOCK('test2', 0)
3111
312UNLOCK TABLES;
313SELECT RELEASE_ALL_LOCKS() = 2 AS expect_1;
314expect_1
3151
316# FT-10.2: GLOBAL READ LOCK
317SELECT GET_LOCK('test1', 0);
318GET_LOCK('test1', 0)
3191
320FLUSH TABLES WITH READ LOCK;
321SELECT GET_LOCK('test2', 0);
322GET_LOCK('test2', 0)
3231
324UNLOCK TABLES;
325SELECT (RELEASE_LOCK('test1') = 1) AND (RELEASE_LOCK('test3') IS NULL)
326AND (RELEASE_LOCK('test2') = 1) AS expect_1;
327expect_1
3281
329# FT-10.3: BEGIN/COMMIT/ROLLBACK don't unlock user locks.
330DELETE FROM t1;
331BEGIN;
332INSERT INTO t1 SET id = 1;
333SELECT GET_LOCK('test1', 0);
334GET_LOCK('test1', 0)
3351
336COMMIT;
337BEGIN;
338INSERT INTO t1 SET id = 2;
339SELECT GET_LOCK('test2', 0);
340GET_LOCK('test2', 0)
3411
342ROLLBACK;
343SELECT RELEASE_ALL_LOCKS() = 2 AS expect_1;
344expect_1
3451
346SELECT id FROM t1 ORDER BY id;
347id
3481
349DELETE FROM t1;
350# FT-11: Deadlocks between user locks and other metadata locks
351#        are correctly detected.
352#
353# FT-11.1: Waits for user-level locks are preferred as victim over DDL.
354#          Without any user locks : "default" waits till "con1" COMMITs.
355SELECT GET_LOCK('test', 0);
356GET_LOCK('test', 0)
3571
358connection con1;
359BEGIN;
360INSERT INTO t1 VALUES (1);
361# Send statement and reap result later.
362SELECT GET_LOCK('test', 7200);
363connection default;
364# Send statement and reap result later.
365RENAME TABLE t1 TO t2;
366connection con1;
367# Reap result of "SELECT GET_LOCK('test', 7200)".
368ERROR HY000: Deadlock found when trying to get user-level lock; try rolling back transaction/releasing locks and restarting lock acquisition.
369#          When user-level lock wait is aborted due to deadlock the
370#          transaction is not rolled back.
371COMMIT;
372connection default;
373# Reap result of "RENAME TABLE t1 TO t2".
374RENAME TABLE t2 TO t1;
375SELECT RELEASE_LOCK('test');
376RELEASE_LOCK('test')
3771
378connection con1;
379#          The row inserted in the committed transaction must exist.
380SELECT COUNT(*) = 1 AS expect_1 FROM t1 WHERE id = 1;
381expect_1
3821
383connection default;
384# FT-11.2: Waits for DML locks are preferred as victim over waits for
385#          user-level locks.
386#          Without any user locks : "default" waits till MDL lock timout kicks in.
387SELECT GET_LOCK('test', 0);
388GET_LOCK('test', 0)
3891
390connection con1;
391LOCK TABLE t1 WRITE;
392# Send statement and reap result later.
393SELECT GET_LOCK('test', 7200);
394connection default;
395SELECT COUNT(*) FROM t1;
396ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
397#          User-level lock is not released even though transaction/statement
398#          is rolled back in this case.
399SELECT RELEASE_LOCK('test') = 1 AS expect_1;
400expect_1
4011
402connection con1;
403# Reap result of "SELECT GET_LOCK('test', 7200)".
404GET_LOCK('test', 7200)
4051
406SELECT RELEASE_LOCK('test');
407RELEASE_LOCK('test')
4081
409UNLOCK TABLES;
410# FT-12: GET_LOCK in some scenarios of interest.
411#        The user-level lock related functions work well.
412#        The "main" property of interest seen is:
413#        Some failing statement might have taken user-level locks
414#        and these locks will not get freed because the statement
415#        failed.
416# FT-12.1: GET_LOCK within some TRIGGER, User locks stay recursive
417connection default;
418DELETE FROM t1;
419#        Warning: The trigger definition used is "evil" and not for use
420#                 some production environment.
421CREATE TRIGGER trig_t1_ins BEFORE INSERT ON t1 FOR EACH ROW
422SET @aux = GET_LOCK(new.id,7200);
423SELECT GET_LOCK(CAST(2 AS CHAR),0);
424GET_LOCK(CAST(2 AS CHAR),0)
4251
426#          Success == No collision with own user lock.
427#          Get a second with same name and two with other names.
428INSERT INTO t1 VALUES(1),(2),(3);
429SELECT RELEASE_LOCK(1) = 1 AS expect_1;
430expect_1
4311
432SELECT RELEASE_LOCK(2) = 1 AS expect_1;
433expect_1
4341
435# Get again 1.
436SELECT RELEASE_LOCK(2) = 1 AS expect_1;
437expect_1
4381
439SELECT RELEASE_LOCK(3) = 1 AS expect_1;
440expect_1
4411
442SELECT RELEASE_ALL_LOCKS() = 0 AS expect_1;
443expect_1
4441
445SELECT COUNT(*) FROM t1;
446COUNT(*)
4473
448# FT-12.2: GET_LOCK in an INSERT TRIGGER loses against a MDL lock request.
449connection default;
450DELETE FROM t1;
451SELECT GET_LOCK(2,0);
452GET_LOCK(2,0)
4531
454connection con1;
455# Send statement and reap result later.
456INSERT INTO t1 VALUES(1),(2),(3);
457connection default;
458RENAME TABLE t1 TO t1x;
459RENAME TABLE t1x TO t1;
460connection con1;
461# Reap result of "INSERT INTO t1 VALUES(1),(2),(3)".
462ERROR HY000: Deadlock found when trying to get user-level lock; try rolling back transaction/releasing locks and restarting lock acquisition.
463SELECT RELEASE_ALL_LOCKS();
464RELEASE_ALL_LOCKS()
4651
466SELECT COUNT(*) FROM t1;
467COUNT(*)
4680
469connection default;
470SELECT RELEASE_ALL_LOCKS();
471RELEASE_ALL_LOCKS()
4721
473# FT-12.3: GET_LOCK in a better designed INSERT TRIGGER loses.
474# FT-12.3.1: Session with INSERT loses via user lock deadlock.
475connection default;
476DELETE FROM t1;
477DROP TRIGGER trig_t1_ins;
478CREATE TRIGGER trig_t1_ins BEFORE INSERT ON t1 FOR EACH ROW
479BEGIN
480SET @aux = GET_LOCK(2,1);
481IF @aux <> 1 THEN
482SIGNAL SQLSTATE '45000'
483      SET MESSAGE_TEXT = 'LOCK 2 not got. Abort.', MYSQL_ERRNO = 9999;
484END IF;
485END;|
486SELECT GET_LOCK(CAST(2 AS CHAR),0);
487GET_LOCK(CAST(2 AS CHAR),0)
4881
489connection con1;
490SELECT GET_LOCK(CAST(1 AS CHAR),0);
491GET_LOCK(CAST(1 AS CHAR),0)
4921
493connection default;
494# Send statement and reap result later.
495SELECT GET_LOCK(CAST(1 AS CHAR),7200);
496connection con1;
497INSERT INTO t1 VALUES(1),(2),(3);
498ERROR HY000: Deadlock found when trying to get user-level lock; try rolling back transaction/releasing locks and restarting lock acquisition.
499SELECT RELEASE_ALL_LOCKS();
500RELEASE_ALL_LOCKS()
5011
502SELECT COUNT(*) FROM t1;
503COUNT(*)
5040
505connection default;
506# Reap result of "SELECT GET_LOCK(CAST(1 AS CHAR),7200)".
507GET_LOCK(CAST(1 AS CHAR),7200)
5081
509SELECT RELEASE_ALL_LOCKS();
510RELEASE_ALL_LOCKS()
5112
512# FT-12.3.2: INSERT fails in TRIGGER because not getting a user lock in time.
513connection default;
514DELETE FROM t1;
515SELECT GET_LOCK(CAST(2 AS CHAR),0);
516GET_LOCK(CAST(2 AS CHAR),0)
5171
518connection con1;
519INSERT INTO t1 VALUES(1),(2),(3);
520ERROR 45000: LOCK 2 not got. Abort.
521SELECT @aux;
522@aux
5230
524SELECT RELEASE_ALL_LOCKS();
525RELEASE_ALL_LOCKS()
5260
527SELECT COUNT(*) FROM t1;
528COUNT(*)
5290
530connection default;
531SELECT RELEASE_ALL_LOCKS();
532RELEASE_ALL_LOCKS()
5331
534DROP TRIGGER trig_t1_ins;
535# FT-12.4: User locks and violation of uniqueness.
536connection default;
537CREATE TABLE t2 (col1 INT, col2 INT, PRIMARY KEY(col1));
538DELETE FROM t1;
539INSERT INTO t1 VALUES(1),(2),(1);
540INSERT INTO t2 SELECT id, GET_LOCK(id,0) FROM t1;
541ERROR 23000: Duplicate entry '1' for key 't2.PRIMARY'
542SELECT RELEASE_ALL_LOCKS();
543RELEASE_ALL_LOCKS()
5443
545SELECT * FROM t2;
546col1	col2
547DELETE FROM t1;
548DELETE FROM t2;
549INSERT INTO t1 VALUES(1),(1),(2);
550INSERT INTO t2 SELECT id, GET_LOCK(id,0) FROM t1;
551ERROR 23000: Duplicate entry '1' for key 't2.PRIMARY'
552SELECT RELEASE_ALL_LOCKS();
553RELEASE_ALL_LOCKS()
5542
555SELECT * FROM t2;
556col1	col2
557DROP TABLE t2;
558# FT-12.5: GET_LOCK in a statement having wrong syntax anyway.
559#          We get no lock because full syntax check comes first.
560SELECT GET_LOCK('test', 0) ORDER BY oscar;
561ERROR 42S22: Unknown column 'oscar' in 'order clause'
562SELECT RELEASE_ALL_LOCKS() = 0 AS expect_1;
563expect_1
5641
565# Cleanup.
566connection default;
567DROP TABLE t1;
568# FT-12.6: Mix of GET_LOCK and RELEASE*LOCK*
569#          Execution is from the left to the right.
570SELECT GET_LOCK('test', 0), RELEASE_LOCK('test');
571GET_LOCK('test', 0)	RELEASE_LOCK('test')
5721	1
573SELECT IS_FREE_LOCK('test') = 1 AS expect_1;
574expect_1
5751
576SELECT GET_LOCK('test', 0), RELEASE_LOCK('test'), GET_LOCK('test', 0);
577GET_LOCK('test', 0)	RELEASE_LOCK('test')	GET_LOCK('test', 0)
5781	1	1
579SELECT IS_FREE_LOCK('test') = 0 AS expect_1;
580expect_1
5811
582SELECT RELEASE_LOCK('test') = 1 AS expect_1;
583expect_1
5841
585SELECT GET_LOCK('test', 0), GET_LOCK('test1', 0), RELEASE_ALL_LOCKS(),
586GET_LOCK('test', 0);
587GET_LOCK('test', 0)	GET_LOCK('test1', 0)	RELEASE_ALL_LOCKS()	GET_LOCK('test', 0)
5881	1	2	1
589SELECT RELEASE_ALL_LOCKS() = 1 AS expect_1;
590expect_1
5911
592# FT-13: Check types of function results.
593CREATE TABLE t1 AS SELECT GET_LOCK('test', 0) AS g, RELEASE_LOCK('test') AS r,
594RELEASE_ALL_LOCKS() AS ra, IS_USED_LOCK('test') AS isu,
595IS_FREE_LOCK('test') AS isf;
596DESCRIBE t1;
597Field	Type	Null	Key	Default	Extra
598g	int	YES		NULL
599r	int	YES		NULL
600ra	bigint unsigned	NO		0
601isu	bigint unsigned	YES		NULL
602isf	int	YES		NULL
603DROP TABLE t1;
604# FT-14: Check the handling of user-level lock related function parameters.
605# FT-14.1: Lock names with NULL or "" assigned.
606SELECT GET_LOCK(NULL, 0);
607ERROR 42000: Incorrect user-level lock name 'NULL'.
608SELECT GET_LOCK("", 0);
609ERROR 42000: Incorrect user-level lock name ''.
610SELECT RELEASE_LOCK(NULL);
611ERROR 42000: Incorrect user-level lock name 'NULL'.
612SELECT RELEASE_LOCK("");
613ERROR 42000: Incorrect user-level lock name ''.
614SELECT IS_USED_LOCK(NULL);
615ERROR 42000: Incorrect user-level lock name 'NULL'.
616SELECT IS_USED_LOCK("");
617ERROR 42000: Incorrect user-level lock name ''.
618SELECT IS_FREE_LOCK(NULL);
619ERROR 42000: Incorrect user-level lock name 'NULL'.
620SELECT IS_FREE_LOCK("");
621ERROR 42000: Incorrect user-level lock name ''.
622# FT-14.2: Length of lock name at the limit of 64.
623SELECT GET_LOCK(REPEAT('a', 64), 0) = 1 AS expect_1;
624expect_1
6251
626SELECT IS_USED_LOCK(REPEAT('a', 64)) = CONNECTION_ID() AS expect_1;
627expect_1
6281
629SELECT IS_FREE_LOCK(REPEAT('a', 64)) = 0 AS expect_1;
630expect_1
6311
632SELECT RELEASE_LOCK(REPEAT('a', 64)) = 1 AS expect_1;
633expect_1
6341
635# FT-14.3: Lock name too long.
636SELECT GET_LOCK(REPEAT('a', 65), 0);
637ERROR 42000: Incorrect user-level lock name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
638SELECT IS_USED_LOCK(REPEAT('a', 65));
639ERROR 42000: Incorrect user-level lock name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
640SELECT IS_FREE_LOCK(REPEAT('a', 65));
641ERROR 42000: Incorrect user-level lock name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
642SELECT RELEASE_LOCK(REPEAT('a', 65));
643ERROR 42000: Incorrect user-level lock name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
644# FT-14.4: Check that lock names are case-insensitive.
645SELECT GET_LOCK('A', 0);
646GET_LOCK('A', 0)
6471
648connection con1;
649SELECT GET_LOCK('a', 0);
650GET_LOCK('a', 0)
6510
652connection default;
653SELECT IS_USED_LOCK('a') = CONNECTION_ID();
654IS_USED_LOCK('a') = CONNECTION_ID()
6551
656SELECT IS_FREE_LOCK('a');
657IS_FREE_LOCK('a')
6580
659SELECT RELEASE_LOCK('a');
660RELEASE_LOCK('a')
6611
662# FT-14.5: Check that lock names are converted and compared in utf-8,
663# to do this use 'тест' in various encodings as lock name.
664SELECT GET_LOCK(_cp1251 0xf2e5f1f2, 0);
665GET_LOCK(_cp1251 0xf2e5f1f2, 0)
6661
667connection con1;
668SELECT GET_LOCK(_utf8 0xd182d0b5d181d182, 0);
669GET_LOCK(_utf8 0xd182d0b5d181d182, 0)
6700
671Warnings:
672Warning	3719	'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.
673connection default;
674SELECT IS_USED_LOCK(_koi8r 0xd4c5d3d4) = CONNECTION_ID();
675IS_USED_LOCK(_koi8r 0xd4c5d3d4) = CONNECTION_ID()
6761
677SELECT IS_FREE_LOCK(_utf8 0xd182d0b5d181d182);
678IS_FREE_LOCK(_utf8 0xd182d0b5d181d182)
6790
680Warnings:
681Warning	3719	'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.
682SELECT RELEASE_LOCK(_utf8 0xd182d0b5d181d182);
683RELEASE_LOCK(_utf8 0xd182d0b5d181d182)
6841
685Warnings:
686Warning	3719	'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.
687# FT-14.6: Check wrong number of parameters.
688SELECT GET_LOCK('test');
689ERROR 42000: Incorrect parameter count in the call to native function 'GET_LOCK'
690SELECT GET_LOCK('test', 0, 1);
691ERROR 42000: Incorrect parameter count in the call to native function 'GET_LOCK'
692SELECT RELEASE_LOCK();
693ERROR 42000: Incorrect parameter count in the call to native function 'RELEASE_LOCK'
694SELECT RELEASE_LOCK('test', 1);
695ERROR 42000: Incorrect parameter count in the call to native function 'RELEASE_LOCK'
696SELECT RELEASE_ALL_LOCKS('test');
697ERROR 42000: Incorrect parameter count in the call to native function 'RELEASE_ALL_LOCKS'
698SELECT IS_USED_LOCK();
699ERROR 42000: Incorrect parameter count in the call to native function 'IS_USED_LOCK'
700SELECT IS_USED_LOCK('test', 'test2');
701ERROR 42000: Incorrect parameter count in the call to native function 'IS_USED_LOCK'
702SELECT IS_FREE_LOCK();
703ERROR 42000: Incorrect parameter count in the call to native function 'IS_FREE_LOCK'
704SELECT IS_FREE_LOCK('test', 'test2');
705ERROR 42000: Incorrect parameter count in the call to native function 'IS_FREE_LOCK'
706# FT-14.7: NULL timeout is interpreted as 0 timeout.
707connection con1;
708SELECT GET_LOCK("test", 0);
709GET_LOCK("test", 0)
7101
711connection default;
712#        Interpretation as 0 leads to use of send/reap is not required.
713SELECT GET_LOCK("test", NULL) = 0 AS expect_1;
714expect_1
7151
716connection con1;
717SELECT RELEASE_LOCK("test");
718RELEASE_LOCK("test")
7191
720connection default;
721# FT-14.8: Check that a negative timeout is interpreted as infinite wait.
722#         Test case for
723#         BUG#11764049 GET_LOCK() TIMEOUT BEHAVES DIFFERENTLY ON
724#                      DIFFERING PLATFORMS
725connection default;
726SELECT GET_LOCK('test', 0);
727GET_LOCK('test', 0)
7281
729connection con1;
730# Send statement and reap result later.
731SELECT GET_LOCK('test', -1);
732connection default;
733SELECT RELEASE_LOCK('test');
734RELEASE_LOCK('test')
7351
736connection con1;
737# Reap result of "SELECT GET_LOCK('test', -1)".
738GET_LOCK('test', -1)
7391
740SELECT RELEASE_LOCK('test');
741RELEASE_LOCK('test')
7421
743disconnect con1;
744connection default;
745CREATE TABLE t1 (conn CHAR(7), connection_id INT);
746INSERT INTO t1 VALUES ('default', CONNECTION_ID());
747SELECT GET_LOCK('bug16501',600);
748GET_LOCK('bug16501',600)
7491
750connect  con1,localhost,root,,;
751INSERT INTO t1 VALUES ('con1', CONNECTION_ID());
752SELECT IS_USED_LOCK('bug16501') = connection_id
753FROM t1
754WHERE conn = 'default';
755IS_USED_LOCK('bug16501') = connection_id
7561
757# Send statement and reap result later.
758SELECT GET_LOCK('bug16501',600);
759connection default;
760SELECT IS_USED_LOCK('bug16501') = CONNECTION_ID();
761IS_USED_LOCK('bug16501') = CONNECTION_ID()
7621
763SELECT RELEASE_LOCK('bug16501');
764RELEASE_LOCK('bug16501')
7651
766connection con1;
767# Reap result of "SELECT GET_LOCK('bug16501',600)".
768GET_LOCK('bug16501',600)
7691
770connection default;
771SELECT IS_USED_LOCK('bug16501') = connection_id
772FROM t1
773WHERE conn = 'con1';
774IS_USED_LOCK('bug16501') = connection_id
7751
776connection con1;
777SELECT IS_USED_LOCK('bug16501') = CONNECTION_ID();
778IS_USED_LOCK('bug16501') = CONNECTION_ID()
7791
780SELECT RELEASE_LOCK('bug16501');
781RELEASE_LOCK('bug16501')
7821
783SELECT IS_USED_LOCK('bug16501');
784IS_USED_LOCK('bug16501')
785NULL
786connection default;
787SELECT RELEASE_ALL_LOCKS();
788RELEASE_ALL_LOCKS()
7890
790DROP TABLE t1;
791connection con1;
792disconnect con1;
793connection default;
794#
795# Bug#20031761 ASSERTION `SCALE >= 0 && PRECISION > 0 &&
796#              SCALE <= PRECISION' FAILED
797#
798SET @@session.div_precision_increment=0;
799select * from(SELECT MIN(GET_LOCK(0,0) / 1 ^ 0)) as a;
800MIN(GET_LOCK(0,0) / 1 ^ 0)
8011
802select * from(SELECT MAX(RELEASE_LOCK(0) / 1 ^ 0)) as a;
803MAX(RELEASE_LOCK(0) / 1 ^ 0)
8041
805select * from(SELECT MAX(RELEASE_ALL_LOCKS() / 1 ^ 0)) as a;
806MAX(RELEASE_ALL_LOCKS() / 1 ^ 0)
8070
808SET @@session.div_precision_increment=default;
809#
810# End of tests
811#
812