• Davi Arnaut's avatar
    Bug#43230: SELECT ... FOR UPDATE can hang with FLUSH TABLES WITH READ LOCK indefinitely · 72e97882
    Davi Arnaut authored
    The problem is that a SELECT .. FOR UPDATE statement might open
    a table and later wait for a impeding global read lock without
    noticing whether it is holding a table that is being waited upon
    the the flush phase of the process that took the global read
    lock.
    
    The same problem also affected the following statements:
    
    LOCK TABLES .. WRITE
    UPDATE .. SET (update and multi-table update)
    TRUNCATE TABLE ..
    LOAD DATA ..
    
    The solution is to make the above statements wait for a impending
    global read lock before opening the tables. If there is no
    impending global read lock, the statement raises a temporary
    protection against global read locks and progresses smoothly
    towards completion.
    
    Important notice: the patch does not try to address all possible
    cases, only those which are common and can be fixed unintrusively
    enough for 5.0.
    
    mysql-test/r/lock_multi.result:
      Add test case result for Bug#43230
    mysql-test/t/lock_multi.test:
      Add test case for Bug#43230
    sql/sql_lex.cc:
      Initialize flag.
    sql/sql_lex.h:
      Add a flag to the lexer.
    sql/sql_parse.cc:
      Wait for the global read lock is a write lock is going to be
      taken. The wait is done before opening tables.
    sql/sql_yacc.yy:
      Protect against the GRL if its a SELECT .. FOR UPDATE or LOCK TABLES
      .. WRITE statement.
    72e97882
sql_yacc.yy 293 KB