Skip to content

Commit

Permalink
MDEV-11379, MDEV-11388 - [WAIT n|NOWAIT]
Browse files Browse the repository at this point in the history
Extended syntax so that it is now possible to set lock_wait_timeout for the
following statements:
SELECT ... FOR UPDATE [WAIT n|NOWAIT]
SELECT ... LOCK IN SHARED MODE [WAIT n|NOWAIT]
LOCK TABLE ... [WAIT n|NOWAIT]
CREATE ... INDEX ON tbl_name (index_col_name, ...) [WAIT n|NOWAIT] ...
ALTER TABLE tbl_name [WAIT n|NOWAIT] ...
OPTIMIZE TABLE tbl_name [WAIT n|NOWAIT]
DROP INDEX ... [WAIT n|NOWAIT]
TRUNCATE TABLE tbl_name [WAIT n|NOWAIT]
RENAME TABLE tbl_name [WAIT n|NOWAIT] ...
DROP TABLE tbl_name [WAIT n|NOWAIT] ...

Valid range of lock_wait_timeout and innodb_lock_wait_timeout was extended so
that 0 is acceptable value (means no wait).

This is amended AliSQL patch. We prefer Oracle syntax for [WAIT n|NOWAIT]
instead of original [WAIT [n]|NO_WAIT].
  • Loading branch information
