• unknown's avatar
    Fix for bug#4912 "mysqld crashs in case a statement is executed · 48bb5630
    unknown 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.
    
    
    mysql-test/r/ps.result:
      Test results updated (test case for Bug#4912)
    mysql-test/t/ps.test:
      A test case for Bug#4912 "mysqld crashs in case a statement is 
      executed a second time"
    sql/item_cmpfunc.cc:
      current_statement -> current_arena
    sql/item_subselect.cc:
      Statement -> Item_arena, current_statement -> current_arena
    sql/item_subselect.h:
      Item_subselect does not need to save thd->current_statement.
    sql/item_sum.cc:
      Statement -> Item_arena
    sql/item_sum.h:
      Statement -> Item_arena
    sql/mysql_priv.h:
      Statement -> Item_arena
    sql/sql_base.cc:
      current_statement -> current_arena
    sql/sql_class.cc:
      - Item_arena
      - convenient set_n_backup_statement, restore_backup_statement
      (nice idea, Sanja)
    sql/sql_class.h:
      - Item_arena: backport from 5.0
      - allocate_temporary_pool_for_ps_preparing,
        free_temporary_pool_for_ps_preparing removed.
    sql/sql_derived.cc:
      current_statement -> current_arena
    sql/sql_lex.cc:
      current_statement -> current_arena
    sql/sql_parse.cc:
      Deploy invariant that thd->free_list never contains junk items
      (backport from 5.0).
    sql/sql_prepare.cc:
      - backporting Item_arena
      - no need to allocate_temporary_pool_for_ps_preparing().
    sql/sql_select.cc:
      Fix for bug#4912 "mysqld crashs in case a statement is 
      executed a second time": if this is the first execute of
      a prepared statement, negation elimination is
      done in memory of the prepared statement.
    sql/sql_union.cc:
      Backporting Item_arena from 5.0.
    48bb5630
sql_select.cc 267 KB