• Sven Sandberg's avatar
    BUG#39934: Slave stops for engine that only support row-based logging · 66481aeb
    Sven Sandberg authored
    Post-push fix.
    Problem: After the original bugfix, if a statement is unsafe,
    binlog_format=mixed, and engine is statement-only, a warning was
    generated and the statement executed. However, it is a fundamental
    principle of binlogging that binlog_format=mixed should guarantee
    correct logging, no compromise. So correct behavior is to generate
    an error and don't execute the statement.
    Fix: Generate error instead of warning.
    Since issue_unsafe_warnings can only generate one error message,
    this allows us to simplify the code a bit too:
    decide_logging_format does not have to save the error code for
    issue_unsafe_warnings
    
    
    mysql-test/suite/binlog/r/binlog_statement_insert_delayed.result:
      updated result file
    mysql-test/suite/binlog/r/binlog_stm_ps.result:
      updated result file
    mysql-test/suite/binlog/r/binlog_stm_unsafe_warning.result:
      updated result file
    mysql-test/suite/binlog/r/binlog_unsafe.result:
      updated result file
    mysql-test/suite/rpl/r/rpl_stm_found_rows.result:
      updated result file
    mysql-test/suite/rpl/r/rpl_stm_loadfile.result:
      updated result file
    mysql-test/suite/rpl_ndb/r/rpl_ndb_binlog_format_errors.result:
      updated result file
    mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors.test:
      updated test:
       - ER_BINLOG_UNSAFE_AND_STMT_ENGINE is now an error.
       - added test for multiple types of unsafety
    sql/share/errmsg.txt:
       - Reformulated ER_BINLOG_UNSAFE_AND_STMT_ENGINE to reflect that it
         is now an error, not a warning.
       - Added "Reason for unsafeness" to ER_BINLOG_UNSAFE_STATEMENT and
         ER_BINLOG_UNSAFE_AND_STMT_ENGINE.
    sql/sql_class.cc:
      In decide_logging_format:
       - generate an error immediately in case 3, instead of scheduling a
         warning to be generated later. also updated comments accordingly
       - in case 7, there is only one unsafe warning error code now, so we
         don't need to store it in binlog_unsafe_warning_flags
         (see changes in sql_lex.h)
       - fixed compilation warning in DBUG_PRINT
      
      In issue_binlog_warning:
       - moved array of error codes to sql_lex.h (so that they are
         accessible also from decide_logging_format)
       - simplified code after the first set of bits in
         binlog_unsafe_warning_flags was removed
    sql/sql_class.h:
       - got rid of enum_binlog_stmt_warning. It's not needed anymore
         since we only have one type of unsafe warning (one of them
         turned into an error)
       - updated comments accordingly
    sql/sql_lex.cc:
      added initialization of the array of error codes that has been
      moved from THD::issue_unsafe_warnings to LEX.
    sql/sql_lex.h:
      Moved array of error codes from THD::issue_unsafe_warnings to LEX.
    66481aeb
rpl_stm_loadfile.result 2.75 KB