• Jon Olav Hauglid's avatar
    Backport of revno: 2617.69.34 · 4b8db713
    Jon Olav Hauglid authored
    Bug #45949 Assertion `!tables->table' in open_tables() on 
               ALTER + INSERT DELAYED
    
    The assertion was caused by improperly closing tables when 
    INSERT DELAYED needed to reopen tables. This patch replaces
    the call to close_thread_tables with close_tables_for_reopen
    which fixes the problem.
    
    The only way I was able to trigger the reopen code path and 
    thus the assertion, was if ALTER TABLE killed the delayed
    insert thread and the delayed insert thread was able to enter
    the reopen code path before it noticed that thd->killed had
    been set. Note that in these cases reopen will always fail 
    since open_table() will check thd->killed and return. This patch
    therefore adds two more thd->killed checks to minimize the 
    chance of entering the reopen code path without hope for success.
    
    The patch also changes it so that if the delayed insert is killed
    using KILL_CONNECTION, the error message that is copied to the
    connection thread is ER_QUERY_INTERRUPTED rather than 
    ER_SERVER_SHUTDOWN. This means that if INSERT DELAYED fails, 
    the user will now see "Query execution was interrupted" rather
    than the misleading "Server shutdown in progress".
    
    No test case is supplied. This is for two reasons:
    1) Unable to reproduce the error without having the delayed insert
    thread in a killed state which means that reopen is futile and
    was not supposed to be attempted.
    2) Difficulty of using sync points in other threads than 
    the connection thread.
    The patch has been successfully tested with the RQG and the grammar
    supplied in the bug description.
    4b8db713
sql_insert.cc 129 KB