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