Sergey Vojtovich committed Mar 22, 2017
1 parent 4c6ae99 commit 8026cd6
Show file tree
Hide file tree
Showing 22 changed files with 369 additions and 73 deletions.
67 changes: 67 additions & 0 deletions mysql-test/r/timeout.result
@@ -0,0 +1,67 @@
#
# MDEV-11379 - AliSQL: [Feature] Issue#8: SELECT FOR UPDATE WAIT
# MDEV-11388 - AliSQL: [Feature] Issue#15 DDL FAST FAIL
#
CREATE TABLE t1(a INT, b TEXT, c MULTIPOLYGON NOT NULL);
CREATE INDEX i1 ON t1(a) WAIT 1;
CREATE FULLTEXT INDEX i2 ON t1(b) WAIT 1;
CREATE SPATIAL INDEX i3 ON t1(c) WAIT 1;
ALTER TABLE t1 WAIT 1 COMMENT='test';
OPTIMIZE TABLE t1 WAIT 1;
Table Op Msg_type Msg_text
test.t1 optimize status OK
DROP INDEX i1 ON t1 WAIT 1;
TRUNCATE TABLE t1 WAIT 1;
RENAME TABLE t1 WAIT 1 TO t2;
RENAME TABLE t2 NOWAIT TO t1;
connect con1, localhost, root,,;
LOCK TABLE t1 WRITE WAIT 31536001;
Warnings:
Warning 1292 Truncated incorrect lock_wait_timeout value: '31536001'
connection default;
CREATE INDEX i1 ON t1(a) WAIT 0;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
CREATE INDEX i1 ON t1(a) NOWAIT;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
CREATE FULLTEXT INDEX i2 ON t1(b) WAIT 0;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
CREATE FULLTEXT INDEX i2 ON t1(b) NOWAIT;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
CREATE SPATIAL INDEX i3 ON t1(c) WAIT 0;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
CREATE SPATIAL INDEX i3 ON t1(c) NOWAIT;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
ALTER TABLE t1 WAIT 0 COMMENT='test';
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
ALTER TABLE t1 NOWAIT COMMENT='test';
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
OPTIMIZE TABLE t1 WAIT 0;
Table Op Msg_type Msg_text
test.t1 optimize Error Lock wait timeout exceeded; try restarting transaction
test.t1 optimize status Operation failed
OPTIMIZE TABLE t1 NOWAIT;
Table Op Msg_type Msg_text
test.t1 optimize Error Lock wait timeout exceeded; try restarting transaction
test.t1 optimize status Operation failed
DROP INDEX i1 ON t1 WAIT 0;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
DROP INDEX i1 ON t1 NOWAIT;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
TRUNCATE TABLE t1 WAIT 0;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
TRUNCATE TABLE t1 NOWAIT;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
RENAME TABLE t1 WAIT 0 TO t2;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
RENAME TABLE t1 NOWAIT TO t2;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
DROP TABLE t1 WAIT 0;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
DROP TABLE t1 NOWAIT;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
LOCK TABLE t1 WRITE WAIT 0;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
LOCK TABLE t1 WRITE NOWAIT;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
disconnect con1;
DROP TABLE t1 WAIT 1;
60 changes: 60 additions & 0 deletions mysql-test/suite/innodb/r/innodb-timeout.result
Expand Up @@ -57,3 +57,63 @@ disconnect a;
connection default;
drop table t1;
set global innodb_lock_wait_timeout=<initial_timeout>;
#
# MDEV-11379 - AliSQL: [Feature] Issue#8: SELECT FOR UPDATE WAIT
#
CREATE TABLE t1 (c1 INT, c2 INT) ENGINE=InnoDB;
INSERT INTO t1 (c1,c2) values (1,1),(2,2),(3,3),(4,4);
CREATE VIEW v1 AS SELECT * FROM t1 WHERE c1=4 FOR UPDATE NOWAIT;
ERROR HY000: View's SELECT contains a '[NO]WAIT' clause
CREATE VIEW v1 AS SELECT * FROM t1 WHERE c1=4 FOR UPDATE WAIT 0;
ERROR HY000: View's SELECT contains a '[NO]WAIT' clause
CREATE PROCEDURE p1() SELECT * FROM t1 WHERE c1=4 FOR UPDATE NOWAIT;
ERROR 0A000: [NO]WAIT is not allowed in stored procedures
CREATE PROCEDURE p1() SELECT * FROM t1 WHERE c1=4 FOR UPDATE WAIT 0;
ERROR 0A000: [NO]WAIT is not allowed in stored procedures
connect con1,localhost,root,,;
LOCK TABLE t1 WRITE;
connect con2,localhost,root,,;
SELECT * FROM t1 WHERE c1=4 FOR UPDATE NOWAIT;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
SELECT * FROM t1 WHERE c1=4 FOR UPDATE WAIT 0;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
PREPARE stmt FROM 'SELECT * FROM t1 WHERE c1=4 FOR UPDATE NOWAIT';
EXECUTE stmt;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
DEALLOCATE PREPARE stmt;
PREPARE stmt FROM 'SELECT * FROM t1 WHERE c1=4 FOR UPDATE WAIT 0';
EXECUTE stmt;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
DEALLOCATE PREPARE stmt;
connection con1;
INSERT INTO t1 VALUES(5,5);
UNLOCK TABLES;
set AUTOCOMMIT=0;
SELECT * FROM t1 WHERE c1=4 FOR UPDATE;
connection con2;
set AUTOCOMMIT=0;
SET INNODB_LOCK_WAIT_TIMEOUT=1;
SELECT * FROM t1 WHERE c1=4 FOR UPDATE;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
SELECT * FROM t1 WHERE c1=4 FOR UPDATE NOWAIT;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
SELECT * FROM t1 WHERE c1=4 FOR UPDATE WAIT 0;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
connection con1;
UPDATE t1 SET c2=5 WHERE c1=4;
COMMIT;
set AUTOCOMMIT=0;
SELECT * FROM t1 WHERE c1=4 FOR UPDATE;
c1 c2
4 5
connection con2;
set AUTOCOMMIT=0;
SET INNODB_LOCK_WAIT_TIMEOUT=1;
SELECT * FROM t1 WHERE c1=4 FOR UPDATE WAIT 10;
connection con1;
COMMIT;
connection con2;
disconnect con1;
disconnect con2;
connection default;
DROP TABLE t1;
83 changes: 83 additions & 0 deletions mysql-test/suite/innodb/t/innodb-timeout.test
@@ -1,3 +1,5 @@
# Save the initial number of concurrent sessions.
--source include/count_sessions.inc
--source include/have_innodb.inc

