diff options
Diffstat (limited to 'mysql-test/main/sp_sync.test')
-rw-r--r-- | mysql-test/main/sp_sync.test | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/mysql-test/main/sp_sync.test b/mysql-test/main/sp_sync.test new file mode 100644 index 00000000..a5682fc5 --- /dev/null +++ b/mysql-test/main/sp_sync.test @@ -0,0 +1,170 @@ +# This test should work in embedded server after mysqltest is fixed +-- source include/not_embedded.inc + +--echo Tests of synchronization of stored procedure execution. + +--source include/have_debug_sync.inc + +# Save the initial number of concurrent sessions. +--source include/count_sessions.inc + +# Clean up resources used in this test case. +--disable_warnings +SET DEBUG_SYNC= 'RESET'; +--enable_warnings + +--echo # +--echo # Bug #30977 Concurrent statement using stored function and +--echo # DROP FUNCTION breaks SBR +--echo # +--echo # A stored routine could change after dispatch_command() +--echo # but before a MDL lock is taken. This must be noticed and the +--echo # sp cache flushed so the correct version can be loaded. +--echo # + +connect (con2, localhost, root); + +connection default; +CREATE FUNCTION f1() RETURNS INT RETURN 1; +--echo # Get f1 cached +SELECT f1(); +--echo # Then start executing it again... +SET DEBUG_SYNC= 'before_execute_sql_command SIGNAL before WAIT_FOR changed'; +--echo # Sending: +--send SELECT f1() + +connection con2; +SET DEBUG_SYNC= 'now WAIT_FOR before'; +--echo # ... but before f1 is locked, change it. +DROP FUNCTION f1; +CREATE FUNCTION f1() RETURNS INT RETURN 2; +SET DEBUG_SYNC= 'now SIGNAL changed'; + +--echo # We should now get '2' and not '1'. +connection default; +--echo # Reaping: SELECT f1() +--reap + +disconnect con2; +DROP FUNCTION f1; +SET DEBUG_SYNC= 'RESET'; + +--echo # +--echo # Field translation items must be cleared in case of back-offs +--echo # for queries that use Information Schema tables. Otherwise +--echo # memory allocated in fix_fields() for views may end up referring +--echo # to freed memory. +--echo # + +--disable_warnings +DROP FUNCTION IF EXISTS f1; +--enable_warnings + +connect (con2, localhost, root); +connect (con3, localhost, root); + +connection default; +CREATE FUNCTION f1() RETURNS INT RETURN 0; + +connection con2; +SET DEBUG_SYNC= 'after_wait_locked_pname SIGNAL locked WAIT_FOR issued'; +--echo # con2 will now have an x-lock on f1 +--echo # Sending: +--send ALTER FUNCTION f1 COMMENT 'comment' + +connection default; +SET DEBUG_SYNC= 'now WAIT_FOR locked'; +--disable_result_log +--echo # This query will block due to the x-lock on f1 and back-off +--send SHOW OPEN TABLES WHERE f1()=0 + +connection con3; +let $wait_condition= SELECT COUNT(*)= 1 FROM information_schema.processlist + WHERE state= 'Waiting for stored function metadata lock' + AND info='SHOW OPEN TABLES WHERE f1()=0'; +--source include/wait_condition.inc +--echo # Check that the IS query is blocked before releasing the x-lock +SET DEBUG_SYNC= 'now SIGNAL issued'; + +connection default; +--echo # Reaping: ALTER FUNCTION f1 COMMENT 'comment' +--reap +--enable_result_log +DROP FUNCTION f1; +SET DEBUG_SYNC= 'RESET'; +disconnect con2; +disconnect con3; + + +--echo # +--echo # Bug #48246 assert in close_thread_table +--echo # + +CREATE TABLE t0 (b INTEGER); +CREATE TABLE t1 (a INTEGER); +CREATE FUNCTION f1(b INTEGER) RETURNS INTEGER RETURN 1; +CREATE PROCEDURE p1() SELECT COUNT(f1(a)) FROM t1, t0; + +INSERT INTO t0 VALUES(1); +INSERT INTO t1 VALUES(1), (2); + +connect (con2, localhost, root); +CALL p1(); + +SET DEBUG_SYNC= 'after_open_table_mdl_shared SIGNAL locked_t1 WAIT_FOR go_for_t0'; +--echo # This call used to cause an assertion. MDL deadlock with upcoming +--echo # LOCK TABLES statement will cause back-off and retry. +--echo # A variable indicating if a prelocking list exists, used to be not +--echo # reset properly causing an eventual assert. +--echo # Sending: +--send CALL p1() + +connection default; +SET DEBUG_SYNC= 'now WAIT_FOR locked_t1'; +--echo # Issue LOCK TABLES statement which will enter in MDL deadlock +--echo # with CALL statement and as result will cause it to perform +--echo # back-off and retry. +SET DEBUG_SYNC= 'mdl_acquire_lock_wait SIGNAL go_for_t0'; +LOCK TABLES t0 WRITE, t1 WRITE; +UNLOCK TABLES; + +connection con2; +--echo # Reaping: CALL p1() +--reap; + +connection default; +disconnect con2; +DROP PROCEDURE p1; +DROP FUNCTION f1; +DROP TABLES t0, t1; + + +--echo # +--echo # test for bug#11756013 +--echo # +--disable_warnings +DROP SCHEMA IF EXISTS s1; +--enable_warnings +CREATE SCHEMA s1; +CREATE PROCEDURE s1.p1() BEGIN END; + +connect (con3, localhost, root); +SET DEBUG_SYNC='before_db_dir_check SIGNAL check_db WAIT_FOR dropped_schema'; +--send CALL s1.p1 + +connection default; +SET DEBUG_SYNC='now WAIT_FOR check_db'; +DROP SCHEMA s1; +SET DEBUG_SYNC='now SIGNAL dropped_schema'; + +connection con3; +--error ER_BAD_DB_ERROR +--reap +connection default; +disconnect con3; + +SET DEBUG_SYNC = 'RESET'; + +# 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 |