• konstantin@mysql.com's avatar
    Fix for bug#4912 "mysqld crashs in case a statement is executed · 568c6e85
    konstantin@mysql.com authored
     a second time". The bug was caused by incompatibility of
    negations elimination algorithm and PS: during first statement 
    execute a subtree with negation was replaced with equivalent 
    subtree without NOTs.
    The problem was that although this transformation was permanent, 
    items of the new subtree were created in execute-local memory.
    The patch adds means to check if it is the first execute of a
    prepared statement, and if this is the case, to allocate items
    in memory of the prepared statement.
    The implementation:
    - backports Item_arena from 5.0
    - adds Item_arena::is_stmt_prepare(), 
      Item_arena::is_first_stmt_execute().
    - deletes THD::allocate_temporary_pool_for_ps_preparing(),
      THD::free_temporary_pool_for_ps_preparing(); they
      were redundant.
    and adds a few invariants:
    - thd->free_list never contains junk (= freed items)
    - thd->current_arena is never null. If there is no
      prepared statement, it points at the thd. 
    The rest of the patch contains mainly mechanical changes and
    cleanups.
    568c6e85
sql_prepare.cc 54.3 KB