let $initial_timeout=`select @@innodb_lock_wait_timeout`;
Expand Down Expand Up @@ -115,3 +117,84 @@ connection default;
drop table t1;
--replace_result $initial_timeout <initial_timeout>
eval set global innodb_lock_wait_timeout=$initial_timeout;

--echo #
--echo # MDEV-11379 - AliSQL: [Feature] Issue#8: SELECT FOR UPDATE WAIT
--echo #
CREATE TABLE t1 (c1 INT, c2 INT) ENGINE=InnoDB;
INSERT INTO t1 (c1,c2) values (1,1),(2,2),(3,3),(4,4);

# Not supported in view/sp
--error ER_VIEW_SELECT_CLAUSE
CREATE VIEW v1 AS SELECT * FROM t1 WHERE c1=4 FOR UPDATE NOWAIT;
--error ER_VIEW_SELECT_CLAUSE
CREATE VIEW v1 AS SELECT * FROM t1 WHERE c1=4 FOR UPDATE WAIT 0;
--error ER_SP_BADSTATEMENT
CREATE PROCEDURE p1() SELECT * FROM t1 WHERE c1=4 FOR UPDATE NOWAIT;
--error ER_SP_BADSTATEMENT
CREATE PROCEDURE p1() SELECT * FROM t1 WHERE c1=4 FOR UPDATE WAIT 0;

connect(con1,localhost,root,,);
LOCK TABLE t1 WRITE;

connect(con2,localhost,root,,);
# The following statement should hang because con1 is locking the table
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t1 WHERE c1=4 FOR UPDATE NOWAIT;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t1 WHERE c1=4 FOR UPDATE WAIT 0;
PREPARE stmt FROM 'SELECT * FROM t1 WHERE c1=4 FOR UPDATE NOWAIT';
--error ER_LOCK_WAIT_TIMEOUT
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
PREPARE stmt FROM 'SELECT * FROM t1 WHERE c1=4 FOR UPDATE WAIT 0';
--error ER_LOCK_WAIT_TIMEOUT
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

connection con1;
INSERT INTO t1 VALUES(5,5);
UNLOCK TABLES;
set AUTOCOMMIT=0;
--disable_result_log
SELECT * FROM t1 WHERE c1=4 FOR UPDATE;
--enable_result_log

connection con2;
set AUTOCOMMIT=0;
SET INNODB_LOCK_WAIT_TIMEOUT=1;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t1 WHERE c1=4 FOR UPDATE;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t1 WHERE c1=4 FOR UPDATE NOWAIT;
--error ER_LOCK_WAIT_TIMEOUT
SELECT * FROM t1 WHERE c1=4 FOR UPDATE WAIT 0;

connection con1;
UPDATE t1 SET c2=5 WHERE c1=4;
COMMIT;
set AUTOCOMMIT=0;
SELECT * FROM t1 WHERE c1=4 FOR UPDATE;

connection con2;
set AUTOCOMMIT=0;
SET INNODB_LOCK_WAIT_TIMEOUT=1;
--send
--disable_result_log
SELECT * FROM t1 WHERE c1=4 FOR UPDATE WAIT 10;

connection con1;
COMMIT;

connection con2;
--reap


disconnect con1;
disconnect con2;

# clear
connection default;
DROP TABLE t1;

