• Alfranio Correia's avatar
    BUG#53560 CREATE TEMP./DROP TEMP. are not binglogged correctly after a failed statement · 3f8bde44
    Alfranio Correia authored
    This patch fixes two problems described as follows:
    
    1 - If there is an on-going transaction and a temporary table is created or
    dropped, any failed statement that follows the "create" or "drop commands"
    triggers a rollback and by consequence the slave will go out sync because
    the binary log will have a wrong sequence of events.
    
    To fix the problem, we changed the expression that evaluates when the
    cache should be flushed after either the rollback of a statment or
    transaction.
    
    2 - When a "CREATE TEMPORARY TABLE SELECT * FROM" was executed the
    OPTION_KEEP_LOG was not set into the thd->options. For that reason, if
    the transaction had updated only transactional engines and was rolled
    back at the end (.e.g due to a deadlock) the changes were not written
    to the binary log, including the creation of the temporary table.
          
    To fix the problem, we have set the OPTION_KEEP_LOG into the thd->options
    when a "CREATE TEMPORARY TABLE SELECT * FROM" is executed.
    
    sql/log.cc:
      Reorganized the code based on the following functions:
      
      - bool ending_trans(const THD* thd, const bool all);
      - bool trans_has_updated_non_trans_table(const THD* thd);
      - bool trans_has_no_stmt_committed(const THD* thd, const bool all);
      - bool stmt_has_updated_non_trans_table(const THD* thd);
    sql/log.h:
      Added functions to organize the code in log.cc.
    sql/log_event.cc:
      Removed the OPTION_KEEP_LOG since it must be used only when
      creating and dropping temporary tables.
    sql/log_event_old.cc:
      Removed the OPTION_KEEP_LOG since it must be used only when
      creating and dropping temporary tables.
    sql/sql_parse.cc:
      When a "CREATE TEMPORARY TABLE SELECT * FROM" was executed the
      OPTION_KEEP_LOG was not set into the thd->options.
            
      To fix the problem, we have set the OPTION_KEEP_LOG into the
      thd->options when a "CREATE TEMPORARY TABLE SELECT * FROM"
      is executed.
    3f8bde44
binlog_stm_mix_innodb_myisam.result 30.2 KB