• Sven Sandberg's avatar
    BUG#39934: Slave stops for engine that only support row-based logging · f404c96e
    Sven Sandberg authored
    This is a post-push fix addressing review requests and
    problems with extra warnings.
    
    Problem 1: The sub-statement where an unsafe warning was detected was
    printed as part of the warning. This was ok for statements that
    were unsafe due to, e.g., calls to UUID(), but did not make
    sense for statements that were unsafe because there was more than
    one autoincrement column (unsafeness in this case comes from the
    combination of several sub-statements).
    Fix 1: Instead of printing the sub-statement, print an explanation
    of why the statement is unsafe.
    
    Problem 2:
    When a recursive construct (i.e., stored proceure, stored
    function, trigger, view, prepared statement) contained several
    sub-statements, and at least one of them was unsafe, there would be
    one unsafeness warning per sub-statement - even for safe
    sub-statements.
    Fix 2:
    Ensure that each type of warning is printed at most once, by
    remembering throughout the execution of the statement which types
    of warnings have been printed.
    
    
    mysql-test/extra/rpl_tests/create_recursive_construct.inc:
      - Clarified comment per review request.
      - Added checks for the number of warnings in each invocation.
    mysql-test/extra/rpl_tests/rpl_insert_delayed.test:
      Per review request, replaced @@session.binlog_format by
      @@global.binlog_format, since INSERT DELAYED reads the global
      variable. (In this test case, the two variables have the same
      value, so the change is cosmetic.)
    mysql-test/r/sp_trans.result:
      updated result file
    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. Note that duplicate warnings are now gone.
    mysql-test/suite/binlog/t/binlog_unsafe.test:
      - Added tests for: (1) a statement that is unsafe in many ways;
        (2) a statement that is unsafe in the same way several times.
      - Use -- style to invoke mysqltest commands.
    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/t/rpl_mix_found_rows.test:
      Per review request, added comment explaining what the test case
      does (copied from rpl_stm_found_rows.test)
    mysql-test/suite/rpl/t/rpl_stm_found_rows.test:
      Clarified grammar in comment.
    mysql-test/suite/rpl_ndb/r/rpl_ndb_binlog_format_errors.result:
      Updated result file.
    sql/item_create.cc:
      Made set_stmt_unsafe take one parameter, describing the
      type of unsafeness.
    sql/sp_head.cc:
      Added unsafe_flags field and made it hold all the unsafe flags.
    sql/sp_head.h:
      - Removed the BINLOG_ROW_BASED_IF_MIXED flag from m_flags.
        Instead, we use the new unsafe_flags field to hold the
        unsafeness state of the sp.
      - Made propagate_attributes() copy all unsafe flags.
    sql/sql_base.cc:
      - Made LEX::set_stmt_unsafe() take an extra argument.
      - Made binlog_unsafe_warning_flags store the type of unsafeness.
      - Per review requests, clarified comments
      - Added DBUG printouts
    sql/sql_class.cc:
      - Made warnings be generated in issue_warnings() and call that from
        binlog_query(). Wrote issue_warnings(), which prints zero or more
        warnings, avoiding to print warnings more than once per statement.
      - Per review request, added @todo so that we remember to assert
        correct behavior in binlog_query.
    sql/sql_class.h:
      - Removed BINLOG_WARNING_PRINTED 
      - Use [set|clear]_current_stmt_binlog_row_based() instead of
        modifying the flag directly.
      - added issue_unsafe_warnings() (only called from binlog_unsafe)
      - Per review request, improved some documentation.
    sql/sql_insert.cc:
      Added extra argument to LEX::set_stmt_unsafe()
    sql/sql_lex.h:
      - Added enum_binlog_stmt_unsafe, listing all types of unsafe
        statements.
      - Per review requests, improved many comments for member
        functions.
      - Added [get|set]_stmt_unsafe_flags(), which return/set all the
        unsafe flags for a statement.
    sql/sql_parse.cc:
      - Renamed binlog_warning_flags to binlog_unsafe_warning_flags.
      - Per review requests, improved comment.
    sql/sql_view.cc:
      Made views propagate all the new unsafe flags.
    sql/sql_yacc.yy:
      Added parameter to set_stmt_unsafe().
    storage/innobase/handler/ha_innodb.cc:
      Per review requests, replaced DBUG_EXECUTE_IF() by DBUG_EVALUATE_IF().
    f404c96e
binlog_unsafe.test 18.6 KB