Tests of syncronization of stored procedure execution. SET DEBUG_SYNC= 'RESET'; # # Bug #30977 Concurrent statement using stored function and # DROP FUNCTION breaks SBR # # A stored routine could change after dispatch_command() # but before a MDL lock is taken. This must be noticed and the # sp cache flushed so the correct version can be loaded. # # Connection default CREATE FUNCTION f1() RETURNS INT RETURN 1; # Get f1 cached SELECT f1(); f1() 1 # Then start executing it again... SET DEBUG_SYNC= 'before_execute_sql_command SIGNAL before WAIT_FOR changed'; # Sending: SELECT f1(); # Connection 2 SET DEBUG_SYNC= 'now WAIT_FOR before'; # ... but before f1 is locked, change it. DROP FUNCTION f1; CREATE FUNCTION f1() RETURNS INT RETURN 2; SET DEBUG_SYNC= 'now SIGNAL changed'; # Connection default # We should now get '2' and not '1'. # Reaping: SELECT f1() f1() 2 DROP FUNCTION f1; SET DEBUG_SYNC= 'RESET'; # # Field translation items must be cleared in case of back-offs # for queries that use Information Schema tables. Otherwise # memory allocated in fix_fields() for views may end up referring # to freed memory. # DROP FUNCTION IF EXISTS f1; # Connection default CREATE FUNCTION f1() RETURNS INT RETURN 0; # Connection con2 SET DEBUG_SYNC= 'after_wait_locked_pname SIGNAL locked WAIT_FOR issued'; # con2 will now have an x-lock on f1 # Sending: ALTER FUNCTION f1 COMMENT 'comment'; # Connection default SET DEBUG_SYNC= 'now WAIT_FOR locked'; # This query will block due to the x-lock on f1 and back-off SHOW OPEN TABLES WHERE f1()=0; # Connection con3 # Check that the IS query is blocked before releasing the x-lock SET DEBUG_SYNC= 'now SIGNAL issued'; # Connection default # Reaping: ALTER FUNCTION f1 COMMENT 'comment' DROP FUNCTION f1; SET DEBUG_SYNC= 'RESET'; # # Bug #48246 assert in close_thread_table # CREATE TABLE t1 (a INTEGER); CREATE FUNCTION f1(b INTEGER) RETURNS INTEGER RETURN 1; CREATE PROCEDURE p1() SELECT COUNT(f1(a)) FROM t1; INSERT INTO t1 VALUES(1), (2); # Connection 2 CALL p1(); COUNT(f1(a)) 2 # Connection default SET DEBUG_SYNC= 'after_open_table_mdl_shared SIGNAL locked WAIT_FOR called'; # Sending: CREATE TABLE t1 (a INTEGER); # Connection 2 SET DEBUG_SYNC= 'now WAIT_FOR locked'; SET DEBUG_SYNC= 'before_open_table_wait_refresh SIGNAL called WAIT_FOR created'; # This call used to cause an assertion. MDL locking conflict will # cause back-off and retry. A variable indicating if a prelocking list # exists, used to be not reset properly causing an eventual assert. # Sending: CALL p1(); # Connection default # Reaping: CREATE TABLE t1 (a INTEGER) ERROR 42S01: Table 't1' already exists SET DEBUG_SYNC= 'now SIGNAL created'; # Connection 2 # Reaping: CALL p1() COUNT(f1(a)) 2 # Connection default DROP PROCEDURE p1; DROP FUNCTION f1; DROP TABLE t1; SET DEBUG_SYNC= 'RESET';