--source include/wait_until_count_sessions.inc
Expand Up @@ -99,7 +99,7 @@ Warnings:
Warning 1292 Truncated incorrect innodb_lock_wait_timeout value: '-1024'
SELECT @@global.innodb_lock_wait_timeout;
@@global.innodb_lock_wait_timeout
1
0
SET @@global.innodb_lock_wait_timeout=1073741825;
Warnings:
Warning 1292 Truncated incorrect innodb_lock_wait_timeout value: '1073741825'
Expand Down Expand Up @@ -131,7 +131,7 @@ Warnings:
Warning 1292 Truncated incorrect innodb_lock_wait_timeout value: '-1024'
SELECT @@session.innodb_lock_wait_timeout;
@@session.innodb_lock_wait_timeout
1
0
SET @@session.innodb_lock_wait_timeout=1073999999;
Warnings:
Warning 1292 Truncated incorrect innodb_lock_wait_timeout value: '1073999999'
Expand Down
16 changes: 5 additions & 11 deletions mysql-test/suite/sys_vars/r/lock_wait_timeout_basic.result
Expand Up @@ -54,17 +54,15 @@ SELECT @@session.lock_wait_timeout;
65535
'#------------------FN_DYNVARS_002_05-----------------------#'
SET @@global.lock_wait_timeout = 0;
Warnings:
Warning 1292 Truncated incorrect lock_wait_timeout value: '0'
SELECT @@global.lock_wait_timeout;
@@global.lock_wait_timeout
1
0
SET @@global.lock_wait_timeout = -1024;
Warnings:
Warning 1292 Truncated incorrect lock_wait_timeout value: '-1024'
SELECT @@global.lock_wait_timeout;
@@global.lock_wait_timeout
1
0
SET @@global.lock_wait_timeout = 31536001;
Warnings:
Warning 1292 Truncated incorrect lock_wait_timeout value: '31536001'
Expand All @@ -87,17 +85,15 @@ SELECT @@global.lock_wait_timeout;
@@global.lock_wait_timeout
31536000
SET @@session.lock_wait_timeout = 0;
Warnings:
Warning 1292 Truncated incorrect lock_wait_timeout value: '0'
SELECT @@session.lock_wait_timeout;
@@session.lock_wait_timeout
1
0
SET @@session.lock_wait_timeout = -2;
Warnings:
Warning 1292 Truncated incorrect lock_wait_timeout value: '-2'
SELECT @@session.lock_wait_timeout;
@@session.lock_wait_timeout
1
0
SET @@session.lock_wait_timeout = 31537000;
Warnings:
Warning 1292 Truncated incorrect lock_wait_timeout value: '31537000'
Expand Down Expand Up @@ -137,11 +133,9 @@ SELECT @@global.lock_wait_timeout;
@@global.lock_wait_timeout
1
SET @@global.lock_wait_timeout = FALSE;
Warnings:
Warning 1292 Truncated incorrect lock_wait_timeout value: '0'
SELECT @@global.lock_wait_timeout;
@@global.lock_wait_timeout
1
0
'#---------------------FN_DYNVARS_001_09----------------------#'
SET @@global.lock_wait_timeout = 10;
SET @@session.lock_wait_timeout = 11;
Expand Down
2 changes: 1 addition & 1 deletion mysql-test/suite/sys_vars/r/sysvars_innodb.result
Expand Up @@ -1386,7 +1386,7 @@ DEFAULT_VALUE 50
VARIABLE_SCOPE SESSION
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Timeout in seconds an InnoDB transaction may wait for a lock before being rolled back. Values above 100000000 disable the timeout.
NUMERIC_MIN_VALUE 1
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 1073741824
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
Expand Down
2 changes: 1 addition & 1 deletion mysql-test/suite/sys_vars/r/sysvars_server_embedded.result
Expand Up @@ -1599,7 +1599,7 @@ DEFAULT_VALUE 86400
VARIABLE_SCOPE SESSION
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Timeout in seconds to wait for a lock before returning an error.
NUMERIC_MIN_VALUE 1
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 31536000
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
Expand Down
Expand Up @@ -1725,7 +1725,7 @@ DEFAULT_VALUE 86400
VARIABLE_SCOPE SESSION
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT Timeout in seconds to wait for a lock before returning an error.
NUMERIC_MIN_VALUE 1
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 31536000
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
Expand Down
60 changes: 60 additions & 0 deletions mysql-test/t/timeout.test
@@ -0,0 +1,60 @@
--echo #
--echo # MDEV-11379 - AliSQL: [Feature] Issue#8: SELECT FOR UPDATE WAIT
--echo # MDEV-11388 - AliSQL: [Feature] Issue#15 DDL FAST FAIL
--echo #
CREATE TABLE t1(a INT, b TEXT, c MULTIPOLYGON NOT NULL);
CREATE INDEX i1 ON t1(a) WAIT 1;
CREATE FULLTEXT INDEX i2 ON t1(b) WAIT 1;
CREATE SPATIAL INDEX i3 ON t1(c) WAIT 1;
ALTER TABLE t1 WAIT 1 COMMENT='test';
OPTIMIZE TABLE t1 WAIT 1;
DROP INDEX i1 ON t1 WAIT 1;
TRUNCATE TABLE t1 WAIT 1;
RENAME TABLE t1 WAIT 1 TO t2;
RENAME TABLE t2 NOWAIT TO t1;

