diff options
author | Ramil Kalimullin <ramil@mysql.com> | 2010-11-22 14:47:28 +0300 |
---|---|---|
committer | Ramil Kalimullin <ramil@mysql.com> | 2010-11-22 14:47:28 +0300 |
commit | bd557f04f644bda3b493c37225b169167eb6e11e (patch) | |
tree | 318334755d94aef3ee64545c0a4a566380f9162f /mysql-test/t | |
parent | 3bae49d64ce0df04a85583b5dc680cda54760dbc (diff) | |
parent | 9d9699209d9ca66648db8aff46f6b66a4c1c18de (diff) | |
download | mariadb-git-bd557f04f644bda3b493c37225b169167eb6e11e.tar.gz |
Manual merge from mysql-5.5-bugteam.
Diffstat (limited to 'mysql-test/t')
29 files changed, 3161 insertions, 338 deletions
diff --git a/mysql-test/t/change_user.test b/mysql-test/t/change_user.test index ed2e1d05f86..1879dbc53cf 100644 --- a/mysql-test/t/change_user.test +++ b/mysql-test/t/change_user.test @@ -117,7 +117,7 @@ let $before= query_get_value(SHOW GLOBAL STATUS LIKE 'com_select',Value,1); let $after= query_get_value(SHOW GLOBAL STATUS LIKE 'com_select',Value,1); -if (`select $after != $before`){ +if ($after != $before){ SHOW GLOBAL STATUS LIKE 'com_select'; die The value of com_select changed during change_user; } diff --git a/mysql-test/t/delayed.test b/mysql-test/t/delayed.test index 3a2bc982ad3..c47db78a11b 100644 --- a/mysql-test/t/delayed.test +++ b/mysql-test/t/delayed.test @@ -539,6 +539,21 @@ connection con1; --echo # Reaping: INSERT DELAYED INTO t1 VALUES (5) --reap +--echo # Connection default +connection default; + +--echo # Test 5: LOCK TABLES + INSERT DELAYED in one connection. +--echo # This test has triggered some asserts in metadata locking +--echo # subsystem at some point in time.. +LOCK TABLE t1 WRITE; +INSERT DELAYED INTO t2 VALUES (7); +UNLOCK TABLES; +SET AUTOCOMMIT= 0; +LOCK TABLE t1 WRITE; +INSERT DELAYED INTO t2 VALUES (8); +UNLOCK TABLES; +SET AUTOCOMMIT= 1; + --echo # Connection con2 connection con2; disconnect con2; diff --git a/mysql-test/t/disabled.def b/mysql-test/t/disabled.def index e1d4e4f80b5..d312254da19 100644 --- a/mysql-test/t/disabled.def +++ b/mysql-test/t/disabled.def @@ -9,7 +9,6 @@ # Do not use any TAB characters for whitespace. # ############################################################################## -kill : Bug#37780 2008-12-03 HHunger need some changes to be robust enough for pushbuild. lowercase_table3 : Bug#54845 2010-06-30 alik main.lowercase_table3 on Mac OSX query_cache_28249 : Bug#43861 2009-03-25 main.query_cache_28249 fails sporadically ctype_utf8mb4_ndb : Bug#55799, Bug#51907, disabled by Konstantin 2010-08-06 diff --git a/mysql-test/t/events_2.test b/mysql-test/t/events_2.test index 08412d2f5b0..3d609654b21 100644 --- a/mysql-test/t/events_2.test +++ b/mysql-test/t/events_2.test @@ -212,15 +212,15 @@ lock table t1 read; --replace_regex /STARTS '[^']+'/STARTS '#'/ show create event e1; select event_name from information_schema.events; ---error ER_TABLE_NOT_LOCKED +--error ER_LOCK_OR_ACTIVE_TRANSACTION create event e2 on schedule every 10 hour do select 1; ---error ER_TABLE_NOT_LOCKED +--error ER_LOCK_OR_ACTIVE_TRANSACTION alter event e2 disable; ---error ER_TABLE_NOT_LOCKED +--error ER_LOCK_OR_ACTIVE_TRANSACTION alter event e2 rename to e3; ---error ER_TABLE_NOT_LOCKED +--error ER_LOCK_OR_ACTIVE_TRANSACTION drop event e2; ---error ER_TABLE_NOT_LOCKED +--error ER_LOCK_OR_ACTIVE_TRANSACTION drop event e1; unlock tables; # @@ -229,15 +229,15 @@ lock table t1 write; --replace_regex /STARTS '[^']+'/STARTS '#'/ show create event e1; select event_name from information_schema.events; ---error ER_TABLE_NOT_LOCKED +--error ER_LOCK_OR_ACTIVE_TRANSACTION create event e2 on schedule every 10 hour do select 1; ---error ER_TABLE_NOT_LOCKED +--error ER_LOCK_OR_ACTIVE_TRANSACTION alter event e2 disable; ---error ER_TABLE_NOT_LOCKED +--error ER_LOCK_OR_ACTIVE_TRANSACTION alter event e2 rename to e3; ---error ER_TABLE_NOT_LOCKED +--error ER_LOCK_OR_ACTIVE_TRANSACTION drop event e2; ---error ER_TABLE_NOT_LOCKED +--error ER_LOCK_OR_ACTIVE_TRANSACTION drop event e1; unlock tables; # @@ -246,15 +246,15 @@ lock table t1 read, mysql.event read; --replace_regex /STARTS '[^']+'/STARTS '#'/ show create event e1; select event_name from information_schema.events; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_LOCK_OR_ACTIVE_TRANSACTION create event e2 on schedule every 10 hour do select 1; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_LOCK_OR_ACTIVE_TRANSACTION alter event e2 disable; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_LOCK_OR_ACTIVE_TRANSACTION alter event e2 rename to e3; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_LOCK_OR_ACTIVE_TRANSACTION drop event e2; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_LOCK_OR_ACTIVE_TRANSACTION drop event e1; unlock tables; # @@ -263,15 +263,15 @@ lock table t1 write, mysql.event read; --replace_regex /STARTS '[^']+'/STARTS '#'/ show create event e1; select event_name from information_schema.events; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_LOCK_OR_ACTIVE_TRANSACTION create event e2 on schedule every 10 hour do select 1; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_LOCK_OR_ACTIVE_TRANSACTION alter event e2 disable; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_LOCK_OR_ACTIVE_TRANSACTION alter event e2 rename to e3; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_LOCK_OR_ACTIVE_TRANSACTION drop event e2; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_LOCK_OR_ACTIVE_TRANSACTION drop event e1; unlock tables; # @@ -285,12 +285,18 @@ lock table mysql.event write; --replace_regex /STARTS '[^']+'/STARTS '#'/ show create event e1; select event_name from information_schema.events; +--error ER_LOCK_OR_ACTIVE_TRANSACTION create event e2 on schedule every 10 hour do select 1; +--error ER_LOCK_OR_ACTIVE_TRANSACTION alter event e2 disable; +--error ER_LOCK_OR_ACTIVE_TRANSACTION alter event e2 rename to e3; +--error ER_LOCK_OR_ACTIVE_TRANSACTION drop event e3; +--error ER_LOCK_OR_ACTIVE_TRANSACTION drop event e1; unlock tables; +drop event e1; --echo Make sure we have left no events select event_name from information_schema.events; --echo diff --git a/mysql-test/t/execution_constants.test b/mysql-test/t/execution_constants.test index e61d79f5249..92b1deb9921 100644 --- a/mysql-test/t/execution_constants.test +++ b/mysql-test/t/execution_constants.test @@ -49,7 +49,7 @@ while ($i) let $i = 1// # Check that mysql_errno is 1436 - if (`select $mysql_errno != 1436`) + if ($mysql_errno != 1436) { die Wrong error triggered, expected 1436 but got $mysql_errno// } diff --git a/mysql-test/t/fix_priv_tables.test b/mysql-test/t/fix_priv_tables.test index eeda9bc8d15..f68c8b518c8 100644 --- a/mysql-test/t/fix_priv_tables.test +++ b/mysql-test/t/fix_priv_tables.test @@ -3,7 +3,7 @@ # Don't run this test if $MYSQL_FIX_PRIVILEGE_TABLES isn't set # to the location of mysql_fix_privilege_tables.sql -if (`SELECT LENGTH("$MYSQL_FIX_PRIVILEGE_TABLES") <= 0`) +if (!$MYSQL_FIX_PRIVILEGE_TABLES) { skip Test need MYSQL_FIX_PRIVILEGE_TABLES; } diff --git a/mysql-test/t/flush.test b/mysql-test/t/flush.test index 1cafbe3e6bd..944c9c43019 100644 --- a/mysql-test/t/flush.test +++ b/mysql-test/t/flush.test @@ -577,3 +577,70 @@ select * from t1; select * from t2; unlock tables; drop tables tm, t1, t2; + + +--echo # +--echo # Test for bug #57006 "Deadlock between HANDLER and +--echo # FLUSH TABLES WITH READ LOCK". +--echo # +--disable_warnings +drop table if exists t1, t2; +--enable_warnings +connect (con1,localhost,root,,); +connect (con2,localhost,root,,); +connection default; +create table t1 (i int); +create table t2 (i int); +handler t1 open; + +--echo # Switching to connection 'con1'. +connection con1; +--echo # Sending: +--send flush tables with read lock + +--echo # Switching to connection 'con2'. +connection con2; +--echo # Wait until FTWRL starts waiting for 't1' to be closed. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for table flush" + and info = "flush tables with read lock"; +--source include/wait_condition.inc + +--echo # Switching to connection 'default'. +connection default; +--echo # The below statement should not cause deadlock. +--echo # Sending: +--send insert into t2 values (1) + +--echo # Switching to connection 'con2'. +connection con2; +--echo # Wait until INSERT starts to wait for FTWRL to go away. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for global read lock" + and info = "insert into t2 values (1)"; +--source include/wait_condition.inc + +--echo # Switching to connection 'con1'. +connection con1; +--echo # FTWRL should be able to continue now. +--echo # Reap FTWRL. +--reap +unlock tables; + +--echo # Switching to connection 'default'. +connection default; +--echo # Reap INSERT. +--reap +handler t1 close; + +--echo # Cleanup. +connection con1; +disconnect con1; +--source include/wait_until_disconnected.inc +connection con2; +disconnect con2; +--source include/wait_until_disconnected.inc +connection default; +drop tables t1, t2; diff --git a/mysql-test/t/flush_block_commit.test b/mysql-test/t/flush_block_commit.test index 0b3bede1684..90443dc9242 100644 --- a/mysql-test/t/flush_block_commit.test +++ b/mysql-test/t/flush_block_commit.test @@ -39,7 +39,7 @@ connection con2; --echo # Wait until COMMIT gets blocked. let $wait_condition= select count(*) = 1 from information_schema.processlist - where state = "Waiting for release of readlock" and info = "COMMIT"; + where state = "Waiting for commit lock" and info = "COMMIT"; --source include/wait_condition.inc --echo # Verify that 'con1' was blocked and data did not move. SELECT * FROM t1; diff --git a/mysql-test/t/flush_block_commit_notembedded.test b/mysql-test/t/flush_block_commit_notembedded.test index 7e3f4838ffb..fe9dbf7c19e 100644 --- a/mysql-test/t/flush_block_commit_notembedded.test +++ b/mysql-test/t/flush_block_commit_notembedded.test @@ -53,7 +53,7 @@ begin; connection con1; let $wait_condition= select count(*) = 1 from information_schema.processlist - where state = "Waiting for release of readlock" and + where state = "Waiting for global read lock" and info = "insert into t1 values (1)"; --source include/wait_condition.inc unlock tables; diff --git a/mysql-test/t/flush_read_lock.test b/mysql-test/t/flush_read_lock.test new file mode 100644 index 00000000000..dbb1dd7cb49 --- /dev/null +++ b/mysql-test/t/flush_read_lock.test @@ -0,0 +1,2190 @@ +# +# Test coverage for various aspects of FLUSH TABLES WITH READ LOCK +# functionality. +# + +# We need InnoDB for COMMIT/ROLLBACK related tests. +--source include/have_innodb.inc +# We need the Debug Sync Facility. +--source include/have_debug_sync.inc +# Parts of this test use DDL on events, BINLOG statement and +# other statements which are not supported in embedded server. +-- source include/not_embedded.inc +# Save the initial number of concurrent sessions. +--source include/count_sessions.inc + +--echo # FTWRL takes two global metadata locks -- a global shared +--echo # metadata lock and the commit blocker lock. +--echo # The first lock prevents DDL from taking place. +--echo # Let's say that all DDL statements that take metadata +--echo # locks form class #1 -- incompatible with FTWRL because +--echo # take incompatible MDL table locks. +--echo # The first global lock doesn't, however, prevent standalone +--echo # COMMITs (or implicit COMMITs) from taking place, since a +--echo # COMMIT doesn't take table locks. It doesn't prevent +--echo # DDL on temporary tables either, since they don't +--echo # take any table locks either. +--echo # Most DDL statements do not perform an implicit commit +--echo # if operate on a temporary table. Examples are CREATE +--echo # TEMPORARY TABLE and DROP TEMPORARY TABLE. +--echo # Thus, these DDL statements can go through in presence +--echo # of FTWRL. This is class #2 -- compatible because +--echo # do not take incompatible MDL locks and do not issue +--echo # implicit commit.. +--echo # (Although these operations do not commit, their effects +--echo # cannot be rolled back either.) +--echo # ALTER TABLE, ANALYZE, OPTIMIZE and some others always +--echo # issue an implicit commit, even if its argument is a +--echo # temporary table. +--echo # *Howewer* an implicit commit is a no-op if all engines +--echo # used since the start of transactiona are non- +--echo # transactional. Thus, for non-transactional engines, +--echo # these operations are not blocked by FTWRL. +--echo # This is class #3 -- compatible because do not take +--echo # MDL table locks and are non-transactional. +--echo # On the contrary, for transactional engines, there +--echo # is always a commit, regardless of whether a table +--echo # is temporary or not. Thus, for example, ALTER TABLE +--echo # for a transactional engine will wait for FTWRL, +--echo # even if the subject table is temporary. +--echo # Thus ALTER TABLE <temporary> is incompatible +--echo # with FTWRL. This is class #4 -- incompatible +--echo # becuase issue implicit COMMIT which is not a no-op. +--echo # Finally, there are administrative statements (such as +--echo # RESET SLAVE) that do not take any locks and do not +--echo # issue COMMIT. +--echo # This is class #5. +--echo # The goal of this coverage is to test statements +--echo # of all classes. +--echo # @todo: documents the effects of @@autocommit, +--echo # DML and temporary transactional tables. + +--echo # Use MyISAM engine for the most of the tables +--echo # used in this test in order to be able to +--echo # check that DDL statements on temporary tables +--echo # are compatible with FTRWL. +--disable_warnings +drop tables if exists t1_base, t2_base, t3_trans; +drop tables if exists tm_base, tm_base_temp; +drop database if exists mysqltest1; +--echo # We're going to test ALTER DATABASE UPGRADE +drop database if exists `#mysql50#mysqltest-2`; +drop procedure if exists p1; +drop function if exists f1; +drop view if exists v1; +drop procedure if exists p2; +drop function if exists f2_base; +drop function if exists f2_temp; +drop event if exists e1; +drop event if exists e2; +--enable_warnings +create table t1_base(i int) engine=myisam; +create table t2_base(j int) engine=myisam; +create table t3_trans(i int) engine=innodb; +create temporary table t1_temp(i int) engine=myisam; +create temporary table t2_temp(j int) engine=myisam; +create temporary table t3_temp_trans(i int) engine=innodb; +create database mysqltest1; +create database `#mysql50#mysqltest-2`; +create procedure p1() begin end; +create function f1() returns int return 0; +create view v1 as select 1 as i; +create procedure p2(i int) begin end; +delimiter |; +create function f2_base() returns int +begin + insert into t1_base values (1); + return 0; +end| +create function f2_temp() returns int +begin + insert into t1_temp values (1); + return 0; +end| +delimiter ;| +create event e1 on schedule every 1 minute do begin end; + +connect (con1,localhost,root,,); +connect (con2,localhost,root,,); +connect (con3,localhost,root,,); +connection default; + +--echo # +--echo # Test compatibility of FLUSH TABLES WITH READ LOCK +--echo # with various statements. +--echo # +--echo # These tests don't cover some classes of statements: +--echo # - Replication-related - CHANGE MASTER TO, START/STOP SLAVE and etc +--echo # (all compatible with FTWRL). +--echo # - Plugin-related - INSTALL/UNINSTALL (incompatible with FTWRL, +--echo # require plugin support). + +let $con_aux1=con1; +let $con_aux2=con2; +let $cleanup_stmt2= ; +let $skip_3rd_check= ; + +--echo # +--echo # 1) ALTER variants. +--echo # +--echo # 1.1) ALTER TABLE +--echo # +--echo # 1.1.a) For base table should be incompatible with FTWRL. +--echo # +let $statement= alter table t1_base add column c1 int; +let $cleanup_stmt1= alter table t1_base drop column c1; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 1.1.b) For a temporary table should be compatible with FTWRL. +--echo # +let $statement= alter table t1_temp add column c1 int; +let $cleanup_stmt= alter table t1_temp drop column c1; +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 1.2) ALTER DATABASE should be incompatible with FTWRL. +--echo # +let $statement= alter database mysqltest1 default character set utf8; +let $cleanup_stmt1= alter database mysqltest1 default character set latin1; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 1.3) ALTER DATABASE UPGRADE DATA DIRECTORY NAME should be +--echo # incompatible with FTWRL. +--echo # +let $statement= alter database `#mysql50#mysqltest-2` upgrade data directory name; +let $cleanup_stmt1= drop database `mysqltest-2`; +let $cleanup_stmt2= create database `#mysql50#mysqltest-2`; +--source include/check_ftwrl_incompatible.inc +let $cleanup_stmt2= ; + +--echo # +--echo # 1.4) ALTER PROCEDURE should be incompatible with FTWRL. +--echo # +let $statement= alter procedure p1 comment 'a'; +let $cleanup_stmt1= alter procedure p1 comment ''; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 1.5) ALTER FUNCTION should be incompatible with FTWRL. +--echo # +let $statement= alter function f1 comment 'a'; +let $cleanup_stmt1= alter function f1 comment ''; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 1.6) ALTER VIEW should be incompatible with FTWRL. +--echo # +let $statement= alter view v1 as select 2 as j; +let $cleanup_stmt1= alter view v1 as select 1 as i; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 1.7) ALTER EVENT should be incompatible with FTWRL. +--echo # +let $statement= alter event e1 comment 'test'; +let $cleanup_stmt1= alter event e1 comment ''; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 1.x) The rest of ALTER statements (ALTER TABLESPACE, +--echo # ALTER LOGFILE GROUP and ALTER SERVER) are too +--echo # special to be tested here. +--echo # + + +--echo # +--echo # 2) ANALYZE TABLE statement is compatible with FTWRL. +--echo # See Bug#43336 ANALYZE and OPTIMIZE do not honour +--echo # --read-only for a discussion why. +--echo # +let $statement= analyze table t1_base; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 3) BEGIN, ROLLBACK and COMMIT statements. +--echo # BEGIN and ROLLBACK are compatible with FTWRL. +--echo # COMMIT is not. +--echo # +--echo # We need a special test for these statements as +--echo # FTWRL commits a transaction and because COMMIT +--echo # is handled in a special way. +flush tables with read lock; +begin; +--echo # ROLLBACK is allowed under FTWRL although there +--echo # no much sense in it. FTWRL commits any previous +--echo # changes and doesn't allows any DML after it. +--echo # So such a ROLLBACK is always a no-op. +rollback; +--echo # Although COMMIT is incompatible with FTWRL in +--echo # other senses it is still allowed under FTWRL. +--echo # This fact relied upon by some versions of +--echo # innobackup tool. +--echo # Similarly to ROLLBACK it is a no-op in this situation. +commit; +unlock tables; +--echo # Check that BEGIN/ROLLBACK are not blocked and +--echo # COMMIT is blocked by active FTWRL in another +--echo # connection. +--echo # +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +begin; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +unlock tables; +--echo # Switching to connection 'default'. +connection default; +--echo # Do some work so ROLLBACK is not a no-op. +insert into t3_trans values (1); +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +rollback; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +unlock tables; +--echo # Switching to connection 'default'. +connection default; +begin; +--echo # Do some work so COMMIT is not a no-op. +insert into t3_trans values (1); +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +--echo # Send: +--send commit +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Wait until COMMIT is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for commit lock" and + info = "commit"; +--source include/wait_condition.inc +unlock tables; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap COMMIT. +--reap +delete from t3_trans; +--echo # +--echo # Check that COMMIT blocks FTWRL in another connection. +begin; +insert into t3_trans values (1); +set debug_sync='RESET'; +set debug_sync='ha_commit_trans_after_acquire_commit_lock SIGNAL parked WAIT_FOR go'; +--send commit +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +set debug_sync='now WAIT_FOR parked'; +--send flush tables with read lock +--echo # Switching to connection '$con_aux2'. +connection $con_aux2; +--echo # Wait until FTWRL is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for commit lock" and + info = "flush tables with read lock"; +--source include/wait_condition.inc +set debug_sync='now SIGNAL go'; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap COMMIT. +--reap +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Reap FTWRL. +--reap +unlock tables; +--echo # Switching to connection 'default'. +connection default; +delete from t3_trans; +set debug_sync= "RESET"; +--echo # We don't run similar test for BEGIN and ROLLBACK as +--echo # they release metadata locks in non-standard place. + + +--echo # +--echo # 4) BINLOG statement should be incompatible with FTWRL. +--echo # +--echo # +--echo # Provide format description BINLOG statement first. +BINLOG ' +MfmqTA8BAAAAZwAAAGsAAAABAAQANS41LjctbTMtZGVidWctbG9nAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAx+apMEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA== +'; +--echo # Now test compatibility for BINLOG statement which is +--echo # equivalent to INSERT INTO t1_base VALUES (1). +let $statement= BINLOG ' +MfmqTBMBAAAALgAAAN0AAAAAACgAAAAAAAEABHRlc3QAB3QxX2Jhc2UAAQMAAQ== +MfmqTBcBAAAAIgAAAP8AAAAAACgAAAAAAAEAAf/+AQAAAA== +'; +let $cleanup_stmt1= delete from t1_base where i = 1 limit 1; +--echo # Skip last part of compatibility testing as this statement +--echo # releases metadata locks in non-standard place. +let $skip_3rd_check= 1; +--source include/check_ftwrl_incompatible.inc +let $skip_3rd_check= ; + + +--echo # +--echo # 5) CALL statement. This statement uses resources in two +--echo # ways: through expressions used as parameters and through +--echo # sub-statements. This test covers only usage through +--echo # parameters as sub-statements do locking individually. +--echo # +--echo # 5.a) In simple cases a parameter expression should be +--echo # compatible with FTWRL. +let $statement= call p2((select count(*) from t1_base)); +let $cleanup_stmt1= ; +--echo # Skip last part of compatibility testing as this statement +--echo # releases metadata locks in non-standard place. +let $skip_3rd_check= 1; +--source include/check_ftwrl_compatible.inc +let $skip_3rd_check= ; + +--echo # +--echo # 5.b) In case when an expression uses function which updates +--echo # base tables CALL should be incompatible with FTWRL. +--echo # +let $statement= call p2(f2_base()); +let $cleanup_stmt1= ; +--echo # Skip last part of compatibility testing as this statement +--echo # releases metadata locks in non-standard place. +let $skip_3rd_check= 1; +--source include/check_ftwrl_incompatible.inc +let $skip_3rd_check= ; + +--echo # +--echo # 5.c) If function used as argument updates temporary tables +--echo # CALL statement should be compatible with FTWRL. +--echo # +let $statement= call p2(f2_temp()); +let $cleanup_stmt1= ; +--echo # Skip last part of compatibility testing as this statement +--echo # releases metadata locks in non-standard place. +let $skip_3rd_check= 1; +--source include/check_ftwrl_compatible.inc +let $skip_3rd_check= ; + + +--echo # +--echo # 6) CHECK TABLE statement is compatible with FTWRL. +--echo # +let $statement= check table t1_base; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + + +--echo # +--echo # 7) CHECKSUM TABLE statement is compatible with FTWRL. +--echo # +let $statement= checksum table t1_base; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + + +--echo # +--echo # 8) CREATE variants. +--echo # +--echo # 8.1) CREATE TABLE statement. +--echo # +--echo # 8.1.a) CREATE TABLE is incompatible with FTWRL when +--echo # base table is created. +let $statement= create table t3_base(i int); +let $cleanup_stmt1= drop table t3_base; +--source include/check_ftwrl_incompatible.inc + +--echo # 8.1.b) CREATE TABLE is compatible with FTWRL when +--echo # temporary table is created. +let $statement= create temporary table t3_temp(i int); +let $cleanup_stmt= drop temporary tables t3_temp; +--source include/check_ftwrl_compatible.inc + +--echo # 8.1.c) CREATE TABLE LIKE is incompatible with FTWRL when +--echo # base table is created. +let $statement= create table t3_base like t1_temp; +let $cleanup_stmt1= drop table t3_base; +--source include/check_ftwrl_incompatible.inc + +--echo # 8.1.d) CREATE TABLE LIKE is compatible with FTWRL when +--echo # temporary table is created. +let $statement= create temporary table t3_temp like t1_base; +let $cleanup_stmt= drop temporary table t3_temp; +--source include/check_ftwrl_compatible.inc + +--echo # 8.1.e) CREATE TABLE SELECT is incompatible with FTWRL when +--echo # base table is created. +let $statement= create table t3_base select 1 as i; +let $cleanup_stmt1= drop table t3_base; +--source include/check_ftwrl_incompatible.inc + +--echo # 8.1.f) CREATE TABLE SELECT is compatible with FTWRL when +--echo # temporary table is created. +let $statement= create temporary table t3_temp select 1 as i; +let $cleanup_stmt= drop temporary table t3_temp; +--source include/check_ftwrl_compatible.inc + +--echo # 8.2) CREATE INDEX statement. +--echo # +--echo # 8.2.a) CREATE INDEX is incompatible with FTWRL when +--echo # applied to base table. +let $statement= create index i on t1_base (i); +let $cleanup_stmt1= drop index i on t1_base; +--source include/check_ftwrl_incompatible.inc + +--echo # 8.2.b) CREATE INDEX is compatible with FTWRL when +--echo # applied to temporary table. +let $statement= create index i on t1_temp (i); +let $cleanup_stmt= drop index i on t1_temp; +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 8.3) CREATE DATABASE is incompatible with FTWRL. +--echo # +let $statement= create database mysqltest2; +let $cleanup_stmt1= drop database mysqltest2; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 8.4) CREATE VIEW is incompatible with FTWRL. +--echo # +let $statement= create view v2 as select 1 as j; +let $cleanup_stmt1= drop view v2; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 8.5) CREATE TRIGGER is incompatible with FTWRL. +--echo # +let $statement= create trigger t1_bi before insert on t1_base for each row begin end; +let $cleanup_stmt1= drop trigger t1_bi; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 8.6) CREATE FUNCTION is incompatible with FTWRL. +--echo # +let $statement= create function f2() returns int return 0; +let $cleanup_stmt1= drop function f2; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 8.7) CREATE PROCEDURE is incompatible with FTWRL. +--echo # +let $statement= create procedure p3() begin end; +let $cleanup_stmt1= drop procedure p3; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 8.8) CREATE EVENT should be incompatible with FTWRL. +--echo # +let $statement= create event e2 on schedule every 1 minute do begin end; +let $cleanup_stmt1= drop event e2; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 8.9) CREATE USER should be incompatible with FTWRL. +--echo # +let $statement= create user mysqltest_u1; +let $cleanup_stmt1= drop user mysqltest_u1; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 8.x) The rest of CREATE variants (CREATE LOGFILE GROUP, +--echo # CREATE TABLESPACE and CREATE SERVER) are too special +--echo # to test here. +--echo # + + +--echo # +--echo # 9) PREPARE, EXECUTE and DEALLOCATE PREPARE statements. +--echo # +--echo # 9.1) PREPARE statement is compatible with FTWRL as it +--echo # doesn't change any data. +--echo # +--echo # 9.1.a) Prepare of simple INSERT statement. +--echo # +let $statement= prepare stmt1 from 'insert into t1_base values (1)'; +let $cleanup_stmt= deallocate prepare stmt1; +--echo # Skip last part of compatibility testing as this statement +--echo # releases metadata locks in non-standard place. +let $skip_3rd_check= 1; +--source include/check_ftwrl_compatible.inc +let $skip_3rd_check= ; + +--echo # +--echo # 9.1.b) Prepare of multi-UPDATE. At some point such statements +--echo # tried to acquire thr_lock.c locks during prepare phase. +--echo # This no longer happens and thus it is compatible with +--echo # FTWRL. +let $statement= prepare stmt1 from 'update t1_base, t2_base set t1_base.i= 1 where t1_base.i = t2_base.j'; +let $cleanup_stmt= deallocate prepare stmt1; +--echo # Skip last part of compatibility testing as this statement +--echo # releases metadata locks in non-standard place. +let $skip_3rd_check= 1; +--source include/check_ftwrl_compatible.inc +let $skip_3rd_check= ; + +--echo # +--echo # 9.1.c) Prepare of multi-DELETE. Again PREPARE of such +--echo # statement should be compatible with FTWRL. +let $statement= prepare stmt1 from 'delete t1_base from t1_base, t2_base where t1_base.i = t2_base.j'; +let $cleanup_stmt= deallocate prepare stmt1; +--echo # Skip last part of compatibility testing as this statement +--echo # releases metadata locks in non-standard place. +let $skip_3rd_check= 1; +--source include/check_ftwrl_compatible.inc +let $skip_3rd_check= ; + +--echo # +--echo # 9.2) Compatibility of EXECUTE statement depends on statement +--echo # to be executed. +--echo # +--echo # 9.2.a) EXECUTE for statement which is itself compatible with +--echo # FTWRL should be compatible. +prepare stmt1 from 'select * from t1_base'; +let $statement= execute stmt1; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc +deallocate prepare stmt1; + +--echo # +--echo # 9.2.b) EXECUTE for statement which is incompatible with FTWRL +--echo # should be also incompatible. +--echo # +--echo # Check that EXECUTE is not allowed under FTWRL. +prepare stmt1 from 'insert into t1_base values (1)'; +flush tables with read lock; +--error ER_CANT_UPDATE_WITH_READLOCK +execute stmt1; +unlock tables; +--echo # Check that active FTWRL in another connection +--echo # blocks EXECUTE which changes data. +--echo # +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +--send execute stmt1 +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Check that EXECUTE is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for global read lock" and + info = "insert into t1_base values (1)"; +--source include/wait_condition.inc +unlock tables; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap EXECUTE. +--reap +set debug_sync='RESET'; +set debug_sync='execute_command_after_close_tables SIGNAL parked WAIT_FOR go'; +--send execute stmt1; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +set debug_sync='now WAIT_FOR parked'; +--send flush tables with read lock +--echo # Switching to connection '$con_aux2'. +connection $con_aux2; +--echo # Wait until FTWRL is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for global read lock" and + info = "flush tables with read lock"; +--source include/wait_condition.inc +set debug_sync='now SIGNAL go'; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap EXECUTE. +--reap +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Reap FTWRL. +--reap +unlock tables; +--echo # Switching to connection 'default'. +connection default; +set debug_sync= "RESET"; +delete from t1_base; +deallocate prepare stmt1; + +--echo # +--echo # 9.3) DEALLOCATE PREPARE is compatible with FTWRL. +--echo # +prepare stmt1 from 'insert into t1_base values (1)'; +let $statement= deallocate prepare stmt1; +let $cleanup_stmt= prepare stmt1 from 'insert into t1_base values (1)'; +--source include/check_ftwrl_compatible.inc +deallocate prepare stmt1; + + +--echo # +--echo # 10) DELETE variations. +--echo # +--echo # 10.1) Simple DELETE. +--echo # +--echo # 10.1.a) Simple DELETE on base table is incompatible with FTWRL. +let $statement= delete from t1_base; +let $cleanup_stmt1= ; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 10.1.b) Simple DELETE on temporary table is compatible with FTWRL. +let $statement= delete from t1_temp; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 10.2) Multi DELETE. +--echo # +--echo # 10.2.a) Multi DELETE on base tables is incompatible with FTWRL. +let $statement= delete t1_base from t1_base, t2_base where t1_base.i = t2_base.j; +let $cleanup_stmt1= ; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 10.2.b) Multi DELETE on temporary tables is compatible with FTWRL. +let $statement= delete t1_temp from t1_temp, t2_temp where t1_temp.i = t2_temp.j; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + + +--echo # +--echo # 11) DESCRIBE should be compatible with FTWRL. +--echo # +let $statement= describe t1_base; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + + +--echo # +--echo # 12) Compatibility of DO statement with FTWRL depends on its +--echo # expression. +--echo # +--echo # 12.a) DO with expression which does not change base table +--echo # should be compatible with FTWRL. +let $statement= do (select count(*) from t1_base); +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 12.b) DO which calls SF updating base table should be +--echo # incompatible with FTWRL. +let $statement= do f2_base(); +let $cleanup_stmt1= delete from t1_base limit 1; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 12.c) DO which calls SF updating temporary table should be +--echo # compatible with FTWRL. +let $statement= do f2_temp(); +let $cleanup_stmt= delete from t1_temp limit 1; +--source include/check_ftwrl_compatible.inc + + +--echo # +--echo # 13) DROP variants. +--echo # +--echo # 13.1) DROP TABLES. +--echo # +--echo # 13.1.a) DROP TABLES which affects base tables is incompatible +--echo # with FTWRL. +let $statement= drop table t2_base; +let $cleanup_stmt1= create table t2_base(j int); +--source include/check_ftwrl_incompatible.inc + +--echo # 13.1.b) DROP TABLES which affects only temporary tables +--echo # in theory can be compatible with FTWRL. +--echo # In practice it is not yet. +let $statement= drop table t2_temp; +let $cleanup_stmt1= create temporary table t2_temp(j int); +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 13.1.c) DROP TEMPORARY TABLES should be compatible with FTWRL. +let $statement= drop temporary table t2_temp; +let $cleanup_stmt= create temporary table t2_temp(j int); +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 13.2) DROP INDEX. +--echo # +--echo # 13.2.a) DROP INDEX on a base table is incompatible with FTWRL. +create index i on t1_base (i); +let $statement= drop index i on t1_base; +let $cleanup_stmt1= create index i on t1_base (i); +--source include/check_ftwrl_incompatible.inc +drop index i on t1_base; + +--echo # +--echo # 13.2.b) DROP INDEX on a temporary table is compatible with FTWRL. +create index i on t1_temp (i); +let $statement= drop index i on t1_temp; +let $cleanup_stmt= create index i on t1_temp (i); +--source include/check_ftwrl_compatible.inc +drop index i on t1_temp; + +--echo # +--echo # 13.3) DROP DATABASE is incompatible with FTWRL +--echo # +let $statement= drop database mysqltest1; +let $cleanup_stmt1= create database mysqltest1; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 13.4) DROP FUNCTION is incompatible with FTWRL. +--echo # +let $statement= drop function f1; +let $cleanup_stmt1= create function f1() returns int return 0; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 13.5) DROP PROCEDURE is incompatible with FTWRL. +--echo # +let $statement= drop procedure p1; +let $cleanup_stmt1= create procedure p1() begin end; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 13.6) DROP USER should be incompatible with FTWRL. +--echo # +create user mysqltest_u1; +let $statement= drop user mysqltest_u1; +let $cleanup_stmt1= create user mysqltest_u1; +--source include/check_ftwrl_incompatible.inc +drop user mysqltest_u1; + +--echo # +--echo # 13.7) DROP VIEW should be incompatible with FTWRL. +--echo # +let $statement= drop view v1; +let $cleanup_stmt1= create view v1 as select 1 as i; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 13.8) DROP EVENT should be incompatible with FTWRL. +--echo # +let $statement= drop event e1; +let $cleanup_stmt1= create event e1 on schedule every 1 minute do begin end; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 13.9) DROP TRIGGER is incompatible with FTWRL. +--echo # +create trigger t1_bi before insert on t1_base for each row begin end; +let $statement= drop trigger t1_bi; +let $cleanup_stmt1= create trigger t1_bi before insert on t1_base for each row begin end; +--source include/check_ftwrl_incompatible.inc +drop trigger t1_bi; + +--echo # +--echo # 13.x) The rest of DROP variants (DROP TABLESPACE, DROP LOGFILE +--echo # GROUP and DROP SERVER) are too special to test here. +--echo # + + +--echo # +--echo # 14) FLUSH variants. +--echo # +--echo # Test compatibility of _some_ important FLUSH variants with FTWRL. +--echo # +--echo # 14.1) FLUSH TABLES WITH READ LOCK is compatible with itself. +--echo # +--echo # Check that FTWRL statements can be run while FTWRL +--echo # is active in another connection. +--echo # +--echo # Switching to connection '$con_aux1'. +flush tables with read lock; +--echo # The second FTWRL in a row is allowed at the moment. +--echo # It does not make much sense as it does only flush. +flush tables with read lock; +unlock tables; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +flush tables with read lock; +unlock tables; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +unlock tables; +--echo # Switching to connection 'default'. +connection default; + +--echo # +--echo # 14.2) FLUSH TABLES <list> WITH READ LOCK is not blocked by +--echo # active FTWRL. But since the latter keeps tables open +--echo # FTWRL is blocked by FLUSH TABLES <list> WITH READ LOCK. +flush tables with read lock; +--echo # FT <list> WRL is allowed under FTWRL at the moment. +--echo # It does not make much sense though. +flush tables t1_base, t2_base with read lock; +unlock tables; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +flush tables t1_base, t2_base with read lock; +unlock tables; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +unlock tables; +--echo # Switching to connection 'default'. +connection default; +flush tables t1_base, t2_base with read lock; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--send flush tables with read lock +--echo # Switching to connection '$con_aux2'. +connection $con_aux2; +--echo # Wait until FTWRL is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for table flush" and + info = "flush tables with read lock"; +--source include/wait_condition.inc +--echo # Switching to connection 'default'. +connection default; +unlock tables; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Reap FTWRL. +--reap +unlock tables; +--echo # Switching to connection 'default'. +connection default; + + +--echo # +--echo # 14.3) FLUSH TABLES is compatible with FTWRL. +let $statement= flush tables; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 14.4) FLUSH TABLES <list> is compatible with FTWRL. +let $statement= flush table t1_base, t2_base; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 14.5) FLUSH PRIVILEGES is compatible with FTWRL. +let $statement= flush privileges; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + + +--echo # +--echo # 15) GRANT statement should be incompatible with FTWRL. +--echo # +let $statement= grant all privileges on t1_base to mysqltest_u1; +let $cleanup_stmt1= revoke all privileges on t1_base from mysqltest_u1; +--source include/check_ftwrl_incompatible.inc +drop user mysqltest_u1; + + +--echo # +--echo # 16) All HANDLER variants are half-compatible with FTWRL. +--echo # I.e. they are not blocked by active FTWRL. But since open +--echo # HANDLER means open table instance FTWRL is blocked while +--echo # HANDLER is not closed. +--echo # +--echo # Check that HANDLER statements succeed under FTWRL. +flush tables with read lock; +handler t1_base open; +handler t1_base read first; +handler t1_base close; +unlock tables; +--echo # Check that HANDLER statements can be run while FTWRL +--echo # is active in another connection. +--echo # +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +handler t1_base open; +handler t1_base read first; +handler t1_base close; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +unlock tables; +--echo # Switching to connection 'default'. +connection default; + + +--echo # +--echo # 17) HELP statement is compatible with FTWRL. +--echo # +let $statement= help no_such_topic; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + + +--echo # +--echo # 18) INSERT statement. +--echo # +--echo # 18.a) Ordinary INSERT into base table is incompatible with FTWRL. +let $statement= insert into t1_base values (1); +let $cleanup_stmt1= delete from t1_base limit 1; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 18.b) Ordinary INSERT into temp table is compatible with FTWRL. +let $statement= insert into t1_temp values (1); +let $cleanup_stmt= delete from t1_temp limit 1; +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 18.c) INSERT DELAYED is incompatible with FTWRL. +let $statement= insert delayed into t1_base values (1); +let $cleanup_stmt1= ; +--source include/check_ftwrl_incompatible.inc +delete from t1_base; + +--echo # +--echo # 18.d) INSERT SELECT into base table is incompatible with FTWRL. +let $statement= insert into t1_base select * from t1_temp; +let $cleanup_stmt1= ; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 18.e) INSERT SELECT into temp table is compatible with FTWRL. +let $statement= insert into t1_temp select * from t1_base; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + + +--echo # +--echo # 19) KILL statement is compatible with FTWRL. +--echo # +--echo # Check that KILL can be run under FTWRL. +flush tables with read lock; +set @id:= connection_id(); +--error ER_QUERY_INTERRUPTED +kill query @id; +unlock tables; +--echo # Check that KILL statements can be run while FTWRL +--echo # is active in another connection. +--echo # +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +--error ER_QUERY_INTERRUPTED +kill query @id; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +unlock tables; +--echo # Switching to connection 'default'. +connection default; +--echo # Finally check that KILL doesn't block FTWRL +set debug_sync='RESET'; +set debug_sync='execute_command_after_close_tables SIGNAL parked WAIT_FOR go'; +--send kill query @id +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +set debug_sync='now WAIT_FOR parked'; +flush tables with read lock; +unlock tables; +set debug_sync='now SIGNAL go'; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap KILL. +--error ER_QUERY_INTERRUPTED +--reap +set debug_sync='RESET'; + + +--echo # +--echo # 20) LOAD DATA statement. +--echo # +--echo # 20.a) LOAD DATA into base table is incompatible with FTWRL. +let $statement= load data infile '../../std_data/rpl_loaddata.dat' into table t1_base (@dummy, i); +let $cleanup_stmt1= delete from t1_base; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 20.b) LOAD DATA into temporary table is compatible with FTWRL. +let $statement= load data infile '../../std_data/rpl_loaddata.dat' into table t1_temp (@dummy, i); +let $cleanup_stmt= delete from t1_temp; +--source include/check_ftwrl_compatible.inc + + +--echo # +--echo # 21) LOCK/UNLOCK TABLES statements. +--echo # +--echo # LOCK TABLES statement always (almost) blocks FTWRL as it +--echo # keeps tables open until UNLOCK TABLES. +--echo # Active FTWRL on the other hand blocks only those +--echo # LOCK TABLES which allow updating of base tables. +--echo # +--echo # 21.a) LOCK TABLES READ is allowed under FTWRL and +--echo # is not blocked by active FTWRL. +flush tables with read lock; +lock tables t1_base read; +unlock tables; +--echo # +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +lock tables t1_base read; +unlock tables; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +unlock tables; +--echo # Switching to connection 'default'. +connection default; + +--echo # +--echo # 21.b) LOCK TABLES WRITE on a base table is disallowed +--echo # under FTWRL and should be blocked by active FTWRL. +flush tables with read lock; +--error ER_CANT_UPDATE_WITH_READLOCK +lock tables t1_base write; +unlock tables; +--echo # +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +--send lock tables t1_base write +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Check that LOCK TABLES WRITE is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for global read lock" and + info = "lock tables t1_base write"; +--source include/wait_condition.inc +unlock tables; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap LOCK TABLES WRITE +--reap +unlock tables; + +--echo # +--echo # 21.c) LOCK TABLES WRITE on temporary table doesn't +--echo # make much sense but is allowed under FTWRL +--echo # and should not be blocked by active FTWRL. +flush tables with read lock; +lock tables t1_temp write; +unlock tables; +--echo # +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +lock tables t1_temp write; +unlock tables; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +unlock tables; +--echo # Switching to connection 'default'. +connection default; + + +--echo # +--echo # 22) OPTIMIZE TABLE statement. +--echo # +--echo # 22.a) OPTIMIZE TABLE of base table is incompatible with FTWRL. +flush tables with read lock; +--echo # OPTIMIZE statement returns errors as part of result-set. +optimize table t1_base; +unlock tables; +--echo # +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +--send optimize table t1_base +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Check that OPTIMIZE TABLE is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for global read lock" and + info = "optimize table t1_base"; +--source include/wait_condition.inc +unlock tables; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap OPTIMIZE TABLE +--reap +--echo # We don't check that active OPTIMIZE TABLE blocks +--echo # FTWRL as this one of statements releasing metadata +--echo # locks in non-standard place. + +--echo # +--echo # 22.b) OPTIMIZE TABLE of temporary table is compatible with FTWRL. +let $statement= optimize table t1_temp; +let $cleanup_stmt= ; +--echo # Skip last part of compatibility testing as this statement +--echo # releases metadata locks in non-standard place. +let $skip_3rd_check= 1; +--source include/check_ftwrl_compatible.inc +let $skip_3rd_check= ; + + +--echo # +--echo # 23) CACHE statement is compatible with FTWRL. +--echo # +let $statement= cache index t1_base in default; +let $cleanup_stmt= ; +--echo # Skip last part of compatibility testing as this statement +--echo # releases metadata locks in non-standard place. +let $skip_3rd_check= 1; +--source include/check_ftwrl_compatible.inc +let $skip_3rd_check= ; + + +--echo # +--echo # 24) LOAD INDEX statement is compatible with FTWRL. +--echo # +let $statement= load index into cache t1_base; +let $cleanup_stmt= ; +--echo # Skip last part of compatibility testing as this statement +--echo # releases metadata locks in non-standard place. +let $skip_3rd_check= 1; +--source include/check_ftwrl_compatible.inc +let $skip_3rd_check= ; + + +--echo # +--echo # 25) SAVEPOINT/RELEASE SAVEPOINT/ROLLBACK TO SAVEPOINT are +--echo # compatible with FTWRL. +--echo # +--echo # Since manipulations on savepoint have to be done +--echo # inside transaction and FTWRL commits transaction we +--echo # need a special test for these statements. +flush tables with read lock; +begin; +savepoint sv1; +rollback to savepoint sv1; +release savepoint sv1; +unlock tables; +commit; +--echo # Check that these statements are not blocked by +--echo # active FTWRL in another connection. +--echo # +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +begin; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +unlock tables; +--echo # Switching to connection 'default'. +connection default; +--echo # Do some changes to avoid SAVEPOINT and friends +--echo # being almost no-ops. +insert into t3_trans values (1); +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +savepoint sv1; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +unlock tables; +--echo # Switching to connection 'default'. +connection default; +insert into t3_trans values (2); +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +rollback to savepoint sv1; +release savepoint sv1; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +unlock tables; +--echo # Switching to connection 'default'. +connection default; +rollback; +--echo # Check that these statements don't block FTWRL in +--echo # another connection. +begin; +--echo # Do some changes to avoid SAVEPOINT and friends +--echo # being almost no-ops. +insert into t3_trans values (1); +set debug_sync='RESET'; +set debug_sync='execute_command_after_close_tables SIGNAL parked WAIT_FOR go'; +--send savepoint sv1 +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +set debug_sync='now WAIT_FOR parked'; +flush tables with read lock; +unlock tables; +set debug_sync='now SIGNAL go'; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap SAVEPOINT +--reap +insert into t3_trans values (2); +set debug_sync='execute_command_after_close_tables SIGNAL parked WAIT_FOR go'; +--send rollback to savepoint sv1 +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +set debug_sync='now WAIT_FOR parked'; +flush tables with read lock; +unlock tables; +set debug_sync='now SIGNAL go'; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap ROLLBACK TO SAVEPOINT +--reap +set debug_sync='execute_command_after_close_tables SIGNAL parked WAIT_FOR go'; +--send release savepoint sv1 +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +set debug_sync='now WAIT_FOR parked'; +flush tables with read lock; +unlock tables; +set debug_sync='now SIGNAL go'; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap RELEASE SAVEPOINT +--reap +rollback; +set debug_sync= "RESET"; + + +--echo # +--echo # 26) RENAME variants. +--echo # +--echo # 26.1) RENAME TABLES is incompatible with FTWRL. +let $statement= rename table t1_base to t3_base; +let $cleanup_stmt1= rename table t3_base to t1_base; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 26.2) RENAME USER is incompatible with FTWRL. +create user mysqltest_u1; +let $statement= rename user mysqltest_u1 to mysqltest_u2; +let $cleanup_stmt1= rename user mysqltest_u2 to mysqltest_u1; +--source include/check_ftwrl_incompatible.inc +drop user mysqltest_u1; + + +--echo # +--echo # 27) REPAIR TABLE statement. +--echo # +--echo # 27.a) REPAIR TABLE of base table is incompatible with FTWRL. +flush tables with read lock; +--echo # REPAIR statement returns errors as part of result-set. +repair table t1_base; +unlock tables; +--echo # +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +--send repair table t1_base +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Check that REPAIR TABLE is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for global read lock" and + info = "repair table t1_base"; +--source include/wait_condition.inc +unlock tables; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap REPAIR TABLE +--reap +--echo # We don't check that active REPAIR TABLE blocks +--echo # FTWRL as this one of statements releasing metadata +--echo # locks in non-standard place. + +--echo # +--echo # 27.b) REPAIR TABLE of temporary table is compatible with FTWRL. +let $statement= repair table t1_temp; +let $cleanup_stmt= ; +--echo # Skip last part of compatibility testing as this statement +--echo # releases metadata locks in non-standard place. +let $skip_3rd_check= 1; +--source include/check_ftwrl_compatible.inc +let $skip_3rd_check= ; + + +--echo # +--echo # 28) REPLACE statement. +--echo # +--echo # 28.a) Ordinary REPLACE into base table is incompatible with FTWRL. +let $statement= replace into t1_base values (1); +let $cleanup_stmt1= delete from t1_base limit 1; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 28.b) Ordinary REPLACE into temp table is compatible with FTWRL. +let $statement= replace into t1_temp values (1); +let $cleanup_stmt= delete from t1_temp limit 1; +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 28.c) REPLACE SELECT into base table is incompatible with FTWRL. +let $statement= replace into t1_base select * from t1_temp; +let $cleanup_stmt1= ; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 28.d) REPLACE SELECT into temp table is compatible with FTWRL. +let $statement= replace into t1_temp select * from t1_base; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + + +--echo # +--echo # 29) REVOKE variants. +--echo # +--echo # 29.1) REVOKE privileges is incompatible with FTWRL. +grant all privileges on t1_base to mysqltest_u1; +let $statement= revoke all privileges on t1_base from mysqltest_u1; +let $cleanup_stmt1= grant all privileges on t1_base to mysqltest_u1; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 29.2) REVOKE ALL PRIVILEGES, GRANT OPTION is incompatible with FTWRL. +let $statement= revoke all privileges, grant option from mysqltest_u1; +let $cleanup_stmt1= grant all privileges on t1_base to mysqltest_u1; +--source include/check_ftwrl_incompatible.inc +drop user mysqltest_u1; + + +--echo # +--echo # 30) Compatibility of SELECT statement with FTWRL depends on +--echo # locking mode used and on functions being invoked by it. +--echo # +--echo # 30.a) Simple SELECT which does not change tables should be +--echo # compatible with FTWRL. +let $statement= select count(*) from t1_base; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + +--echo # 30.b) SELECT ... FOR UPDATE is incompatible with FTWRL. +let $statement= select count(*) from t1_base for update; +let $cleanup_stmt1= ; +--source include/check_ftwrl_incompatible.inc + +--echo # 30.c) SELECT ... LOCK IN SHARE MODE is compatible with FTWRL. +let $statement= select count(*) from t1_base lock in share mode; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 30.d) SELECT which calls SF updating base table should be +--echo # incompatible with FTWRL. +let $statement= select f2_base(); +let $cleanup_stmt1= delete from t1_base limit 1; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 30.e) SELECT which calls SF updating temporary table should be +--echo # compatible with FTWRL. +let $statement= select f2_temp(); +let $cleanup_stmt= delete from t1_temp limit 1; +--source include/check_ftwrl_compatible.inc + + +--echo # +--echo # 31) Compatibility of SET statement with FTWRL depends on its +--echo # expression and on whether it is a special SET statement. +--echo # +--echo # 31.a) Ordinary SET with expression which does not +--echo # changes base table should be compatible with FTWRL. +let $statement= set @a:= (select count(*) from t1_base); +let $cleanup_stmt= ; +--echo # Skip last part of compatibility testing as our helper debug +--echo # sync-point doesn't work for SET statements. +let $skip_3rd_check= 1; +--source include/check_ftwrl_compatible.inc +let $skip_3rd_check= ; + +--echo # +--echo # 31.b) Ordinary SET which calls SF updating base table should +--echo # be incompatible with FTWRL. +let $statement= set @a:= f2_base(); +let $cleanup_stmt1= delete from t1_base limit 1; +--echo # Skip last part of compatibility testing as our helper debug +--echo # sync-point doesn't work for SET statements. +let $skip_3rd_check= 1; +--source include/check_ftwrl_incompatible.inc +let $skip_3rd_check= ; + +--echo # +--echo # 31.c) Ordinary SET which calls SF updating temporary table +--echo # should be compatible with FTWRL. +let $statement= set @a:= f2_temp(); +let $cleanup_stmt= delete from t1_temp limit 1; +--echo # Skip last part of compatibility testing as our helper debug +--echo # sync-point doesn't work for SET statements. +let $skip_3rd_check= 1; +--source include/check_ftwrl_compatible.inc +let $skip_3rd_check= ; + +--echo # +--echo # 31.d) Special SET variants have different compatibility with FTWRL. +--echo # +--echo # 31.d.I) SET PASSWORD is incompatible with FTWRL as it changes data. +create user mysqltest_u1; +let $statement= set password for 'mysqltest_u1' = password(''); +let $cleanup_stmt1= ; +--echo # Skip last part of compatibility testing as our helper debug +--echo # sync-point doesn't work for SET statements. +let $skip_3rd_check= 1; +--source include/check_ftwrl_incompatible.inc +let $skip_3rd_check= ; +drop user mysqltest_u1; +--echo # +--echo # 31.d.II) SET READ_ONLY is compatible with FTWRL (but has no +--echo # effect when executed under it). +let $statement= set global read_only= 1; +let $cleanup_stmt= set global read_only= 0; +--echo # Skip last part of compatibility testing as our helper debug +--echo # sync-point doesn't work for SET statements. +let $skip_3rd_check= 1; +--source include/check_ftwrl_compatible.inc +let $skip_3rd_check= ; +--echo # +--echo # 31.d.III) Situation with SET AUTOCOMMIT is complex. +--echo # Turning auto-commit off is always compatible with FTWRL. +--echo # Turning auto-commit on causes implicit commit and so +--echo # is incompatible with FTWRL if there are changes to be +--echo # committed. +flush tables with read lock; +set autocommit= 0; +--echo # Turning auto-commit on causes implicit commit so can +--echo # be incompatible with FTWRL if there is something to +--echo # commit. But since even in this case we allow commits +--echo # under active FTWRL such statement should always succeed. +insert into t3_temp_trans values (1); +set autocommit= 1; +unlock tables; +delete from t3_temp_trans; +--echo # Check that SET AUTOCOMMIT=0 is not blocked and +--echo # SET AUTOCOMMIT=1 is blocked by active FTWRL in +--echo # another connection. +--echo # +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +set autocommit= 0; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +unlock tables; +--echo # Switching to connection 'default'. +connection default; +--echo # Do some work so implicit commit in SET AUTOCOMMIT=1 +--echo # is not a no-op. +insert into t3_trans values (1); +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +--echo # Send: +--send set autocommit= 1 +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Wait until SET AUTOCOMMIT=1 is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for commit lock" and + info = "set autocommit= 1"; +--source include/wait_condition.inc +unlock tables; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap SET AUTOCOMMIT=1. +--reap +delete from t3_trans; +--echo # +--echo # Check that SET AUTOCOMMIT=1 blocks FTWRL in another connection. +set autocommit= 0; +insert into t3_trans values (1); +set debug_sync='RESET'; +set debug_sync='ha_commit_trans_after_acquire_commit_lock SIGNAL parked WAIT_FOR go'; +--send set autocommit= 1 +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +set debug_sync='now WAIT_FOR parked'; +--send flush tables with read lock +--echo # Switching to connection '$con_aux2'. +connection $con_aux2; +--echo # Wait until FTWRL is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for commit lock" and + info = "flush tables with read lock"; +--source include/wait_condition.inc +set debug_sync='now SIGNAL go'; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap SET AUTOCOMMIT=1. +--reap +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Reap FTWRL. +--reap +unlock tables; +--echo # Switching to connection 'default'. +connection default; +delete from t3_trans; +set debug_sync= "RESET"; + + +--echo # +--echo # 32) SHOW statements are compatible with FTWRL. +--echo # Let us test _some_ of them. +--echo # +--echo # 32.1) SHOW TABLES. +let $statement= show tables from test; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 32.1) SHOW TABLES. +let $statement= show tables from test; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 32.2) SHOW EVENTS. +let $statement= show events from test; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 32.3) SHOW GRANTS. +create user mysqltest_u1; +let $statement= show grants for mysqltest_u1; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc +drop user mysqltest_u1; + +--echo # +--echo # 32.4) SHOW CREATE TABLE. +let $statement= show create table t1_base; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 32.5) SHOW CREATE FUNCTION. +let $statement= show create function f1; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + + +--echo # +--echo # 33) SIGNAL statement is compatible with FTWRL. +--echo # +--echo # Note that we don't cover RESIGNAL as it requires +--echo # active handler context. +let $statement= signal sqlstate '01000'; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + + +--echo # +--echo # 34) TRUNCATE TABLE statement. +--echo # +--echo # 34.a) TRUNCATE of base table is incompatible with FTWRL. +let $statement= truncate table t1_base; +let $cleanup_stmt1= ; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 34.b) TRUNCATE of temporary table is compatible with FTWRL. +let $statement= truncate table t1_temp; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + + +--echo # +--echo # 35) UPDATE variants. +--echo # +--echo # 35.1) Simple UPDATE. +--echo # +--echo # 35.1.a) Simple UPDATE on base table is incompatible with FTWRL. +let $statement= update t1_base set i= 1 where i = 0; +let $cleanup_stmt1= ; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 35.1.b) Simple UPDATE on temporary table is compatible with FTWRL. +let $statement= update t1_temp set i= 1 where i = 0; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 35.2) Multi UPDATE. +--echo # +--echo # 35.2.a) Multi UPDATE on base tables is incompatible with FTWRL. +let $statement= update t1_base, t2_base set t1_base.i= 1 where t1_base.i = t2_base.j; +let $cleanup_stmt1= ; +--source include/check_ftwrl_incompatible.inc + +--echo # +--echo # 35.2.b) Multi UPDATE on temporary tables is compatible with FTWRL. +let $statement= update t1_temp, t2_temp set t1_temp.i= 1 where t1_temp.i = t2_temp.j; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + + +--echo # +--echo # 36) USE statement is compatible with FTWRL. +--echo # +let $statement= use mysqltest1; +let $cleanup_stmt= use test; +--source include/check_ftwrl_compatible.inc + + +--echo # +--echo # 37) XA statements. +--echo # +--echo # XA statements are similar to BEGIN/COMMIT/ROLLBACK. +--echo # +--echo # XA BEGIN, END, PREPARE, ROLLBACK and RECOVER are compatible +--echo # with FTWRL. XA COMMIT is not. +flush tables with read lock; +--echo # Although all below statements are allowed under FTWRL they +--echo # are almost no-ops as FTWRL does commit and does not allows +--echo # any non-temporary DML under it. +xa start 'test1'; +xa end 'test1'; +xa prepare 'test1'; +xa rollback 'test1'; +xa start 'test1'; +xa end 'test1'; +xa prepare 'test1'; +xa commit 'test1'; +--disable_result_log +xa recover; +--enable_result_log +unlock tables; +--echo # Check that XA non-COMMIT statements are not and COMMIT is +--echo # blocked by active FTWRL in another connection +--echo # +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +xa start 'test1'; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +unlock tables; +--echo # Switching to connection 'default'. +connection default; +insert into t3_trans values (1); +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +xa end 'test1'; +xa prepare 'test1'; +xa rollback 'test1'; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +unlock tables; +--echo # Switching to connection 'default'. +connection default; +xa start 'test1'; +insert into t3_trans values (1); +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +connection default; +xa end 'test1'; +xa prepare 'test1'; +--echo # Send: +--send xa commit 'test1'; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Wait until XA COMMIT is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for commit lock" and + info = "xa commit 'test1'"; +--source include/wait_condition.inc +unlock tables; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap XA COMMIT. +--reap +delete from t3_trans; +--echo # +--echo # Check that XA COMMIT blocks FTWRL in another connection. +xa start 'test1'; +insert into t3_trans values (1); +xa end 'test1'; +xa prepare 'test1'; +set debug_sync='RESET'; +set debug_sync='trans_xa_commit_after_acquire_commit_lock SIGNAL parked WAIT_FOR go'; +--send xa commit 'test1' +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +set debug_sync='now WAIT_FOR parked'; +--send flush tables with read lock +--echo # Switching to connection '$con_aux2'. +connection $con_aux2; +--echo # Wait until FTWRL is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for commit lock" and + info = "flush tables with read lock"; +--source include/wait_condition.inc +set debug_sync='now SIGNAL go'; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap XA COMMIT. +--reap +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Reap FTWRL. +--reap +unlock tables; +--echo # Switching to connection 'default'. +connection default; +delete from t3_trans; +set debug_sync= "RESET"; + + +--echo # +--echo # 38) Test effect of auto-commit mode for DML on transactional +--echo # temporary tables. +--echo # +--echo # 38.1) When auto-commit is on each such a statement ends with commit +--echo # of changes to temporary tables. But since transactions doing +--echo # such changes are considered read only [sic!/QQ] this commit +--echo # is compatible with FTWRL. +--echo # +--echo # Let us demostrate this fact for some common DML statements. +let $statement= delete from t3_temp_trans; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + +let $statement= insert into t3_temp_trans values (1); +let $cleanup_stmt= delete from t3_temp_trans limit 1; +--source include/check_ftwrl_compatible.inc + +let $statement= update t3_temp_trans, t2_temp set t3_temp_trans.i= 1 where t3_temp_trans.i = t2_temp.j; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + +--echo # +--echo # 38.2) When auto-commit is off DML on transaction temporary tables +--echo # is compatible with FTWRL. +--echo # +set autocommit= 0; +let $statement= delete from t3_temp_trans; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc + +let $statement= insert into t3_temp_trans values (1); +let $cleanup_stmt= delete from t3_temp_trans limit 1; +--source include/check_ftwrl_compatible.inc + +let $statement= update t3_temp_trans, t2_temp set t3_temp_trans.i= 1 where t3_temp_trans.i = t2_temp.j; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc +set autocommit= 1; + + +--echo # +--echo # 39) Test effect of DDL on transactional tables. +--echo # +--echo # 39.1) Due to implicit commit at the end of statement some of DDL +--echo # statements which are compatible with FTWRL in non-transactional +--echo # case are not compatible in case of transactional tables. +--echo # +--echo # 39.1.a) ANALYZE TABLE for transactional table is incompatible with +--echo # FTWRL. +flush tables with read lock; +--echo # Implicit commits are allowed under FTWRL. +analyze table t3_trans; +unlock tables; +--echo # +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +--send analyze table t3_trans +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Check that ANALYZE TABLE is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for commit lock" and + info = "analyze table t3_trans"; +--source include/wait_condition.inc +unlock tables; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap ANALYZE TABLE +--reap + +--echo # +--echo # 39.1.b) CHECK TABLE for transactional table is compatible with FTWRL. +--echo # Although it does implicit commit at the end of statement it +--echo # is considered to be read-only operation. +let $statement= check table t3_trans; +let $cleanup_stmt= ; +--echo # Skip last part of compatibility testing as this statement +--echo # releases metadata locks in non-standard place. +let $skip_3rd_check= 1; +--source include/check_ftwrl_compatible.inc +let $skip_3rd_check= ; + +--echo # +--echo # 39.2) Situation with DDL on temporary transactional tables is +--echo # complex. +--echo # +--echo # 39.2.a) Some statements compatible with FTWRL since they don't +--echo # do implicit commit. +--echo # +--echo # For example, CREATE TEMPORARY TABLE: +let $statement= create temporary table t4_temp_trans(i int) engine=innodb; +let $cleanup_stmt= drop temporary tables t4_temp_trans; +--source include/check_ftwrl_compatible.inc +--echo # +--echo # Or DROP TEMPORARY TABLE: +let $statement= drop temporary tables t3_temp_trans; +let $cleanup_stmt= create temporary table t3_temp_trans(i int) engine=innodb; +--source include/check_ftwrl_compatible.inc +--echo # +--echo # 39.2.b) Some statements do implicit commit but are considered +--echo # read-only and so are compatible with FTWRL. +--echo # +--echo # For example, REPAIR TABLE: +let $statement= repair table t3_temp_trans; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc +--echo # +--echo # And ANALYZE TABLE: +let $statement= analyze table t3_temp_trans; +let $cleanup_stmt= ; +--source include/check_ftwrl_compatible.inc +--echo # +--echo # 39.2.c) Some statements do implicit commit and not +--echo # considered read-only. As result they are +--echo # not compatible with FTWRL. +--echo # +flush tables with read lock; +--echo # Implicit commits are allowed under FTWRL. +alter table t3_temp_trans add column c1 int; +unlock tables; +--echo # +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +--send alter table t3_temp_trans drop column c1 +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Check that ALTER TABLE is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for commit lock" and + info = "alter table t3_temp_trans drop column c1"; +--source include/wait_condition.inc +unlock tables; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap ALTER TABLE +--reap + + +--echo # +--echo # 40) Test effect of implicit commit for DDL which is otherwise +--echo # compatible with FTWRL. Implicit commit at the start of DDL +--echo # statement can make it incompatible with FTWRL if there are +--echo # some changes to be commited even in case when DDL statement +--echo # itself is compatible with FTWRL. +--echo # +--echo # For example CHECK TABLE for base non-transactional tables and +--echo # ALTER TABLE for temporary non-transactional tables are affected. +begin; +insert into t3_trans values (1); +--echo # +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +--send check table t1_base +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Check that CHECK TABLE is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for commit lock" and + info = "check table t1_base"; +--source include/wait_condition.inc +unlock tables; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap CHECK TABLE +--reap +begin; +delete from t3_trans; +--echo # +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +--send alter table t1_temp add column c1 int +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Check that ALTER TABLE is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for commit lock" and + info = "alter table t1_temp add column c1 int"; +--source include/wait_condition.inc +unlock tables; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap ALTER TABLE +--reap +alter table t1_temp drop column c1; + + +--echo # +--echo # Check that FLUSH TABLES WITH READ LOCK is blocked by individual +--echo # statements and is not blocked in the presence of transaction which +--echo # has done some changes earlier but is idle now (or does only reads). +--echo # This allows to use this statement even on systems which has long +--echo # running transactions. +--echo # +begin; +insert into t1_base values (1); +insert into t3_trans values (1); +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # The below FTWRL should not be blocked by transaction in 'default'. +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +--echo # Transaction still is able to read even with FTWRL active in another +--echo # connection. +select * from t1_base; +select * from t2_base; +select * from t3_trans; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +unlock tables; +--echo # Switching to connection 'default'. +connection default; +commit; +delete from t1_base; +delete from t3_trans; + + +--echo # +--echo # Check that impending FTWRL blocks new DML statements and +--echo # so can't be starved by a constant flow of DML. +--echo # (a.k.a. test for bug #54673 "It takes too long to get +--echo # readlock for 'FLUSH TABLES WITH READ LOCK'"). +--echo # +set debug_sync='RESET'; +set debug_sync='execute_command_after_close_tables SIGNAL parked WAIT_FOR go'; +--send insert into t1_base values (1) +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +set debug_sync='now WAIT_FOR parked'; +--send flush tables with read lock +--echo # Switching to connection '$con_aux2'. +connection $con_aux2; +--echo # Wait until FTWRL is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for global read lock" and + info = "flush tables with read lock"; +--source include/wait_condition.inc +--echo # Try to run another INSERT and see that it is blocked. +--send insert into t2_base values (1); +--echo # Switching to connection 'con3'. +connection con3; +--echo # Wait until new INSERT is blocked. +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for global read lock" and + info = "insert into t2_base values (1)"; +--echo # Unblock INSERT in the first connection. +set debug_sync='now SIGNAL go'; +--echo # Switching to connection 'default'. +connection default; +--echo # Reap first INSERT. +--reap +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # Reap FTWRL. +--reap +unlock tables; +--echo # Switching to connection '$con_aux2'. +connection $con_aux2; +--echo # Reap second INSERT. +--reap +--echo # Switching to connection 'default'. +connection default; +set debug_sync= "RESET"; +delete from t1_base; +delete from t2_base; + +--echo +--echo # Check that COMMIT thas is issued after +--echo # FLUSH TABLES WITH READ LOCK is not blocked by +--echo # FLUSH TABLES WITH READ LOCK from another connection. +--echo # This scenario is used in innobackup.pl. The COMMIT goes +--echo # through because the transaction started by FTWRL does +--echo # not modify any tables, and the commit blocker lock is +--echo # only taken when there were such modifications. +--echo +flush tables with read lock; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +--echo # The below FTWRL should not be blocked by transaction in 'default'. +flush tables with read lock; +--echo # Switching to connection 'default'. +connection default; +select * from t1_base; +select * from t3_trans; +commit; +--echo # Switching to connection '$con_aux1'. +connection $con_aux1; +select * from t1_base; +select * from t3_trans; +commit; +unlock tables; +--echo # Switching to connection 'default'. +connection default; +unlock tables; + + +--echo # +--echo # Check how FLUSH TABLE WITH READ LOCK is handled for MERGE tables. +--echo # As usual there are tricky cases related to this type of tables. +--echo # +--echo # +--echo # 1) Most typical case - base MERGE table with base underlying tables. +--echo # +--echo # 1.a) DML statements which change data should be incompatible with FTWRL. +create table tm_base (i int) engine=merge union=(t1_base) insert_method=last; +let $statement= insert into tm_base values (1); +let $cleanup_stmt1= delete from tm_base; +--source include/check_ftwrl_incompatible.inc +--echo # +--echo # 1.b) DDL statement on such table should be incompatible with FTWRL as well. +let $statement= alter table tm_base insert_method=first; +let $cleanup_stmt1= alter table tm_base insert_method=last; +--source include/check_ftwrl_incompatible.inc +drop table tm_base; + +--echo # +--echo # 2) Temporary MERGE table with base underlying tables. +--echo # +--echo # 2.a) DML statements which change data should be incompatible with FTWRL +--echo # as they affect base tables. +create temporary table tm_temp_base (i int) engine=merge union=(t1_base) insert_method=last; +let $statement= insert into tm_temp_base values (1); +let $cleanup_stmt1= delete from tm_temp_base; +--source include/check_ftwrl_incompatible.inc +--echo # +--echo # 2.b) Some of DDL statements on such table can be compatible with FTWRL +--echo # as they don't affect base tables. +let $statement= drop temporary tables tm_temp_base; +let $cleanup_stmt= create temporary table tm_temp_base (i int) engine=merge union=(t1_base) insert_method=last; +--source include/check_ftwrl_compatible.inc +--echo # +--echo # 2.c) ALTER statement is incompatible with FTWRL. Even though it does +--echo # not change data in base table it still acquires strong metadata +--echo # locks on them. +let $statement= alter table tm_temp_base insert_method=first; +let $cleanup_stmt1= alter table tm_temp_base insert_method=last; +--source include/check_ftwrl_incompatible.inc +drop table tm_temp_base; + +--echo # +--echo # 3) Temporary MERGE table with temporary underlying tables. +--echo # +--echo # 3.a) DML statements should be compatible with FTWRL as +--echo # no base table is going to be affected. +create temporary table tm_temp_temp (i int) engine=merge union=(t1_temp) insert_method=last; +let $statement= insert into tm_temp_temp values (1); +let $cleanup_stmt= delete from tm_temp_temp; +--source include/check_ftwrl_compatible.inc +--echo # +--echo # 3.b) DDL statements should be compatible with FTWRL as well +--echo # as no base table is going to be affected too. +let $statement= alter table tm_temp_temp union=(t1_temp) insert_method=first; +let $cleanup_stmt= alter table tm_temp_temp union=(t1_temp) insert_method=last; +--source include/check_ftwrl_compatible.inc +drop table tm_temp_temp; + +--echo # +--echo # 4) For the sake of completeness let us check that base MERGE tables +--echo # with temporary underlying tables are not functional. +create table tm_base_temp (i int) engine=merge union=(t1_temp) insert_method=last; +--error ER_WRONG_MRG_TABLE +select * from tm_base_temp; +drop table tm_base_temp; + + +--echo # +--echo # Clean-up. +--echo # +drop event e1; +drop function f2_temp; +drop function f2_base; +drop procedure p2; +drop view v1; +drop function f1; +drop procedure p1; +drop database `#mysql50#mysqltest-2`; +drop database mysqltest1; +drop temporary tables t1_temp, t2_temp; +drop tables t1_base, t2_base, t3_trans; +disconnect con1; +disconnect con2; +disconnect con3; + +# Check that all connections opened by test cases in this file are really +# gone so execution of other tests won't be affected by their presence. +--source include/wait_until_count_sessions.inc diff --git a/mysql-test/t/flush_read_lock_kill-master.opt b/mysql-test/t/flush_read_lock_kill-master.opt deleted file mode 100644 index 61e2b242351..00000000000 --- a/mysql-test/t/flush_read_lock_kill-master.opt +++ /dev/null @@ -1 +0,0 @@ ---loose-debug=+d,make_global_read_lock_block_commit_loop diff --git a/mysql-test/t/flush_read_lock_kill.test b/mysql-test/t/flush_read_lock_kill.test index 2d359383949..a672fa5dfc5 100644 --- a/mysql-test/t/flush_read_lock_kill.test +++ b/mysql-test/t/flush_read_lock_kill.test @@ -2,24 +2,19 @@ # for running commits to finish (in the past it could not) # This will not be a meaningful test on non-debug servers so will be # skipped. -# If running mysql-test-run --debug, the --debug added by -# mysql-test-run to the mysqld command line will override the one of -# -master.opt. But this test is designed to still pass then (though it -# won't test anything interesting). # This also won't work with the embedded server test --source include/not_embedded.inc --source include/have_debug.inc +# This test needs transactional engine as otherwise COMMIT +# won't block FLUSH TABLES WITH GLOBAL READ LOCK. +--source include/have_innodb.inc + # Save the initial number of concurrent sessions --source include/count_sessions.inc -# Disable concurrent inserts to avoid test failures when reading the -# connection id which was inserted into a table by another thread. -SET @old_concurrent_insert= @@global.concurrent_insert; -SET @@global.concurrent_insert= 0; - connect (con1,localhost,root,,); connect (con2,localhost,root,,); connection con1; @@ -27,47 +22,64 @@ connection con1; --disable_warnings DROP TABLE IF EXISTS t1; --enable_warnings -CREATE TABLE t1 (kill_id INT); +SET DEBUG_SYNC= 'RESET'; +CREATE TABLE t1 (kill_id INT) engine = InnoDB; +INSERT INTO t1 VALUES(connection_id()); + +--echo # Switching to connection 'default'. +connection default; +--echo # Start transaction. +BEGIN; INSERT INTO t1 VALUES(connection_id()); +--echo # Ensure that COMMIT will pause once it acquires protection +--echo # against its global read lock. +SET DEBUG_SYNC='ha_commit_trans_after_acquire_commit_lock SIGNAL acquired WAIT_FOR go'; -# Thanks to the parameter we passed to --debug, this FLUSH will -# block on a debug build running with our --debug=make_global... It -# will block until killed. In other cases (non-debug build or other -# --debug) it will succeed immediately +--echo # Sending: +--send COMMIT +--echo # Switching to 'con1'. connection con1; +--echo # Wait till COMMIT acquires protection against global read +--echo # lock and pauses. +SET DEBUG_SYNC='now WAIT_FOR acquired'; +--echo # Sending: send FLUSH TABLES WITH READ LOCK; -# kill con1 +--echo # Switching to 'con2'. connection con2; -SELECT ((@id := kill_id) - kill_id) FROM t1; +SELECT ((@id := kill_id) - kill_id) FROM t1 LIMIT 1; -# Wait for the debug sync point, test won't run on non-debug -# builds anyway. +--echo # Wait till FLUSH TABLES WITH READ LOCK blocks due +--echo # to active COMMIT let $wait_condition= select count(*) = 1 from information_schema.processlist - where state = "Waiting for all running commits to finish" + where state = "Waiting for commit lock" and info = "flush tables with read lock"; --source include/wait_condition.inc +--echo # Kill connection 'con1'. KILL CONNECTION @id; +--echo # Switching to 'con1'. connection con1; -# On debug builds it will be error 1053 (killed); on non-debug, or -# debug build running without our --debug=make_global..., will be -# error 0 (no error). The only important thing to test is that on -# debug builds with our --debug=make_global... we don't hang forever. ---error 0,1317,2013 +--echo # Try to reap FLUSH TABLES WITH READ LOCK, +--echo # it fail due to killed statement and connection. +--error 1317,2013 reap; +--echo # Switching to 'con2'. connection con2; -DROP TABLE t1; +--echo # Resume COMMIT. +SET DEBUG_SYNC='now SIGNAL go'; +--echo # Switching to 'default'. connection default; +--echo # Reaping COMMIT. +--reap disconnect con2; - -# Restore global concurrent_insert value -SET @@global.concurrent_insert= @old_concurrent_insert; +DROP TABLE t1; +SET DEBUG_SYNC= 'RESET'; # Wait till all disconnects are completed --source include/wait_until_count_sessions.inc diff --git a/mysql-test/t/func_misc.test b/mysql-test/t/func_misc.test index 2251ae45b3f..1a5c5373841 100644 --- a/mysql-test/t/func_misc.test +++ b/mysql-test/t/func_misc.test @@ -512,7 +512,28 @@ SELECT INET_NTOA(0); SELECT '1' IN ('1', INET_NTOA(0)); ---echo End of 5.1 tests +--echo # +--echo # End of 5.1 tests +--echo # + +--echo # +--echo # Bug #58199: name_const in the having clause crashes +--echo # + +CREATE TABLE t1 (a INT); + +# NAME_CONST() would seg.fault when used wrongly in a HAVING clause +--error ER_WRONG_ARGUMENTS +SELECT 1 from t1 HAVING NAME_CONST('', a); ---echo End of tests +DROP TABLE t1; + + +--echo # +--echo # End of 5.5 tests +--echo # + +--echo # +--echo # End of tests +--echo # diff --git a/mysql-test/t/kill.test b/mysql-test/t/kill.test index 706c2514d92..9e94bb44171 100644 --- a/mysql-test/t/kill.test +++ b/mysql-test/t/kill.test @@ -1,307 +1,326 @@ -# This test doesn't work with the embedded version as this code -# assumes that one query is running while we are doing queries on -# a second connection. -# This would work if mysqltest run would be threaded and handle each -# connection in a separate thread. # +# Test KILL and KILL QUERY statements. +# +# Killing a connection in an embedded server does not work like in a normal +# server, if it is waiting for a new statement. In an embedded server, the +# connection does not read() from a socket, but returns control to the +# application. 'mysqltest' does not handle the kill request. +# + -- source include/not_embedded.inc +-- source include/have_debug_sync.inc -# Disable concurrent inserts to avoid test failures when reading the -# connection id which was inserted into a table by another thread. -set @old_concurrent_insert= @@global.concurrent_insert; -set @@global.concurrent_insert= 0; +--disable_warnings +SET DEBUG_SYNC = 'RESET'; +DROP TABLE IF EXISTS t1, t2, t3; +DROP FUNCTION IF EXISTS MY_KILL; +--enable_warnings + +delimiter |; +# Helper function used to repeatedly kill a session. +CREATE FUNCTION MY_KILL(tid INT) RETURNS INT +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; + KILL tid; + RETURN (SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = tid); +END| +delimiter ;| connect (con1, localhost, root,,); connect (con2, localhost, root,,); -#remember id of con1 +# Save id of con1 connection con1; ---disable_warnings -drop table if exists t1, t2, t3; ---enable_warnings - --disable_reconnect -create table t1 (kill_id int); -insert into t1 values(connection_id()); +let $ID= `SELECT @id := CONNECTION_ID()`; +connection con2; +let $ignore= `SELECT @id := $ID`; +connection con1; +# Signal when this connection is terminating. +SET DEBUG_SYNC= 'thread_end SIGNAL con1_end'; +# See if we can kill read(). +# Run into read() immediately after hitting 'before_do_command_net_read'. +SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read'; -#kill con1 +# Kill con1 connection con2; -select ((@id := kill_id) - kill_id) from t1; -kill @id; +SET DEBUG_SYNC='now WAIT_FOR con1_read'; +# At this point we have no way to figure out, when con1 is blocked in +# reading from the socket. Sending KILL to early would not terminate +# con1. So we repeat KILL until con1 terminates. +let $wait_condition= SELECT MY_KILL(@id); +--source include/wait_condition.inc +# If KILL missed the read(), sync point wait will time out. +SET DEBUG_SYNC= 'now WAIT_FOR con1_end'; +SET DEBUG_SYNC = 'RESET'; connection con1; ---sleep 2 - ---disable_query_log ---disable_result_log -# One of the following statements should fail ---error 0,2006,2013 -select 1; ---error 0,2006,2013 -select 1; ---enable_query_log ---enable_result_log +--error 1053,2006,2013 +SELECT 1; --enable_reconnect # this should work, and we should have a new connection_id() -select ((@id := kill_id) - kill_id) from t1; -select @id != connection_id(); +SELECT 1; +let $ignore= `SELECT @id := $ID`; +SELECT @id != CONNECTION_ID(); #make sure the server is still alive connection con2; -select 4; -drop table t1; +SELECT 4; connection default; --error ER_NOT_SUPPORTED_YET -kill (select count(*) from mysql.user); +KILL (SELECT COUNT(*) FROM mysql.user); + +connection con1; +let $ID= `SELECT @id := CONNECTION_ID()`; +connection con2; +let $ignore= `SELECT @id := $ID`; +connection con1; +disable_reconnect; +# Signal when this connection is terminating. +SET DEBUG_SYNC= 'thread_end SIGNAL con1_end'; +# See if we can kill the sync point itself. +# Wait in 'before_do_command_net_read' until killed. +# It doesn't wait for a signal 'kill' but for to be killed. +# The signal name doesn't matter here. +SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read WAIT_FOR kill'; +connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR con1_read'; +# Repeat KILL until con1 terminates. +let $wait_condition= SELECT MY_KILL(@id); +--source include/wait_condition.inc +SET DEBUG_SYNC= 'now WAIT_FOR con1_end'; +SET DEBUG_SYNC = 'RESET'; + +connection con1; +--error 1053,2006,2013 +SELECT 1; +enable_reconnect; +SELECT 1; +let $ignore= `SELECT @id := $ID`; +SELECT @id != CONNECTION_ID(); +connection con2; +SELECT 4; +connection default; # # BUG#14851: killing long running subquery processed via a temporary table. # -create table t1 (id int primary key); -create table t2 (id int unsigned not null); -connect (conn1, localhost, root,,); -connection conn1; +CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT); +CREATE TABLE t2 (id INT UNSIGNED NOT NULL); --- disable_result_log --- disable_query_log -let $1 = 4096; -while ($1) -{ - eval insert into t1 values ($1); - dec $1; -} --- enable_query_log --- enable_result_log +INSERT INTO t1 VALUES +(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0), +(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0), +(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0), +(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0); +INSERT t1 SELECT 0 FROM t1 AS a1, t1 AS a2 LIMIT 4032; -insert into t2 select id from t1; +INSERT INTO t2 SELECT id FROM t1; -create table t3 (kill_id int); -insert into t3 values(connection_id()); - -connect (conn2, localhost, root,,); -connection conn2; +connection con1; +let $ID= `SELECT @id := CONNECTION_ID()`; +connection con2; +let $ignore= `SELECT @id := $ID`; -connection conn1; --- disable_result_log -# This is a very long running query. If this test start failing, it may -# be necessary to change to an even longer query. -send select id from t1 where id in (select distinct a.id from t2 a, t2 b, t2 c, t2 d group by a.id, b.id, c.id, d.id having a.id between 10 and 20); --- enable_result_log +connection con1; +SET DEBUG_SYNC= 'thread_end SIGNAL con1_end'; +SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync'; +# This is a very long running query. If this test start failing, +# it may be necessary to change to an even longer query. +send SELECT id FROM t1 WHERE id IN + (SELECT DISTINCT a.id FROM t2 a, t2 b, t2 c, t2 d + GROUP BY ACOS(1/a.id), b.id, c.id, d.id + HAVING a.id BETWEEN 10 AND 20); -connection conn2; -select ((@id := kill_id) - kill_id) from t3; --- sleep 1 -kill @id; +connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; +KILL @id; +SET DEBUG_SYNC= 'now WAIT_FOR con1_end'; -connection conn1; --- error 1317,2013 +connection con1; +--error 1317,1053,2006,2013 reap; +SELECT 1; connection default; - -drop table t1, t2, t3; - -# End of 4.1 tests +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1, t2; # -# test of blocking of sending ERROR after OK or EOF +# Test of blocking of sending ERROR after OK or EOF # connection con1; -select get_lock("a", 10); +let $ID= `SELECT @id := CONNECTION_ID()`; connection con2; -let $ID= `select connection_id()`; -send select get_lock("a", 10); -real_sleep 2; +let $ignore= `SELECT @id := $ID`; connection con1; -disable_query_log; -eval kill query $ID; -enable_query_log; +SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync WAIT_FOR kill'; +send SELECT ACOS(0); connection con2; -reap; -select 1; +SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; +KILL QUERY @id; connection con1; -select RELEASE_LOCK("a"); +reap; +SELECT 1; +SELECT @id = CONNECTION_ID(); +connection default; +SET DEBUG_SYNC = 'RESET'; # # Bug#27563: Stored functions and triggers wasn't throwing an error when killed. # -create table t1(f1 int); +CREATE TABLE t1 (f1 INT); delimiter |; -create function bug27563() returns int(11) -deterministic -begin - declare continue handler for sqlstate '70100' set @a:= 'killed'; - declare continue handler for sqlexception set @a:= 'exception'; - set @a= get_lock("lock27563", 10); - return 1; -end| +CREATE FUNCTION bug27563() RETURNS INT(11) +DETERMINISTIC +BEGIN + DECLARE CONTINUE HANDLER FOR SQLSTATE '70100' SET @a:= 'killed'; + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception'; + SET DEBUG_SYNC= 'now SIGNAL in_sync WAIT_FOR kill'; + RETURN 1; +END| delimiter ;| # Test stored functions # Test INSERT connection con1; -select get_lock("lock27563",10); +let $ID= `SELECT @id := CONNECTION_ID()`; connection con2; -let $ID= `select connection_id()`; -send insert into t1 values (bug27563()); -real_sleep 2; +let $ignore= `SELECT @id := $ID`; connection con1; -disable_query_log; -eval kill query $ID; -enable_query_log; +send INSERT INTO t1 VALUES (bug27563()); connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; +KILL QUERY @id; +connection con1; --error 1317 reap; -select @a; -connection con1; -select * from t1; +SELECT * FROM t1; +connection default; +SET DEBUG_SYNC = 'RESET'; # Test UPDATE -insert into t1 values(0); -connection con2; -send update t1 set f1= bug27563(); -real_sleep 2; +INSERT INTO t1 VALUES(0); connection con1; -disable_query_log; -eval kill query $ID; -enable_query_log; +send UPDATE t1 SET f1= bug27563(); connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; +KILL QUERY @id; +connection con1; --error 1317 reap; -select @a; -connection con1; -select * from t1; +SELECT * FROM t1; +connection default; +SET DEBUG_SYNC = 'RESET'; # Test DELETE -insert into t1 values(1); -connection con2; -send delete from t1 where bug27563() is null; -real_sleep 2; +INSERT INTO t1 VALUES(1); connection con1; -disable_query_log; -eval kill query $ID; -enable_query_log; +send DELETE FROM t1 WHERE bug27563() IS NULL; connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; +KILL QUERY @id; +connection con1; --error 1317 reap; -select @a; -connection con1; -select * from t1; +SELECT * FROM t1; +connection default; +SET DEBUG_SYNC = 'RESET'; # Test SELECT -connection con2; -send select * from t1 where f1= bug27563(); -real_sleep 2; connection con1; -disable_query_log; -eval kill query $ID; -enable_query_log; +send SELECT * FROM t1 WHERE f1= bug27563(); connection con2; ---error 1317 -reap; -select @a; - -# Test PROCEDURE -connection con2; -delimiter |; -create procedure proc27563() -begin - declare continue handler for sqlstate '70100' set @a:= 'killed'; - declare continue handler for sqlexception set @a:= 'exception'; - select get_lock("lock27563",10); - select "shouldn't be selected"; -end| -delimiter ;| -send call proc27563(); -real_sleep 2; +SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; +KILL QUERY @id; connection con1; -disable_query_log; -eval kill query $ID; -enable_query_log; -connection con2; --error 1317 reap; -select @a; +SELECT * FROM t1; +connection default; +SET DEBUG_SYNC = 'RESET'; +DROP FUNCTION bug27563; # Test TRIGGERS -connection con2; -create table t2 (f2 int); +CREATE TABLE t2 (f2 INT); delimiter |; -create trigger trg27563 before insert on t1 for each row -begin - declare continue handler for sqlstate '70100' set @a:= 'killed'; - declare continue handler for sqlexception set @a:= 'exception'; - set @a:= get_lock("lock27563",10); - insert into t2 values(1); -end| +CREATE TRIGGER trg27563 BEFORE INSERT ON t1 FOR EACH ROW +BEGIN + DECLARE CONTINUE HANDLER FOR SQLSTATE '70100' SET @a:= 'killed'; + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception'; + INSERT INTO t2 VALUES(0); + SET DEBUG_SYNC= 'now SIGNAL in_sync WAIT_FOR kill'; + INSERT INTO t2 VALUES(1); +END| delimiter ;| -send insert into t1 values(2),(3); -real_sleep 2; connection con1; -disable_query_log; -eval kill query $ID; -enable_query_log; +send INSERT INTO t1 VALUES(2),(3); connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; +KILL QUERY @id; +connection con1; --error 1317 reap; -select @a; -connection con1; -select * from t1; -select * from t2; - -# Cleanup -select release_lock("lock27563"); -drop table t1, t2; -drop function bug27563; -drop procedure proc27563; +SELECT * FROM t1; +SELECT * FROM t2; +connection default; +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1, t2; # # Bug#28598: mysqld crash when killing a long-running explain query. # ---disable_query_log connection con1; -let $ID= `select connection_id()`; +let $ID= `SELECT @id := CONNECTION_ID()`; +connection con2; +let $ignore= `SELECT @id := $ID`; +connection con1; +--disable_query_log let $tab_count= 40; let $i= $tab_count; while ($i) { - eval CREATE TABLE t$i (a$i int, KEY(a$i)); + eval CREATE TABLE t$i (a$i INT, KEY(a$i)); eval INSERT INTO t$i VALUES (1),(2),(3),(4),(5),(6),(7); dec $i ; } -set session optimizer_search_depth=0; +SET SESSION optimizer_search_depth=0; let $i=$tab_count; while ($i) { - let $a= a$i; - let $t= t$i; - dec $i; - if ($i) - { - let $comma=,; - let $from=$comma$t$from; - let $where=a$i=$a $and $where; - } - if (!$i) - { - let $from=FROM $t$from; - let $where=WHERE $where; - } - let $and=AND; + let $a= a$i; + let $t= t$i; + dec $i; + if ($i) + { + let $comma=,; + let $from=$comma$t$from; + let $where=a$i=$a $and $where; + } + if (!$i) + { + let $from=FROM $t$from; + let $where=WHERE $where; + } + let $and=AND; } --enable_query_log +SET DEBUG_SYNC= 'before_join_optimize SIGNAL in_sync'; eval PREPARE stmt FROM 'EXPLAIN SELECT * $from $where'; send EXECUTE stmt; ---disable_query_log connection con2; -real_sleep 2; -eval kill query $ID; +SET DEBUG_SYNC= 'now WAIT_FOR in_sync'; +KILL QUERY @id; +connection con1; +--error 1317 +reap; +--disable_query_log let $i= $tab_count; while ($i) { @@ -309,8 +328,8 @@ while ($i) dec $i ; } --enable_query_log - -########################################################################### +connection default; +SET DEBUG_SYNC = 'RESET'; --echo # --echo # Bug#19723: kill of active connection yields different error code @@ -318,16 +337,27 @@ while ($i) --echo # --echo ---echo # Connection: con2. ---connection con2 - -KILL CONNECTION_ID(); +--echo # Connection: con1. +--connection con1 +let $ID= `SELECT @id := CONNECTION_ID()`; +SET DEBUG_SYNC= 'thread_end SIGNAL con1_end'; +--disable_reconnect +--error ER_QUERY_INTERRUPTED +KILL @id; ---echo # CR_SERVER_LOST, CR_SERVER_GONE_ERROR, depending on the timing ---echo # of close of the connection socket ---error 2013, 2006 +connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR con1_end'; +connection con1; +--echo # ER_SERVER_SHUTDOWN, CR_SERVER_GONE_ERROR, CR_SERVER_LOST, +--echo # depending on the timing of close of the connection socket +--error 1053,2006,2013 +SELECT 1; +--enable_reconnect SELECT 1; ---connection default +let $ignore= `SELECT @id := $ID`; +SELECT @id != CONNECTION_ID(); +connection default; +SET DEBUG_SYNC = 'RESET'; --echo # --echo # Additional test for WL#3726 "DDL locking for all metadata objects" @@ -489,28 +519,26 @@ connection ddl; --echo # Switching to connection 'blocker' connection blocker; unlock tables; -drop table t2; -create table t2 (k int); lock tables t1 read; --echo # Switching to connection 'ddl' connection ddl; # Let us add pending exclusive metadata lock on t2 ---send rename tables t1 to t3, t2 to t1 +--send truncate table t1 --echo # Switching to connection 'dml' connection dml; let $wait_condition= select count(*) = 1 from information_schema.processlist where state = "Waiting for table metadata lock" and - info = "rename tables t1 to t3, t2 to t1"; + info = "truncate table t1"; --source include/wait_condition.inc let $ID2= `select connection_id()`; ---send insert into t2 values (1) +--send insert into t1 values (1) --echo # Switching to connection 'default' connection default; let $wait_condition= select count(*) = 1 from information_schema.processlist where state = "Waiting for table metadata lock" and - info = "insert into t2 values (1)"; + info = "insert into t1 values (1)"; --source include/wait_condition.inc --replace_result $ID2 ID2 eval kill query $ID2; @@ -564,10 +592,10 @@ connection ddl; --echo # Cleanup. --echo # Switching to connection 'default' connection default; -drop table t3; drop table t1; +drop table t2; ########################################################################### -# Restore global concurrent_insert value. Keep in the end of the test file. -set @@global.concurrent_insert= @old_concurrent_insert; +SET DEBUG_SYNC = 'RESET'; +DROP FUNCTION MY_KILL; diff --git a/mysql-test/t/lock_multi.test b/mysql-test/t/lock_multi.test index 6bdb235903d..5bab5e647ab 100644 --- a/mysql-test/t/lock_multi.test +++ b/mysql-test/t/lock_multi.test @@ -228,7 +228,7 @@ connection writer; # Sleep a bit till the flush of connection locker is in work and hangs let $wait_condition= select count(*) = 1 from information_schema.processlist - where state = "Waiting for global metadata lock" and + where state = "Waiting for global read lock" and info = "FLUSH TABLES WITH READ LOCK"; --source include/wait_condition.inc # This must not block. @@ -260,7 +260,7 @@ connection writer; # Sleep a bit till the flush of connection locker is in work and hangs let $wait_condition= select count(*) = 1 from information_schema.processlist - where state = "Waiting for global metadata lock" and + where state = "Waiting for global read lock" and info = "FLUSH TABLES WITH READ LOCK"; --source include/wait_condition.inc --error ER_TABLE_NOT_LOCKED @@ -296,10 +296,11 @@ DROP DATABASE mysqltest_1; # With bug in place: try to acquire LOCK_mysql_create_table... # When fixed: Reject dropping db because of the read lock. connection con1; -# Wait a bit so that the session con2 is in state "Waiting for release of readlock" +# Wait a bit so that the session con2 is in state +# "Waiting for global read lock" let $wait_condition= select count(*) = 1 from information_schema.processlist - where state = "Waiting for release of readlock" + where state = "Waiting for global read lock" and info = "DROP DATABASE mysqltest_1"; --source include/wait_condition.inc --error ER_CANT_UPDATE_WITH_READLOCK @@ -376,7 +377,7 @@ connection con5; --echo # con5 let $wait_condition= select count(*) = 1 from information_schema.processlist - where state = "Waiting for global metadata lock" and + where state = "Waiting for global read lock" and info = "flush tables with read lock"; --source include/wait_condition.inc --echo # global read lock is taken @@ -384,10 +385,11 @@ connection con3; --echo # con3 send select * from t2 for update; connection con5; -let $show_statement= SHOW PROCESSLIST; -let $field= State; -let $condition= = 'Waiting for release of readlock'; ---source include/wait_show_condition.inc +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for global read lock" and + info = "select * from t2 for update"; +--source include/wait_condition.inc --echo # waiting for release of read lock connection con4; --echo # con4 @@ -433,10 +435,11 @@ connection con1; send update t2 set a = 1; connection default; --echo # default -let $show_statement= SHOW PROCESSLIST; -let $field= State; -let $condition= = 'Waiting for release of readlock'; ---source include/wait_show_condition.inc +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for global read lock" and + info = "update t2 set a = 1"; +--source include/wait_condition.inc --echo # statement is waiting for release of read lock connection con2; --echo # con2 @@ -460,10 +463,11 @@ connection con1; send lock tables t2 write; connection default; --echo # default -let $show_statement= SHOW PROCESSLIST; -let $field= State; -let $condition= = 'Waiting for release of readlock'; ---source include/wait_show_condition.inc +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = "Waiting for global read lock" and + info = "lock tables t2 write"; +--source include/wait_condition.inc --echo # statement is waiting for release of read lock connection con2; --echo # con2 @@ -571,7 +575,8 @@ connection default; --echo connection: default let $wait_condition= select count(*) = 1 from information_schema.processlist - where state = "Waiting for global metadata lock"; + where state = "Waiting for global read lock" and + info = "flush tables with read lock"; --source include/wait_condition.inc alter table t1 add column j int; connect (insert,localhost,root,,test,,); @@ -579,14 +584,16 @@ connection insert; --echo connection: insert let $wait_condition= select count(*) = 1 from information_schema.processlist - where state = "Waiting for global metadata lock"; + where state = "Waiting for global read lock" and + info = "flush tables with read lock"; --source include/wait_condition.inc --send insert into t1 values (1,2); --echo connection: default connection default; let $wait_condition= select count(*) = 1 from information_schema.processlist - where state = "Waiting for release of readlock"; + where state = "Waiting for global read lock" and + info = "insert into t1 values (1,2)"; --source include/wait_condition.inc unlock tables; connection flush; @@ -594,7 +601,8 @@ connection flush; --reap let $wait_condition= select count(*) = 1 from information_schema.processlist - where state = "Waiting for release of readlock"; + where state = "Waiting for global read lock" and + info = "insert into t1 values (1,2)"; --source include/wait_condition.inc select * from t1; unlock tables; @@ -629,12 +637,12 @@ connection default; --echo connection: default let $wait_condition= select count(*) = 1 from information_schema.processlist - where state = "Waiting for global metadata lock"; + where state = "Waiting for global read lock"; --source include/wait_condition.inc flush tables; let $wait_condition= select count(*) = 1 from information_schema.processlist - where state = "Waiting for global metadata lock"; + where state = "Waiting for global read lock"; --source include/wait_condition.inc unlock tables; connection flush; @@ -698,12 +706,12 @@ connection default; --echo connection: default let $wait_condition= select count(*) = 1 from information_schema.processlist - where state = "Waiting for global metadata lock"; + where state = "Waiting for global read lock"; --source include/wait_condition.inc flush tables; let $wait_condition= select count(*) = 1 from information_schema.processlist - where state = "Waiting for global metadata lock"; + where state = "Waiting for global read lock"; --source include/wait_condition.inc drop table t1; connection flush; diff --git a/mysql-test/t/mdl_sync.test b/mysql-test/t/mdl_sync.test index 5c4fc20b428..197cad536e4 100644 --- a/mysql-test/t/mdl_sync.test +++ b/mysql-test/t/mdl_sync.test @@ -3661,7 +3661,7 @@ connection con2; SET DEBUG_SYNC= 'now WAIT_FOR table_opened'; --echo # Check that FLUSH must wait to get the GRL --echo # and let CREATE PROCEDURE continue -SET DEBUG_SYNC= 'wait_lock_global_read_lock SIGNAL grlwait'; +SET DEBUG_SYNC= 'mdl_acquire_lock_wait SIGNAL grlwait'; --send FLUSH TABLES WITH READ LOCK --echo # Connection 1 @@ -3689,15 +3689,22 @@ connection con2; SET DEBUG_SYNC= 'now WAIT_FOR table_opened'; --echo # Check that FLUSH must wait to get the GRL --echo # and let DROP PROCEDURE continue -SET DEBUG_SYNC= 'wait_lock_global_read_lock SIGNAL grlwait'; +SET DEBUG_SYNC= 'mdl_acquire_lock_wait SIGNAL grlwait'; --send FLUSH TABLES WITH READ LOCK --echo # Connection 1 connection default; +--echo # Once FLUSH TABLES WITH READ LOCK starts waiting +--echo # DROP PROCEDURE will be waked up and will drop +--echo # procedure. Global read lock will be granted after +--echo # this statement ends. +--echo # +--echo # Reaping DROP PROCEDURE. --reap --echo # Connection 2 connection con2; +--echo # Reaping FTWRL. --reap UNLOCK TABLES; @@ -4485,7 +4492,7 @@ connection con2; --echo # Connection default connection default; let $wait_condition=SELECT COUNT(*)=1 FROM information_schema.processlist - WHERE state='Waiting for release of readlock' + WHERE state='Waiting for global read lock' AND info='CREATE TABLE db1.t2(a INT)'; --source include/wait_condition.inc UNLOCK TABLES; @@ -4507,7 +4514,7 @@ connection con2; --echo # Connection default connection default; let $wait_condition=SELECT COUNT(*)=1 FROM information_schema.processlist - WHERE state='Waiting for release of readlock' + WHERE state='Waiting for global read lock' AND info='ALTER DATABASE db1 DEFAULT CHARACTER SET utf8'; --source include/wait_condition.inc UNLOCK TABLES; diff --git a/mysql-test/t/mysqltest.test b/mysql-test/t/mysqltest.test index a8804ecaf34..427cfa598ae 100644 --- a/mysql-test/t/mysqltest.test +++ b/mysql-test/t/mysqltest.test @@ -854,6 +854,13 @@ let $var2= `failing query`; echo $var2; EOF +create table t1 (a varchar(100)); +insert into t1 values ('`select 42`'); +let $a= `select * from t1`; +# This should output `select 42`, not evaluate it again to 42 +echo $a; +drop table t1; + --error 1 --exec $MYSQL_TEST < $MYSQLTEST_VARDIR/tmp/let.sql 2>&1 @@ -1134,6 +1141,11 @@ if (!$counter) { echo Counter is not 0, (counter=10); } +if (! $counter) +{ + let $counter=5; +} +echo Counter should still be 10, is $counter; let $counter=0; if($counter) { @@ -1143,6 +1155,10 @@ if (!$counter) { echo Counter is not 0, (counter=0); } +if (! $counter) +{ + echo Not space var works; +} # ---------------------------------------------------------------------------- # Test if with some non-numerics @@ -1163,10 +1179,11 @@ if ($counter) { echo oops, -0 is true; } -if (beta) -{ - echo Beta is true; -} +# This is no longer allowed, as a precaution against mistyped conditionals +# if (beta) +# { +# echo Beta is true; +# } let $counter=gamma; while ($counter) { @@ -1175,6 +1192,179 @@ while ($counter) } # ---------------------------------------------------------------------------- +# Test if with compare conditions +# ---------------------------------------------------------------------------- + +let $ifvar= 5; +let $ifvar2= 6; + +if ($ifvar < 7) +{ + echo 5<7; +} +if ($ifvar< 7) +{ + echo 5<7 again; +} +if ($ifvar<7) +{ + echo 5<7 still; +} +if ($ifvar < $ifvar2) +{ + echo 5<6; +} +if ($ifvar <= 4) +{ + echo 5<=4; +} +if ($ifvar >= 5) +{ + echo 5>=5; +} +if ($ifvar>=5) +{ + echo 5>=5 again; +} +if ($ifvar > 3) +{ + echo 5>3; +} +if ($ifvar == 4) +{ + echo 5==4; +} +if ($ifvar == 5) +{ + echo 5==5; +} +if ($ifvar != 8) +{ + echo 5!=8; +} +# Any number should compare unequal to any string +if ($ifvar != five) +{ + echo 5!=five; +} +if ($ifvar == `SELECT 3+2`) +{ + echo 5==3+2; +} +if ($ifvar == 5) +{ + echo 5 == 5; +} +let $ifvar= hello; +if ($ifvar == hello there) +{ + echo hello == hello there; +} +if ($ifvar == hello) +{ + echo hello == hello; +} +if ($ifvar == hell) +{ + echo hello == hell; +} +if ($ifvar == hello) +{ + echo hello == hello; +} +if ($ifvar != goodbye) +{ + echo hello != goodbye; +} + +let $ifvar= two words; +if ($ifvar == two words) +{ + echo two words; +} +if ($ifvar == `SELECT 'two words'`) +{ + echo two words are two words; +} +if (42) +{ + echo right answer; +} +if (0) +{ + echo wrong answer; +} +# Non-empty string treated as 'true' +if (`SELECT 'something'`) +{ + echo anything goes; +} +# Make sure 0 and string compare right +let $ifvar= 0; +if ($ifvar == string) +{ + echo 0 == string; +} +if ($ifvar != string) +{ + echo 0 != string; +} +--write_file $MYSQL_TMP_DIR/mysqltest.sql +let $var= 5; +if ($var >= four) +{ + echo 5>=four; +} +EOF +--error 1 +--exec $MYSQL_TEST < $MYSQL_TMP_DIR/mysqltest.sql 2>&1 +remove_file $MYSQL_TMP_DIR/mysqltest.sql; + +--write_file $MYSQL_TMP_DIR/mysqltest.sql +let $var= 5; +if ($var ~= 6) +{ + echo 5~=6; +} +EOF +--error 1 +--exec $MYSQL_TEST < $MYSQL_TMP_DIR/mysqltest.sql 2>&1 +remove_file $MYSQL_TMP_DIR/mysqltest.sql; + +--write_file $MYSQL_TMP_DIR/mysqltest.sql +let $var= text; +if (var == text) +{ + echo Oops I forgot the $; +} +EOF +--error 1 +--exec $MYSQL_TEST < $MYSQL_TMP_DIR/mysqltest.sql 2>&1 +remove_file $MYSQL_TMP_DIR/mysqltest.sql; + +# ---------------------------------------------------------------------------- +# Test while with compare conditions +# ---------------------------------------------------------------------------- + +let $counter= 2; + +while ($counter < 5) +{ + echo counter is $counter; + inc $counter; +} +let $ifvar=; +while ($ifvar != stop) +{ + if ($counter >= 7) + { + let $ifvar= stop; + } + echo counter is $counter; + inc $counter; +} + +# ---------------------------------------------------------------------------- # Test while, { and } # ---------------------------------------------------------------------------- @@ -2438,15 +2628,15 @@ let $count= 0; while ($run) { let $Field= query_get_value($show_statement, Field, $rowno); - if (`SELECT '$Field' = 'No such row'`) + if ($Field == No such row) { let $run= 0; } - if (`SELECT '$Field' <> 'No such row'`) + if ($Field != No such row) { let $Type= query_get_value($show_statement, Type, $rowno); let $Null= query_get_value($show_statement, Null, $rowno); - if (`SELECT '$Null' = 'YES'`) + if ($Null == YES) { inc $count; } @@ -2531,26 +2721,6 @@ rmdir $MYSQLTEST_VARDIR/tmp/testdir; --replace_result c:\\a.txt z SELECT 'c:\\a.txt' AS col; -# -# Bug#32307 mysqltest - does not detect illegal if syntax -# - -let $test= 1; -if ($test){ - echo hej; -} - ---write_file $MYSQLTEST_VARDIR/tmp/mysqltest.sql -if ($mysql_errno != 1436) -{ - echo ^ Should not be allowed! -} -EOF ---error 1 ---exec $MYSQL_TEST < $MYSQLTEST_VARDIR/tmp/mysqltest.sql 2>&1 -remove_file $MYSQLTEST_VARDIR/tmp/mysqltest.sql; - - # ---------------------------------------------------------------------------- # Test that -- is not allowed as comment, only as mysqltest builtin command # ---------------------------------------------------------------------------- diff --git a/mysql-test/t/named_pipe.test b/mysql-test/t/named_pipe.test index e88fd8e1ef8..0e6c963024f 100644 --- a/mysql-test/t/named_pipe.test +++ b/mysql-test/t/named_pipe.test @@ -5,7 +5,7 @@ # Only run this test if named pipe is avaliable let $nmp= query_get_value("SHOW VARIABLES LIKE 'named_pipe'", Value, 1); -if (`SELECT '$nmp' != 'ON'`){ +if ($nmp != ON){ skip No named pipe support; } diff --git a/mysql-test/t/partition_debug_sync.test b/mysql-test/t/partition_debug_sync.test index cde94856ae6..448cec652d7 100644 --- a/mysql-test/t/partition_debug_sync.test +++ b/mysql-test/t/partition_debug_sync.test @@ -38,7 +38,7 @@ connection default; --echo # Con default SET DEBUG_SYNC= 'now WAIT_FOR removing_partitioning'; SET DEBUG_SYNC= 'mdl_acquire_lock_wait SIGNAL waiting_for_alter'; -SET DEBUG_SYNC= 'rm_table_part2_before_delete_table WAIT_FOR partitioning_removed'; +SET DEBUG_SYNC= 'rm_table_no_locks_before_delete_table WAIT_FOR partitioning_removed'; DROP TABLE IF EXISTS t1; --echo # Con 1 connection con1; @@ -70,12 +70,12 @@ SET DEBUG_SYNC= 'alter_table_before_rename_result_table WAIT_FOR delete_done'; --send ALTER TABLE t2 REMOVE PARTITIONING connection default; --echo # Con default -SET SESSION debug= "+d,sleep_before_part2_delete_table"; +SET SESSION debug= "+d,sleep_before_no_locks_delete_table"; SET DEBUG_SYNC= 'now WAIT_FOR removing_partitions'; -SET DEBUG_SYNC= 'rm_table_part2_before_delete_table SIGNAL waiting_for_alter'; -SET DEBUG_SYNC= 'rm_table_part2_before_binlog SIGNAL delete_done'; +SET DEBUG_SYNC= 'rm_table_no_locks_before_delete_table SIGNAL waiting_for_alter'; +SET DEBUG_SYNC= 'rm_table_no_locks_before_binlog SIGNAL delete_done'; DROP TABLE IF EXISTS t2; -SET SESSION debug= "-d,sleep_before_part2_delete_table"; +SET SESSION debug= "-d,sleep_before_no_locks_delete_table"; --echo # Con 1 connection con1; --error ER_NO_SUCH_TABLE diff --git a/mysql-test/t/partition_innodb.test b/mysql-test/t/partition_innodb.test index 21769a8b944..86bbe359873 100644 --- a/mysql-test/t/partition_innodb.test +++ b/mysql-test/t/partition_innodb.test @@ -607,3 +607,24 @@ SET SESSION sql_mode = 'NO_ZERO_DATE'; OPTIMIZE TABLE t1; SET SESSION sql_mode = @old_mode; DROP TABLE t1; + + +--echo # +--echo # Bug#57985 "ONLINE/FAST ALTER PARTITION can fail and leave the +--echo # table unusable". +--echo # +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +CREATE TABLE t1 (a bigint not null, b int not null, PRIMARY KEY (a)) + ENGINE = InnoDB PARTITION BY KEY(a) PARTITIONS 2; +INSERT INTO t1 values (0,1), (1,2); +--echo # The below ALTER should fail. It should leave the +--echo # table in its original, non-corrupted, usable state. +--error ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF +ALTER TABLE t1 ADD UNIQUE KEY (b); +--echo # The below statements should succeed, as ALTER should +--echo # have left table intact. +SHOW CREATE TABLE t1; +SELECT * FROM t1; +DROP TABLE t1; diff --git a/mysql-test/t/plugin_auth.test b/mysql-test/t/plugin_auth.test index 439cabaef18..3b1dd93c4d1 100644 --- a/mysql-test/t/plugin_auth.test +++ b/mysql-test/t/plugin_auth.test @@ -1,5 +1,6 @@ --source include/have_plugin_auth.inc --source include/not_embedded.inc +--source include/mysql_upgrade_preparation.inc query_vertical SELECT PLUGIN_STATUS, PLUGIN_TYPE, PLUGIN_DESCRIPTION FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME='test_plugin_server'; @@ -335,3 +336,62 @@ GRANT PROXY ON standard_user TO ''@''; DROP USER ''@''; DROP USER standard_user; DROP DATABASE shared; + + +--echo # +--echo # Bug #57551 : Live upgrade fails between 5.1.52 -> 5.5.7-rc +--echo # + +CALL mtr.add_suppression("Missing system table mysql.proxies_priv."); + +DROP TABLE mysql.proxies_priv; + +--echo # Must come back with mysql.proxies_priv absent. +--source include/restart_mysqld.inc + +--error ER_NO_SUCH_TABLE +SELECT * FROM mysql.proxies_priv; + +CREATE USER u1@localhost; +GRANT ALL PRIVILEGES ON *.* TO u1@localhost; +REVOKE ALL PRIVILEGES ON *.* FROM u1@localhost; +GRANT ALL PRIVILEGES ON *.* TO u1@localhost; + +CREATE USER u2@localhost; +GRANT ALL PRIVILEGES ON *.* TO u2@localhost; + +--echo # access denied because of no privileges to root +--error ER_ACCESS_DENIED_NO_PASSWORD_ERROR +GRANT PROXY ON u2@localhost TO u1@localhost; + +--echo # access denied because of no privileges to root +--error ER_ACCESS_DENIED_NO_PASSWORD_ERROR +REVOKE PROXY ON u2@localhost FROM u1@localhost; + +--echo # go try graning proxy on itself, so that it will need the table +connect(proxy_granter_con,localhost,u2,); +connection proxy_granter_con; + +--error ER_NO_SUCH_TABLE +GRANT PROXY ON u2@localhost TO u1@localhost; +--error ER_NO_SUCH_TABLE +REVOKE PROXY ON u2@localhost FROM u1@localhost; + +connection default; +disconnect proxy_granter_con; + +--echo # test if REVOKE works without the proxies_priv table +REVOKE ALL PRIVILEGES ON *.* FROM u1@localhost, u2@localhost; + +--echo # test if DROP USER work without the proxies_priv table +DROP USER u1@localhost,u2@localhost; + +--echo # test if FLUSH PRIVILEGES works without the proxies_priv table +FLUSH PRIVILEGES; + +--exec $MYSQL_UPGRADE --skip-verbose --force 2>&1 +--query_vertical SELECT Host,User,Proxied_host,Proxied_user,With_grant FROM mysql.proxies_priv + +FLUSH PRIVILEGES; + +--echo End of 5.5 tests diff --git a/mysql-test/t/shm.test b/mysql-test/t/shm.test index 567caa4989a..0f880e58741 100644 --- a/mysql-test/t/shm.test +++ b/mysql-test/t/shm.test @@ -4,7 +4,7 @@ # Only run this test if shared memory is avaliable let $shm= query_get_value("SHOW VARIABLES LIKE 'shared_memory'", Value, 1); -if (`SELECT '$shm' != 'ON'`){ +if ($shm != ON){ skip No shm support; } let $shm_name= query_get_value("SHOW GLOBAL VARIABLES LIKE 'shared_memory_base_name'", Value, 1); diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test index fa9dc7472fe..fc3cfc76939 100644 --- a/mysql-test/t/show_check.test +++ b/mysql-test/t/show_check.test @@ -1328,3 +1328,30 @@ disconnect con1; # Wait till all disconnects are completed --source include/wait_until_count_sessions.inc +--echo # +--echo # Bug#57306 SHOW PROCESSLIST does not display string literals well. +--echo # + +SET NAMES latin1; +SELECT GET_LOCK('t', 1000); +--connect (con1,localhost,root,,) +--connection con1 +SET NAMES latin1; +--send SELECT GET_LOCK('t',1000) AS 'óóóó'; +--connection default +# Make sure con1 has switched from "SET NAMES" to "SELECT GET_LOCK" +let $wait_timeout= 10; +let $wait_condition= SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO LIKE '%GET_LOCK%' AND ID != CONNECTION_ID(); +--source include/wait_condition.inc +--replace_column 1 ### 3 ### 6 ### 7 ### +SHOW PROCESSLIST; +SET NAMES utf8; +--replace_column 1 ### 3 ### 6 ### 7 ### +SHOW PROCESSLIST; +SELECT RELEASE_LOCK('t'); +--connection con1 +--reap +--disconnect con1 +--connection default +SET NAMES latin1; + diff --git a/mysql-test/t/sp-lock.test b/mysql-test/t/sp-lock.test index be8369d6994..6284169eb9b 100644 --- a/mysql-test/t/sp-lock.test +++ b/mysql-test/t/sp-lock.test @@ -972,5 +972,170 @@ DROP PROCEDURE p1; --echo # +--echo # Bug#57663 Concurrent statement using stored function and DROP DATABASE +--echo # breaks SBR +--echo # + +--disable_warnings +DROP DATABASE IF EXISTS db1; +DROP FUNCTION IF EXISTS f1; +--enable_warnings + +connect(con1, localhost, root); +connect(con2, localhost, root); + +--echo # Test 1: Check that DROP DATABASE block if a function is used +--echo # by an active transaction. + +--echo # Connection default +connection default; +CREATE DATABASE db1; +CREATE FUNCTION db1.f1() RETURNS INTEGER RETURN 1; +START TRANSACTION; +SELECT db1.f1(); + +--echo # Connection con1 +connection con1; +--echo # Sending: +--send DROP DATABASE db1 + +--echo # Connection default +connection default; +--echo # Waiting for DROP DATABASE to be blocked by the lock on f1() +let $wait_condition= SELECT COUNT(*)= 1 FROM information_schema.processlist + WHERE state= 'Waiting for stored function metadata lock' + AND info='DROP DATABASE db1'; +--source include/wait_condition.inc +COMMIT; + +--echo # Connection con1 +connection con1; +--echo # Reaping: DROP DATABASE db1 +--reap + +--echo # Test 2: Check that DROP DATABASE blocks if a procedure is +--echo # used by an active transaction. + +--echo # Connection default +connection default; +CREATE DATABASE db1; +CREATE PROCEDURE db1.p1() BEGIN END; +delimiter |; +CREATE FUNCTION f1() RETURNS INTEGER +BEGIN + CALL db1.p1(); + RETURN 1; +END| +delimiter ;| +START TRANSACTION; +SELECT f1(); + +--echo # Connection con1 +connection con1; +--echo # Sending: +--send DROP DATABASE db1 + +--echo # Connection default +connection default; +--echo # Waiting for DROP DATABASE to be blocked by the lock on p1() +let $wait_condition= SELECT COUNT(*)= 1 FROM information_schema.processlist + WHERE state= 'Waiting for stored procedure metadata lock' + AND info='DROP DATABASE db1'; +--source include/wait_condition.inc +COMMIT; + +--echo # Connection con1 +connection con1; +--echo # Reaping: DROP DATABASE db1 +--reap + +--echo # Test 3: Check that DROP DATABASE is not selected as a victim if a +--echo # deadlock is discovered with DML statements. + +--echo # Connection default +connection default; +CREATE DATABASE db1; +CREATE TABLE db1.t1 (a INT); +CREATE FUNCTION db1.f1() RETURNS INTEGER RETURN 1; +START TRANSACTION; +# DROP DATABASE will lock tables (t1) before functions (f1) +SELECT db1.f1(); + +--echo # Connection con1 +connection con1; +--echo # Sending: +--send DROP DATABASE db1 + +--echo # Connection default +connection default; +--echo # Waiting for DROP DATABASE to be blocked by the lock on f1() +let $wait_condition= SELECT COUNT(*)= 1 FROM information_schema.processlist + WHERE state= 'Waiting for stored function metadata lock' + AND info='DROP DATABASE db1'; +--source include/wait_condition.inc +--error ER_LOCK_DEADLOCK +SELECT * FROM db1.t1; +COMMIT; + +--echo # Connection con1 +connection con1; +--echo # Reaping: DROP DATABASE db1 +--reap + +--echo # Test 4: Check that active DROP DATABASE blocks stored routine DDL. + +--echo # Connection default +connection default; +CREATE DATABASE db1; +CREATE FUNCTION db1.f1() RETURNS INTEGER RETURN 1; +CREATE FUNCTION db1.f2() RETURNS INTEGER RETURN 2; +START TRANSACTION; +SELECT db1.f2(); + +--echo # Connection con1 +connection con1; +--echo # Sending: +--send DROP DATABASE db1 + +--echo # Connection con2 +connection con2; +--echo # Waiting for DROP DATABASE to be blocked by the lock on f2() +let $wait_condition= SELECT COUNT(*)= 1 FROM information_schema.processlist + WHERE state= 'Waiting for stored function metadata lock' + AND info='DROP DATABASE db1'; +--source include/wait_condition.inc +--echo # Sending: +--send ALTER FUNCTION db1.f1 COMMENT "test" + +--echo # Connection default +connection default; +--echo # Waiting for ALTER FUNCTION to be blocked by the schema lock on db1 +let $wait_condition= SELECT COUNT(*)= 1 FROM information_schema.processlist + WHERE state= 'Waiting for schema metadata lock' + AND info='ALTER FUNCTION db1.f1 COMMENT "test"'; +--source include/wait_condition.inc +COMMIT; + +--echo # Connection con1 +connection con1; +--echo # Reaping: DROP DATABASE db1 +--reap +disconnect con1; +--source include/wait_until_disconnected.inc + +--echo # Connection con2 +connection con2; +--echo # Reaping: ALTER FUNCTION f1 COMMENT 'test' +--error ER_SP_DOES_NOT_EXIST +--reap +disconnect con2; +--source include/wait_until_disconnected.inc + +--echo # Connection default +connection default; +DROP FUNCTION f1; + + +--echo # --echo # End of 5.5 tests --echo # diff --git a/mysql-test/t/system_mysql_db_fix40123.test b/mysql-test/t/system_mysql_db_fix40123.test index 8c2060d76ba..7a96f22e0d1 100644 --- a/mysql-test/t/system_mysql_db_fix40123.test +++ b/mysql-test/t/system_mysql_db_fix40123.test @@ -3,7 +3,7 @@ # Don't run this test if $MYSQL_FIX_PRIVILEGE_TABLES isn't set # to the location of mysql_fix_privilege_tables.sql -if (`SELECT LENGTH("$MYSQL_FIX_PRIVILEGE_TABLES") <= 0`) +if (!$MYSQL_FIX_PRIVILEGE_TABLES) { skip Test need MYSQL_FIX_PRIVILEGE_TABLES; } diff --git a/mysql-test/t/system_mysql_db_fix50030.test b/mysql-test/t/system_mysql_db_fix50030.test index 7d55a091b6d..8adf0a09b22 100644 --- a/mysql-test/t/system_mysql_db_fix50030.test +++ b/mysql-test/t/system_mysql_db_fix50030.test @@ -3,7 +3,7 @@ # Don't run this test if $MYSQL_FIX_PRIVILEGE_TABLES isn't set # to the location of mysql_fix_privilege_tables.sql -if (`SELECT LENGTH("$MYSQL_FIX_PRIVILEGE_TABLES") <= 0`) +if (!$MYSQL_FIX_PRIVILEGE_TABLES) { skip Test needs MYSQL_FIX_PRIVILEGE_TABLES; } diff --git a/mysql-test/t/system_mysql_db_fix50117.test b/mysql-test/t/system_mysql_db_fix50117.test index 260400b9c8a..9aeb654716c 100644 --- a/mysql-test/t/system_mysql_db_fix50117.test +++ b/mysql-test/t/system_mysql_db_fix50117.test @@ -3,7 +3,7 @@ # Don't run this test if $MYSQL_FIX_PRIVILEGE_TABLES isn't set # to the location of mysql_fix_privilege_tables.sql -if (`SELECT LENGTH("$MYSQL_FIX_PRIVILEGE_TABLES") <= 0`) +if (!$MYSQL_FIX_PRIVILEGE_TABLES) { skip Test needs MYSQL_FIX_PRIVILEGE_TABLES; } diff --git a/mysql-test/t/trigger_notembedded.test b/mysql-test/t/trigger_notembedded.test index 89857063ebd..536b00308ab 100644 --- a/mysql-test/t/trigger_notembedded.test +++ b/mysql-test/t/trigger_notembedded.test @@ -896,7 +896,7 @@ connection default; --echo connection: default let $wait_condition= select count(*) = 1 from information_schema.processlist - where state = "Waiting for global metadata lock"; + where state = "Waiting for global read lock"; --source include/wait_condition.inc create trigger t1_bi before insert on t1 for each row begin end; unlock tables; diff --git a/mysql-test/t/xml.test b/mysql-test/t/xml.test index a8917fc9fe7..1dc5eadbccc 100644 --- a/mysql-test/t/xml.test +++ b/mysql-test/t/xml.test @@ -617,15 +617,43 @@ FROM t1 ORDER BY t1.id; DROP TABLE t1; + --echo # --echo # Bug#57257 Replace(ExtractValue(...)) causes MySQL crash --echo # SET NAMES utf8; SELECT REPLACE(EXTRACTVALUE('1', '/a'),'ds',''); + --echo # --echo # Bug #57820 extractvalue crashes --echo # SELECT AVG(DISTINCT EXTRACTVALUE((''),('$@k'))); + +--echo # +--echo # Bug#57279 updatexml dies with: Assertion failed: str_arg[length] == 0 +--echo # + +--error ER_ILLEGAL_VALUE_FOR_TYPE +SELECT UPDATEXML(NULL, (LPAD(0.1111E-15, '2011', 1)), 1); +--error ER_ILLEGAL_VALUE_FOR_TYPE +SELECT EXTRACTVALUE('', LPAD(0.1111E-15, '2011', 1)); + + --echo End of 5.1 tests + + +--echo # +--echo # Start of 5.5 tests +--echo # + +--echo # +--echo # Bug#58175 xml functions read initialized bytes when conversions happen +--echo # +SET NAMES latin1; +SELECT UPDATEXML(CONVERT('' USING swe7), TRUNCATE('',1), 0); + +--echo # +--echo # End of 5.5 tests +--echo # |