connect(con1, localhost, root,,);
LOCK TABLE t1 WRITE WAIT 31536001;

connection default;
--error ER_LOCK_WAIT_TIMEOUT
CREATE INDEX i1 ON t1(a) WAIT 0;
--error ER_LOCK_WAIT_TIMEOUT
CREATE INDEX i1 ON t1(a) NOWAIT;
--error ER_LOCK_WAIT_TIMEOUT
CREATE FULLTEXT INDEX i2 ON t1(b) WAIT 0;
--error ER_LOCK_WAIT_TIMEOUT
CREATE FULLTEXT INDEX i2 ON t1(b) NOWAIT;
--error ER_LOCK_WAIT_TIMEOUT
CREATE SPATIAL INDEX i3 ON t1(c) WAIT 0;
--error ER_LOCK_WAIT_TIMEOUT
CREATE SPATIAL INDEX i3 ON t1(c) NOWAIT;
--error ER_LOCK_WAIT_TIMEOUT
ALTER TABLE t1 WAIT 0 COMMENT='test';
--error ER_LOCK_WAIT_TIMEOUT
ALTER TABLE t1 NOWAIT COMMENT='test';
OPTIMIZE TABLE t1 WAIT 0;
OPTIMIZE TABLE t1 NOWAIT;
--error ER_LOCK_WAIT_TIMEOUT
DROP INDEX i1 ON t1 WAIT 0;
--error ER_LOCK_WAIT_TIMEOUT
DROP INDEX i1 ON t1 NOWAIT;
--error ER_LOCK_WAIT_TIMEOUT
TRUNCATE TABLE t1 WAIT 0;
--error ER_LOCK_WAIT_TIMEOUT
TRUNCATE TABLE t1 NOWAIT;
--error ER_LOCK_WAIT_TIMEOUT
RENAME TABLE t1 WAIT 0 TO t2;
--error ER_LOCK_WAIT_TIMEOUT
RENAME TABLE t1 NOWAIT TO t2;
--error ER_LOCK_WAIT_TIMEOUT
DROP TABLE t1 WAIT 0;
--error ER_LOCK_WAIT_TIMEOUT
DROP TABLE t1 NOWAIT;
--error ER_LOCK_WAIT_TIMEOUT
LOCK TABLE t1 WRITE WAIT 0;
--error ER_LOCK_WAIT_TIMEOUT
LOCK TABLE t1 WRITE NOWAIT;

disconnect con1;
DROP TABLE t1 WAIT 1;
1 change: 1 addition & 0 deletions sql/lex.h
Expand Up @@ -409,6 +409,7 @@ static SYMBOL symbols[] = {
{ "NEXT", SYM(NEXT_SYM)},
{ "NO", SYM(NO_SYM)},
{ "NO_WAIT", SYM(NO_WAIT_SYM)},
{ "NOWAIT", SYM(NOWAIT_SYM)},
{ "NODEGROUP", SYM(NODEGROUP_SYM)},
{ "NONE", SYM(NONE_SYM)},
{ "NOT", SYM(NOT_SYM)},
Expand Down

0 comments on commit 8026cd6

Please sign in to comment.