summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Sandberg <sven.sandberg@sun.com>2009-07-14 21:31:19 +0200
committerSven Sandberg <sven.sandberg@sun.com>2009-07-14 21:31:19 +0200
commit41783de54966481dd295aae95a2bfc8f6302a940 (patch)
tree5b0594d99930e864ffcbe42f4203dcb21eddd835
parent37a5f2d42168d68d8bfb6bdbf4ed90291af49f2a (diff)
downloadmariadb-git-41783de54966481dd295aae95a2bfc8f6302a940.tar.gz
BUG#39934: Slave stops for engine that only support row-based logging
General overview: The logic for switching to row format when binlog_format=MIXED had numerous flaws. The underlying problem was the lack of a consistent architecture. General purpose of this changeset: This changeset introduces an architecture for switching to row format when binlog_format=MIXED. It enforces the architecture where it has to. It leaves some bugs to be fixed later. It adds extensive tests to verify that unsafe statements work as expected and that appropriate errors are produced by problems with the selection of binlog format. It was not practical to split this into smaller pieces of work. Problem 1: To determine the logging mode, the code has to take several parameters into account (namely: (1) the value of binlog_format; (2) the capabilities of the engines; (3) the type of the current statement: normal, unsafe, or row injection). These parameters may conflict in several ways, namely: - binlog_format=STATEMENT for a row injection - binlog_format=STATEMENT for an unsafe statement - binlog_format=STATEMENT for an engine only supporting row logging - binlog_format=ROW for an engine only supporting statement logging - statement is unsafe and engine does not support row logging - row injection in a table that does not support statement logging - statement modifies one table that does not support row logging and one that does not support statement logging Several of these conflicts were not detected, or were detected with an inappropriate error message. The problem of BUG#39934 was that no appropriate error message was written for the case when an engine only supporting row logging executed a row injection with binlog_format=ROW. However, all above cases must be handled. Fix 1: Introduce new error codes (sql/share/errmsg.txt). Ensure that all conditions are detected and handled in decide_logging_format() Problem 2: The binlog format shall be determined once per statement, in decide_logging_format(). It shall not be changed before or after that. Before decide_logging_format() is called, all information necessary to determine the logging format must be available. This principle ensures that all unsafe statements are handled in a consistent way. However, this principle is not followed: thd->set_current_stmt_binlog_row_based_if_mixed() is called in several places, including from code executing UPDATE..LIMIT, INSERT..SELECT..LIMIT, DELETE..LIMIT, INSERT DELAYED, and SET @@binlog_format. After Problem 1 was fixed, that caused inconsistencies where these unsafe statements would not print the appropriate warnings or errors for some of the conflicts. Fix 2: Remove calls to THD::set_current_stmt_binlog_row_based_if_mixed() from code executed after decide_logging_format(). Compensate by calling the set_current_stmt_unsafe() at parse time. This way, all unsafe statements are detected by decide_logging_format(). Problem 3: INSERT DELAYED is not unsafe: it is logged in statement format even if binlog_format=MIXED, and no warning is printed even if binlog_format=STATEMENT. This is BUG#45825. Fix 3: Made INSERT DELAYED set itself to unsafe at parse time. This allows decide_logging_format() to detect that a warning should be printed or the binlog_format changed. Problem 4: LIMIT clause were not marked as unsafe when executed inside stored functions/triggers/views/prepared statements. This is BUG#45785. Fix 4: Make statements containing the LIMIT clause marked as unsafe at parse time, instead of at execution time. This allows propagating unsafe-ness to the view. mysql-test/extra/rpl_tests/create_recursive_construct.inc: Added auxiliary file used by binlog_unsafe.test to create and execute recursive constructs (functions/procedures/triggers/views/prepared statements). mysql-test/extra/rpl_tests/rpl_foreign_key.test: removed unnecessary set @@session.binlog_format mysql-test/extra/rpl_tests/rpl_insert_delayed.test: Filter out table id from table map events in binlog listing. Got rid of $binlog_format_statement. mysql-test/extra/rpl_tests/rpl_ndb_apply_status.test: disable warnings around call to unsafe procedure mysql-test/include/rpl_udf.inc: Disabled warnings for code that generates warnings for some binlog formats. That would otherwise cause inconsistencies in the result file. mysql-test/r/mysqldump.result: Views are now unsafe if they contain a LIMIT clause. That fixed BUG#45831. Due to BUG#45832, a warning is printed for the CREATE VIEW statement. mysql-test/r/sp_trans.result: Unsafe statements in stored procedures did not give a warning if binlog_format=statement. This is BUG#45824. Now they do, so this result file gets a new warning. mysql-test/suite/binlog/r/binlog_multi_engine.result: Error message changed. mysql-test/suite/binlog/r/binlog_statement_insert_delayed.result: INSERT DELAYED didn't generate a warning when binlog_format=STATEMENT. That was BUG#45825. Now there is a warning, so result file needs to be updated. mysql-test/suite/binlog/r/binlog_stm_ps.result: Changed error message. mysql-test/suite/binlog/r/binlog_unsafe.result: updated result file: - error message changed - added test for most combinations of unsafe constructs invoked from recursive constructs - INSERT DELAYED now gives a warning (because BUG#45826 is fixed) - INSERT..SELECT..LIMIT now gives a warning from inside recursive constructs (because BUG#45785 was fixed) - When a recursive construct (e.g., stored proc or function) contains more than one statement, at least one of which is unsafe, then all statements in the recursive construct give warnings. This is a new bug introduced by this changeset. It will be addressed in a post-push fix. mysql-test/suite/binlog/t/binlog_innodb.test: Changed error code for innodb updates with READ COMMITTED or READ UNCOMMITTED transaction isolation level and binlog_format=statement. mysql-test/suite/binlog/t/binlog_multi_engine.test: The error code has changed for statements where more than one engine is involved and one of them is self-logging. mysql-test/suite/binlog/t/binlog_unsafe-master.opt: Since binlog_unsafe now tests unsafe-ness of UDF's, we need an extra flag in the .opt file. mysql-test/suite/binlog/t/binlog_unsafe.test: - Clarified comment. - Rewrote first part of test. Now it tests not only unsafe variables and functions, but also unsafe-ness due to INSERT..SELECT..LIMIT, INSERT DELAYED, insert into two autoinc columns, use of UDF's, and access to log tables in the mysql database. Also, in addition to functions, procedures, triggers, and prepared statements, it now also tests views; and it constructs recursive calls in two levels by combining these recursive constructs. Part of the logic is in extra/rpl_tests/create_recursive_construct.inc. - added tests for all special system variables that should not be unsafe. - added specific tests for BUG#45785 and BUG#45825 mysql-test/suite/rpl/r/rpl_events.result: updated result file mysql-test/suite/rpl/r/rpl_extraColmaster_innodb.result: updated result file mysql-test/suite/rpl/r/rpl_extraColmaster_myisam.result: updated result file mysql-test/suite/rpl/r/rpl_foreign_key_innodb.result: updated result file mysql-test/suite/rpl/r/rpl_idempotency.result: updated result file mysql-test/suite/rpl/r/rpl_mix_found_rows.result: Split rpl_found_rows.test into rpl_mix_found_rows.test (a new file) and rpl_stm_found_rows.test (renamed rpl_found_rows.test). This file equals the second half of the old rpl_found_rows.result, with the following modifications: - minor formatting changes - additional initialization mysql-test/suite/rpl/r/rpl_mix_insert_delayed.result: Moved out code operating in mixed mode from rpl_stm_insert_delayed (into rpl_mix_insert_delayed) and got rid of explicit setting of binlog format. mysql-test/suite/rpl/r/rpl_rbr_to_sbr.result: updated result file mysql-test/suite/rpl/r/rpl_row_idempotency.result: Moved the second half of rpl_idempotency.test, which only executed in row mode, to rpl_row_idempotency.test. This is the new result file. mysql-test/suite/rpl/r/rpl_row_insert_delayed.result: Got rid of unnecessary explicit setting of binlog format. mysql-test/suite/rpl/r/rpl_stm_found_rows.result: Split rpl_found_rows.test into rpl_mix_found_rows.test (a new file) and rpl_stm_found_rows.test (renamed rpl_found_rows.test). Changes in this file: - minor formatting changes - warning is now issued for unsafe statements inside procedures (since BUG#45824 is fixed) - second half of file is moved to rpl_mix_found_rows.result mysql-test/suite/rpl/r/rpl_stm_insert_delayed.result: Moved out code operating in mixed mode from rpl_stm_insert_delayed (into rpl_mix_insert_delayed) and got rid of explicit setting of binlog format. mysql-test/suite/rpl/r/rpl_stm_loadfile.result: error message changed mysql-test/suite/rpl/r/rpl_temporary_errors.result: updated result file mysql-test/suite/rpl/r/rpl_udf.result: Remove explicit set of binlog format (and triplicate test execution) and rely on test system executing the test in all binlog formats. mysql-test/suite/rpl/t/rpl_bug31076.test: Test is only valid in mixed or row mode since it generates row events. mysql-test/suite/rpl/t/rpl_events.test: Removed explicit set of binlog_format and removed duplicate testing. Instead, we rely on the test system to try all binlog formats. mysql-test/suite/rpl/t/rpl_extraColmaster_innodb.test: Removed triplicate testing and instead relying on test system. Test is only relevant for row format since statement-based replication cannot handle extra columns on master. mysql-test/suite/rpl/t/rpl_extraColmaster_myisam.test: Removed triplicate testing and instead relying on test system. Test is only relevant for row format since statement-based replication cannot handle extra columns on master. mysql-test/suite/rpl/t/rpl_idempotency-slave.opt: Removed .opt file to avoid server restarts. mysql-test/suite/rpl/t/rpl_idempotency.test: - Moved out row-only tests to a new test file, rpl_row_idempotency.test. rpl_idempotency now only contains tests that execute in all binlog_formats. - While I was here, also removed .opt file to avoid server restarts. The slave_exec_mode is now set inside the test instead. mysql-test/suite/rpl/t/rpl_mix_found_rows.test: Split rpl_found_rows.test into rpl_mix_found_rows.test (a new file) and rpl_stm_found_rows.test (renamed rpl_found_rows.test). This file contains the second half of the original rpl_found_rows.test with the follwing changes: - initialization - removed SET_BINLOG_FORMAT and added have_binlog_format_mixed.inc - minor formatting changes mysql-test/suite/rpl/t/rpl_mix_insert_delayed.test: Moved out code operating in mixed mode from rpl_stm_insert_delayed (into rpl_mix_insert_delayed) and got rid of explicit setting of binlog format. mysql-test/suite/rpl/t/rpl_rbr_to_sbr.test: Test cannot execute in statement mode, since we no longer switch to row format when binlog_format=statement. Enforced mixed mode throughout the test. mysql-test/suite/rpl/t/rpl_row_idempotency.test: Moved the second half of rpl_idempotency.test, which only executed in row mode, to this new file. We now rely on the test system to set binlog format. mysql-test/suite/rpl/t/rpl_row_insert_delayed.test: - Got rid of unnecessary explicit setting of binlog format. - extra/rpl_tests/rpl_insert_delayed.test does not need the $binlog_format_statement variable any more, so that was removed. mysql-test/suite/rpl/t/rpl_slave_skip.test: The test switches binlog_format internally and master generates both row and statement events. Hence, the slave must be able to log in both statement and row format. Hence test was changed to only execute in mixed mode. mysql-test/suite/rpl/t/rpl_stm_found_rows.test: Split rpl_found_rows.test into rpl_mix_found_rows.test (a new file) and rpl_stm_found_rows.test (renamed rpl_found_rows.test). Changes in this file: - minor formatting changes - added have_binlog_format_statement and removed SET BINLOG_FORMAT. - second half of file is moved to rpl_mix_found_rows.test - added cleanup code mysql-test/suite/rpl/t/rpl_stm_insert_delayed.test: Moved out code operating in mixed mode from rpl_stm_insert_delayed (into rpl_mix_insert_delayed) and got rid of explicit setting of binlog format. mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test: The test switches binlog_format internally and master generates both row and statement events. Hence, the slave must be able to log in both statement and row format. Hence test was changed to only execute in mixed mode on slave. mysql-test/suite/rpl/t/rpl_temporary_errors.test: Removed explicit set of binlog format. Instead, the test now only executes in row mode. mysql-test/suite/rpl/t/rpl_udf.test: Remove explicit set of binlog format (and triplicate test execution) and rely on test system executing the test in all binlog formats. mysql-test/suite/rpl_ndb/combinations: Added combinations file for rpl_ndb. mysql-test/suite/rpl_ndb/r/rpl_ndb_binlog_format_errors.result: new result file mysql-test/suite/rpl_ndb/r/rpl_ndb_circular_simplex.result: updated result file mysql-test/suite/rpl_ndb/t/rpl_ndb_2innodb.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_2myisam.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_basic.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors-master.opt: new option file mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors-slave.opt: new option file mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors.test: New test case to verify all errors and warnings generated by decide_logging_format. mysql-test/suite/rpl_ndb/t/rpl_ndb_blob.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_blob2.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_circular.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_simplex.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. While I was here, also made the test clean up after itself. mysql-test/suite/rpl_ndb/t/rpl_ndb_commit_afterflush.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_ctype_ucs2_def.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_delete_nowhere.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_do_db.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_do_table.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_func003.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_innodb_trans.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_insert_ignore.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_mixed_engines_transactions.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_multi_update3.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_rep_ignore.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_row_001.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_sp003.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_sp006.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/suite/rpl_ndb/t/rpl_ndb_trig004.test: The test needs slave to be able to switch to row mode, so the test was changed to only execute in mixed and row mode. mysql-test/t/partition_innodb_stmt.test: Changed error code for innodb updates with READ COMMITTED or READ UNCOMMITTED transaction isolation level and binlog_format=statement. sql/event_db_repository.cc: Use member function to read current_stmt_binlog_row_based. sql/events.cc: Use member function to read current_stmt_binlog_row_based. sql/ha_ndbcluster_binlog.cc: reset_current_stmt_binlog_row_based() is not a no-op for the ndb_binlog thread any more. Instead, the ndb_binlog thread now forces row mode both initially and just after calling mysql_parse. (mysql_parse() is the only place where reset_current_stmt_binlog_row_based() may be called from the ndb_binlog thread, so these are the only two places that need to change.) sql/ha_partition.cc: Use member function to read current_stmt_binlog_row_based. sql/handler.cc: Use member function to read current_stmt_binlog_row_based. sql/item_create.cc: Added DBUG_ENTER to some functions, to be able to trace when set_stmt_unsafe is called. sql/log.cc: Use member function to read current_stmt_binlog_row_based. sql/log_event.cc: - Moved logic for changing to row format out of do_apply_event (and into decide_logging_format). - Added @todo comment for post-push cleanup. sql/log_event_old.cc: Move logic for changing to row format out of do_apply_event (and into decide_logging_format). sql/mysql_priv.h: Make decide_logging_format() a member of the THD class, for two reasons: - It is natural from an object-oriented perspective. - decide_logging_format() needs to access private members of THD (specifically, the new binlog_warning_flags field). sql/rpl_injector.cc: Removed call to set_current_stmt_binlog_row_based(). From now on, only decide_logging_fromat is allowed to modify current_stmt_binlog_row_based. This call is from the ndb_binlog thread, mostly executing code in ha_ndbcluster_binlog.cc. This call can be safely removed, because: - current_stmt_binlog_row_based is initialized for the ndb_binlog thread's THD object when the THD object is created. So we're not going to read uninitialized memory. - The behavior of ndb_binlog thread does not use the state of the current_stmt_binlog_row_based. It is conceivable that the ndb_binlog thread would rely on the current_stmt_binlog_format in two situations: (1) when it calls mysql_parse; (2) when it calls THD::binlog_query. In case (1), it always clears THD::options&OPTION_BIN_LOG (because run_query() in ha_ndbcluster_binlog.cc is only called with disable_binlogging = TRUE). In case (2), it always uses qtype=STMT_QUERY_TYPE. sql/set_var.cc: Added @todo comment for post-push cleanup. sql/share/errmsg.txt: Added new error messages and clarified ER_BINLOG_UNSAFE_STATEMENT. sql/sp.cc: Added DBUG_ENTER, to be able to trace when set_stmt_unsafe is called. Got rid of MYSQL_QUERY_TYPE: it was equivalent to STMT_QUERY_TYPE. sql/sp_head.cc: Use member function to read current_stmt_binlog_row_based. sql/sp_head.h: Added DBUG_ENTER, to be able to trace when set_stmt_unsafe is called. sql/sql_acl.cc: Got rid of MYSQL_QUERY_TYPE: it was equivalent to STMT_QUERY_TYPE. sql/sql_base.cc: - Made decide_logging_format take care of all logic for deciding the logging format, and for determining the related warnings and errors. See comment above decide_logging_format for details. - Made decide_logging_format a member function of THD, since it needs to access private members of THD and since its purpose is to update the state of a THD object. - Added DBUG_ENTER, to be able to trace when set_stmt_unsafe is called. sql/sql_class.cc: - Moved logic for determining unsafe warnings away from THD::binlog_query (and into decide_logging_format()). Now, it works like this: 1. decide_logging_format detects that the current statement shall produce a warning, if it ever makes it to the binlog 2. decide_logging_format sets a flag of THD::binlog_warning_flags. 3. THD::binlog_query reads the flag. If the flag is set, it generates a warning. - Use member function to read current_stmt_binlog_row_based. sql/sql_class.h: - Added THD::binlog_warning_flags (see sql_class.cc for explanation). - Made decide_logging_format() and reset_for_next_command() member functions of THD (instead of standalone functions). This was needed for two reasons: (1) the functions need to access the private member THD::binlog_warning_flags; (2) the purpose of these functions is to update the staet of a THD object, so from an object-oriented point of view they should be member functions. - Encapsulated current_stmt_binlog_row_based, so it is now private and can only be accessed from a member function. Also changed the data type to an enumeration instead of a bool. - Removed MYSQL_QUERY_TYPE, because it was equivalent to STMT_QUERY_TYPE anyways. - When reset_current_stmt_binlog_row_based was called from the ndb_binlog thread, it would behave as a no-op. This special case has been removed, and the behavior of reset_current_stmt_binlog_row_based does not depend on which thread calls it any more. The special case did not serve any purpose, since the ndb binlog thread did not take the current_stmt_binlog_row_based flag into account anyways. sql/sql_delete.cc: - Moved logic for setting row format for DELETE..LIMIT away from mysql_prepare_delete. (Instead, we mark the statement as unsafe at parse time (sql_yacc.yy) and rely on decide_logging_format() (sql_class.cc) to set row format.) This is part of the fix for BUG#45831. - Use member function to read current_stmt_binlog_row_based. sql/sql_insert.cc: - Removed unnecessary calls to thd->lex->set_stmt_unsafe() and thd->set_current_stmt_binlog_row_based_if_mixed() from handle_delayed_insert(). The calls are unnecessary because they have already been made; they were made in the constructor of the `di' object. - Since decide_logging_format() is now a member function of THD, code that calls decide_logging_format() had to be updated. - Added DBUG_ENTER call, to be able to trace when set_stmt_unsafe is called. - Moved call to set_stmt_unsafe() for INSERT..SELECT..LIMIT away from mysql_insert_select_prepare() (and into decide_logging_format). This is part of the fix for BUG#45831. - Use member function to read current_stmt_binlog_row_based. sql/sql_lex.h: - Added the flag BINLOG_STMT_FLAG_ROW_INJECTION to enum_binlog_stmt_flag. This was necessary so that a statement can identify itself as a row injection. - Added appropriate setter and getter functions for the new flag. - Added or clarified some comments. - Added DBUG_ENTER() sql/sql_load.cc: Use member function to read current_stmt_binlog_row_based. sql/sql_parse.cc: - Made mysql_reset_thd_for_next_command() clear thd->binlog_warning_flags. - Since thd->binlog_warning_flags is private, it must be set in a member function of THD. Hence, moved the body of mysql_reset_thd_for_next_command() to the new member function THD::reset_thd_for_next_command(), and made mysql_reset_thd_for_next_command() call THD::reset_thd_for_next_command(). - Removed confusing comment. - Use member function to read current_stmt_binlog_row_based. sql/sql_repl.cc: Use member function to read current_stmt_binlog_row_based. sql/sql_table.cc: Use member function to read current_stmt_binlog_row_based. sql/sql_udf.cc: Use member function to read current_stmt_binlog_row_based. sql/sql_update.cc: Moved logic for setting row format for UPDATE..LIMIT away from mysql_prepare_update. (Instead, we mark the statement as unsafe at parse time (sql_yacc.yy) and rely on decide_logging_format() (sql_class.cc) to set row format.) This is part of the fix for BUG#45831. sql/sql_yacc.yy: Made INSERT DELAYED, INSERT..SELECT..LIMIT, UPDATE..LIMIT, and DELETE..LIMIT mark themselves as unsafe at parse time (instead of at execution time). This is part of the fixes BUG#45831 and BUG#45825. storage/example/ha_example.cc: Made exampledb accept inserts. This was needed by the new test case rpl_ndb_binlog_format_errors, because it needs an engine that is statement-only (and accepts inserts). storage/example/ha_example.h: Made exampledb a statement-only engine instead of a row-only engine. No existing test relied exampledb's row-only capabilities. The new test case rpl_ndb_binlog_format_errors needs an engine that is statement-only. storage/innobase/handler/ha_innodb.cc: - Changed error error code and message given by innodb when binlog_format=STATEMENT and transaction isolation level is READ COMMITTED or READ UNCOMMITTED. - While I was here, also simplified the condition for checking when to give the error.
-rw-r--r--mysql-test/extra/rpl_tests/create_recursive_construct.inc364
-rw-r--r--mysql-test/extra/rpl_tests/rpl_foreign_key.test1
-rw-r--r--mysql-test/extra/rpl_tests/rpl_insert_delayed.test18
-rw-r--r--mysql-test/extra/rpl_tests/rpl_ndb_apply_status.test6
-rw-r--r--mysql-test/include/rpl_udf.inc2
-rw-r--r--mysql-test/r/mysqldump.result2
-rw-r--r--mysql-test/r/sp_trans.result2
-rw-r--r--mysql-test/suite/binlog/r/binlog_innodb.result4
-rw-r--r--mysql-test/suite/binlog/r/binlog_multi_engine.result6
-rw-r--r--mysql-test/suite/binlog/r/binlog_statement_insert_delayed.result4
-rw-r--r--mysql-test/suite/binlog/r/binlog_stm_ps.result2
-rw-r--r--mysql-test/suite/binlog/r/binlog_unsafe.result2666
-rw-r--r--mysql-test/suite/binlog/t/binlog_innodb.test4
-rw-r--r--mysql-test/suite/binlog/t/binlog_multi_engine.test6
-rw-r--r--mysql-test/suite/binlog/t/binlog_unsafe-master.opt1
-rw-r--r--mysql-test/suite/binlog/t/binlog_unsafe.test525
-rw-r--r--mysql-test/suite/rpl/r/rpl_events.result90
-rw-r--r--mysql-test/suite/rpl/r/rpl_extraColmaster_innodb.result2283
-rw-r--r--mysql-test/suite/rpl/r/rpl_extraColmaster_myisam.result2283
-rw-r--r--mysql-test/suite/rpl/r/rpl_foreign_key_innodb.result1
-rw-r--r--mysql-test/suite/rpl/r/rpl_idempotency.result157
-rw-r--r--mysql-test/suite/rpl/r/rpl_mix_found_rows.result (renamed from mysql-test/suite/rpl/r/rpl_found_rows.result)101
-rw-r--r--mysql-test/suite/rpl/r/rpl_mix_insert_delayed.result71
-rw-r--r--mysql-test/suite/rpl/r/rpl_rbr_to_sbr.result7
-rw-r--r--mysql-test/suite/rpl/r/rpl_row_idempotency.result160
-rw-r--r--mysql-test/suite/rpl/r/rpl_row_insert_delayed.result3
-rw-r--r--mysql-test/suite/rpl/r/rpl_stm_found_rows.result110
-rw-r--r--mysql-test/suite/rpl/r/rpl_stm_insert_delayed.result69
-rw-r--r--mysql-test/suite/rpl/r/rpl_stm_loadfile.result5
-rw-r--r--mysql-test/suite/rpl/r/rpl_temporary_errors.result1
-rw-r--r--mysql-test/suite/rpl/r/rpl_udf.result161
-rw-r--r--mysql-test/suite/rpl/t/rpl_bug31076.test1
-rw-r--r--mysql-test/suite/rpl/t/rpl_events.test12
-rw-r--r--mysql-test/suite/rpl/t/rpl_extraColmaster_innodb.test11
-rw-r--r--mysql-test/suite/rpl/t/rpl_extraColmaster_myisam.test11
-rw-r--r--mysql-test/suite/rpl/t/rpl_idempotency-slave.opt1
-rw-r--r--mysql-test/suite/rpl/t/rpl_idempotency.test322
-rw-r--r--mysql-test/suite/rpl/t/rpl_mix_found_rows.test (renamed from mysql-test/suite/rpl/t/rpl_found_rows.test)114
-rw-r--r--mysql-test/suite/rpl/t/rpl_mix_insert_delayed.test5
-rw-r--r--mysql-test/suite/rpl/t/rpl_rbr_to_sbr.test13
-rw-r--r--mysql-test/suite/rpl/t/rpl_row_idempotency.test325
-rw-r--r--mysql-test/suite/rpl/t/rpl_row_insert_delayed.test9
-rw-r--r--mysql-test/suite/rpl/t/rpl_slave_skip.test6
-rw-r--r--mysql-test/suite/rpl/t/rpl_stm_found_rows.test121
-rw-r--r--mysql-test/suite/rpl/t/rpl_stm_insert_delayed.test17
-rw-r--r--mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test18
-rw-r--r--mysql-test/suite/rpl/t/rpl_temporary_errors.test2
-rw-r--r--mysql-test/suite/rpl/t/rpl_udf.test11
-rw-r--r--mysql-test/suite/rpl_ndb/combinations8
-rw-r--r--mysql-test/suite/rpl_ndb/r/rpl_ndb_binlog_format_errors.result116
-rw-r--r--mysql-test/suite/rpl_ndb/r/rpl_ndb_circular_simplex.result1
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_2innodb.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_2myisam.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_basic.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors-master.opt1
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors-slave.opt1
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors.test193
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_blob.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_blob2.test5
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_circular.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_simplex.test7
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_commit_afterflush.test4
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_ctype_ucs2_def.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_delete_nowhere.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_do_db.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_do_table.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_func003.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_innodb_trans.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_insert_ignore.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_mixed_engines_transactions.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_multi_update3.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_rep_ignore.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_row_001.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_sp003.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_sp006.test3
-rw-r--r--mysql-test/suite/rpl_ndb/t/rpl_ndb_trig004.test3
-rw-r--r--mysql-test/t/partition_innodb_stmt.test2
-rw-r--r--sql/event_db_repository.cc2
-rw-r--r--sql/events.cc6
-rw-r--r--sql/ha_ndbcluster_binlog.cc2
-rw-r--r--sql/ha_partition.cc2
-rw-r--r--sql/handler.cc4
-rw-r--r--sql/item_create.cc18
-rw-r--r--sql/log.cc4
-rw-r--r--sql/log_event.cc31
-rw-r--r--sql/log_event_old.cc13
-rw-r--r--sql/mysql_priv.h1
-rw-r--r--sql/rpl_injector.cc2
-rw-r--r--sql/set_var.cc5
-rw-r--r--sql/share/errmsg.txt18
-rw-r--r--sql/sp.cc6
-rw-r--r--sql/sp_head.cc2
-rw-r--r--sql/sp_head.h2
-rw-r--r--sql/sql_acl.cc2
-rw-r--r--sql/sql_base.cc284
-rw-r--r--sql/sql_class.cc121
-rw-r--r--sql/sql_class.h92
-rw-r--r--sql/sql_delete.cc20
-rw-r--r--sql/sql_insert.cc49
-rw-r--r--sql/sql_lex.h67
-rw-r--r--sql/sql_load.cc2
-rw-r--r--sql/sql_parse.cc13
-rw-r--r--sql/sql_repl.cc2
-rw-r--r--sql/sql_table.cc18
-rw-r--r--sql/sql_udf.cc4
-rw-r--r--sql/sql_update.cc13
-rw-r--r--sql/sql_yacc.yy15
-rw-r--r--storage/example/ha_example.cc8
-rw-r--r--storage/example/ha_example.h8
-rw-r--r--storage/innobase/handler/ha_innodb.cc30
110 files changed, 4990 insertions, 6385 deletions
diff --git a/mysql-test/extra/rpl_tests/create_recursive_construct.inc b/mysql-test/extra/rpl_tests/create_recursive_construct.inc
new file mode 100644
index 00000000000..66c82de8b99
--- /dev/null
+++ b/mysql-test/extra/rpl_tests/create_recursive_construct.inc
@@ -0,0 +1,364 @@
+# ==== Purpose ====
+#
+# Creates a stored routine, stored function, trigger, view, or
+# prepared statement (commonly referred to as "recursive construct")
+# that invokes a given unsafe statement.
+#
+# Then, it invokes the created recursive construct several times:
+#
+# - With SQL_LOG_BIN = 1 and binlog_format = STATEMENT, to verify
+# that it gives a warning.
+#
+# - With SQL_LOG_BIN = 0 and binlog_format = STATEMENT, to verify that
+# there is no warning and nothing is logged.
+#
+# - With SQL_LOG_BIN = 1 and binlog_format = MIXED, to verify that it
+# writes row events to the binlog.
+#
+# - If the recursive construct can be invoked so that it has no
+# side-effects but it returns a value that may be nondeterministic,
+# then it is invoked in such a way that the return value is
+# discarded, with SQL_LOG_BIN = 1 and binlog_format = STATEMENT.
+# In this case, no warning should be given and nothing should be
+# written to the binlog.
+#
+# This is an auxiliary file particularly targeted to being used by the
+# test binlog_unsafe. In this context, the purpose is to check how
+# warnings for unsafe statements are propagated in recursive
+# constructs.
+#
+# The statement to invoke ("input") is described using mtr variables,
+# and the resulting recursive construct ("output") is stored in mtr
+# variables in a similar fashion. To create several levels of nested
+# recursive constructs, source this file once, then copy the values of
+# appropriate output variables to the input variables, and then source
+# this file again.
+#
+#
+# ==== Usage ====
+#
+# See binlog_unsafe for an example of how to use this file.
+#
+# let $CRC_ARG_level= <level>;
+# let $CRC_ARG_type= <type>;
+# let $CRC_ARG_stmt_sidef= <stmt>;
+# let $CRC_ARG_value= <stmt>;
+# let $CRC_ARG_sel_retval= <stmt>;
+# let $CRC_ARG_sel_sidef= <stmt>;
+# let $CRC_ARG_desc= <desc>;
+# source extra/rpl_tests/create_recursive_construct.inc;
+# let $my_stmt_sidef= $CRC_RET_stmt_sidef;
+# let $my_value= $CRC_RET_value;
+# let $my_sel_sidef= $CRC_RET_sel_sidef;
+# let $my_sel_retval= $CRC_RET_sel_retval;
+# let $my_drop= $CRC_RET_drop;
+# let $my_is_toplevel= $CRC_RET_top_is_toplevel;
+# let $my_desc= $CRC_RET_desc;
+#
+# $CRC_ARG_* are used as input parameters (arguments) to this file:
+#
+# $CRC_ARG_level is the recursion depth: 1 for the innermost
+# statement created, 2 for a statement that invokes a statement on
+# level 1, etc.
+#
+# $CRC_ARG_type is an integer from 0 to 6, indicating what type of
+# statement shall be created:
+# 0 - Create a stored function where the return value depends on
+# the value of the given statement.
+# 1 - Create a stored function that invokes the given statement as
+# a side-effect but may not return a value that depends on it.
+# 2 - Create a stored routine that invokes the given statement.
+# 3 - Create a trigger (on table trigger_table_$CRC_ARG_level) that
+# invokes the given statement.
+# 4 - Create a view that returns a value that depends on the value
+# of the given statement.
+# 5 - Create a view that invokes the given statement but may return
+# a value that does not depend on it.
+# 6 - Create a prepared statement that invokes the given statement.
+#
+# $CRC_ARG_stmt_sidef is the statement to invoke. It should be a
+# statement that can be invoked on its own (not sub-statement),
+# which causes something unsafe to be written to the binlog.
+#
+# $CRC_ARG_value is a sub-statement holding the value of the given
+# statement. Can be empty if the given statement does not have a
+# value. Typically, this is non-empty if the given statement is a
+# function call or user variable, but not if it is a stored routine
+# call, INSERT, SELECT, etc (because none of them has a value).
+# $CRC_ARG_value is used only when $CRC_ARG_type=6.
+#
+# $CRC_ARG_sel_sidef is a SELECT sub-statement that invokes the
+# statement as a side-effect, but returns a result set that may not
+# depend on the statement. Can be empty if the statement cannot
+# produce a result set from a SELECT. $CRC_ARG_sel_sidef is used
+# only if $CRC_ARG_type=2
+#
+# $CRC_ARG_sel_retval is a SELECT sub-statement that does not have
+# side-effects, but returns a result set that depends on the unsafe
+# statement. Can be empty if the statement cannot be invoked from a
+# SELECT. $CRC_ARG_sel_retval is used only if $CRC_ARG_type=3.
+#
+# $CRC_ARG_desc is a human-readable description of the statement to
+# invoke.
+#
+# $CRC_RET_* are used as output parameters (return values) of this
+# file:
+#
+# $CRC_RET_stmt_sidef is a statement invoking the resulting recursive
+# construct.
+#
+# $CRC_RET_value is a sub-statement invoking the resulting recursive
+# construct and returning the value of the recursive construct.
+# This is the empty string if the resulting recursive construct does
+# not have a value. In particular, this is non-empty only if
+# $CRC_ARG_value=7.
+#
+# $CRC_RET_sel_sidef is a SELECT sub-statement that invokes the
+# resulting recursive construct as a side-effect but where the
+# result set may not depend on the recursive construct. This is the
+# empty string if the recursive construct cannot be invoked from a
+# SELECT. In particular, this is non-empty only if $CRC_ARG_value=6
+# or $CRC_ARG_value=2.
+#
+# $CRC_RET_sel_retval is a SELECT sub-statement that does not have
+# side-effects, but returns a result set depending on the unsafe
+# statement. This is the empty string if the recursive construct
+# cannot produce a result set from a SELECT. In particular, this is
+# non-empty only if $CRC_ARG_value=7 or $CRC_ARG_value=3.
+#
+# $CRC_RET_drop is a statement that drops the created object. I.e.,
+# it is one of 'DROP FUNCTION <func>', 'DROP PROCEDURE <proc>', etc.
+#
+# $CRC_RET_top_is_toplevel is 0 normally, or 1 if the resulting
+# recursive construct can only be called from a top-level statement.
+# In particular, this is 1 only when $CRC_ARG_value=1, because
+# prepared statements cannot be invoked from other recursive
+# constructs.
+#
+# $CRC_RET_desc is a text string that describes the invokation of
+# the recursive construct in a human-readable fashion.
+#
+# Assumptions
+#
+# Before sourcing this file with $CRC_ARG_level=X, you need to
+# create three tables: tX, taX and trigger_table_X. These are used
+# as auxiliary tables.
+
+
+#--echo debug: >>>>ENTER create_recursive_construct
+#--echo debug: level=$CRC_ARG_level
+#--echo debug: type=$CRC_ARG_type
+#--echo debug: stmt_sidef=$CRC_ARG_stmt_sidef
+#--echo debug: value=$CRC_ARG_value
+#--echo debug: sel_retval=$CRC_ARG_sel_retval
+#--echo debug: sel_sidef=$CRC_ARG_sel_sidef
+
+--let $CRC_RET_stmt_sidef=
+--let $CRC_RET_value=
+--let $CRC_RET_sel_retval=
+--let $CRC_RET_sel_sidef=
+--let $CRC_RET_drop=
+--let $CRC_RET_is_toplevel= 1
+--let $CRC_RET_desc=
+--let $CRC_name=
+--let $CRC_create=
+
+######## func_retval ########
+if (`SELECT $CRC_ARG_type = 0 AND '$CRC_ARG_value' != ''`) {
+ # It will be safe to call this function and discard the return
+ # value, but it will be unsafe to use return value (e.g., in
+ # INSERT...SELECT).
+ --let $CRC_name= func_retval_$CRC_ARG_level
+ --let $CRC_create= CREATE FUNCTION $CRC_name() RETURNS VARCHAR(100) BEGIN INSERT INTO ta$CRC_ARG_level VALUES (47); RETURN $CRC_ARG_value; END
+ --let $CRC_RET_stmt_sidef= INSERT INTO t$CRC_ARG_level VALUES ($CRC_name())
+ --let $CRC_RET_value= $CRC_name()
+ --let $CRC_RET_sel_sidef=
+ --let $CRC_RET_sel_retval= SELECT $CRC_name()
+ --let $CRC_RET_drop= DROP FUNCTION $CRC_name
+ --let $CRC_RET_is_toplevel= 0
+ --let $CRC_RET_desc= function $CRC_name returning value from $CRC_ARG_desc
+}
+
+######## func_sidef ########
+if (`SELECT $CRC_ARG_type = 1`) {
+ # It will be unsafe to call func even if you discard return value.
+ --let $CRC_name= func_sidef_$CRC_ARG_level
+ --let $CRC_create= CREATE FUNCTION $CRC_name() RETURNS VARCHAR(100) BEGIN INSERT INTO ta$CRC_ARG_level VALUES (47); $CRC_ARG_stmt_sidef; RETURN 0; END
+ --let $CRC_RET_stmt_sidef= INSERT INTO t$CRC_ARG_level SELECT $CRC_name()
+ --let $CRC_RET_value=
+ --let $CRC_RET_sel_retval=
+ --let $CRC_RET_sel_sidef= SELECT $CRC_name()
+ --let $CRC_RET_drop= DROP FUNCTION $CRC_name
+ --let $CRC_RET_is_toplevel= 0
+ --let $CRC_RET_desc= function $CRC_name invoking $CRC_ARG_desc
+}
+
+######## proc ########
+if (`SELECT $CRC_ARG_type = 2`) {
+ # It will be unsafe to call this procedure.
+ --let $CRC_name= proc_$CRC_ARG_level
+ --let $CRC_create= CREATE PROCEDURE $CRC_name() BEGIN INSERT INTO ta$CRC_ARG_level VALUES (47); $CRC_ARG_stmt_sidef; END
+ --let $CRC_RET_stmt_sidef= CALL $CRC_name()
+ --let $CRC_RET_value=
+ --let $CRC_RET_sel_retval=
+ --let $CRC_RET_sel_sidef=
+ --let $CRC_RET_drop= DROP PROCEDURE $CRC_name
+ --let $CRC_RET_is_toplevel= 0
+ --let $CRC_RET_desc= procedure $CRC_name invoking $CRC_ARG_desc
+}
+
+######## trig ########
+if (`SELECT $CRC_ARG_type = 3`) {
+ # It will be unsafe to invoke this trigger.
+ --let $CRC_name= trig_$CRC_ARG_level
+ --let $CRC_create= CREATE TRIGGER $CRC_name BEFORE INSERT ON trigger_table_$CRC_ARG_level FOR EACH ROW BEGIN INSERT INTO ta$CRC_ARG_level VALUES (47); $CRC_ARG_stmt_sidef; END
+ --let $CRC_RET_stmt_sidef= INSERT INTO trigger_table_$CRC_ARG_level VALUES (1)
+ --let $CRC_RET_value=
+ --let $CRC_RET_sel_retval=
+ --let $CRC_RET_sel_sidef=
+ --let $CRC_RET_drop= DROP TRIGGER $CRC_name
+ --let $CRC_RET_is_toplevel= 0
+ --let $CRC_RET_desc= trigger $CRC_name invoking $CRC_ARG_desc
+}
+
+######## view_retval ########
+if (`SELECT $CRC_ARG_type = 4 AND '$CRC_ARG_sel_retval' != ''`) {
+ # It will be safe to select from this view if you discard the result
+ # set, but unsafe to use result set (e.g., in INSERT..SELECT).
+ --let $CRC_name= view_retval_$CRC_ARG_level
+ --let $CRC_create= CREATE VIEW $CRC_name AS $CRC_ARG_sel_retval
+ --let $CRC_RET_stmt_sidef= INSERT INTO t$CRC_ARG_LEVEL SELECT * FROM $CRC_name
+ --let $CRC_RET_value=
+ --let $CRC_RET_sel_retval= SELECT * FROM $CRC_name
+ --let $CRC_RET_sel_sidef=
+ --let $CRC_RET_drop= DROP VIEW $CRC_name
+ --let $CRC_RET_is_toplevel= 0
+ --let $CRC_RET_desc= view $CRC_name returning value from $CRC_ARG_desc
+}
+
+######## view_sidef ########
+if (`SELECT $CRC_ARG_type = 5 AND '$CRC_ARG_sel_sidef' != ''`) {
+ # It will be unsafe to select from this view, even if you discard
+ # the return value.
+ --let $CRC_name= view_sidef_$CRC_ARG_level
+ --let $CRC_create= CREATE VIEW $CRC_name AS $CRC_ARG_sel_sidef
+ --let $CRC_RET_stmt_sidef= INSERT INTO t$CRC_ARG_level SELECT * FROM $CRC_name
+ --let $CRC_RET_value=
+ --let $CRC_RET_sel_retval=
+ --let $CRC_RET_sel_sidef= SELECT * FROM $CRC_name
+ --let $CRC_RET_drop= DROP VIEW $CRC_name
+ --let $CRC_RET_is_toplevel= 0
+ --let $CRC_RET_desc= view $CRC_name invoking $CRC_ARG_desc
+}
+
+######## prep ########
+if (`SELECT $CRC_ARG_type = 6`) {
+ # It will be unsafe to execute this prepared statement
+ --let $CRC_name= prep_$CRC_ARG_level
+ --let $CRC_create= PREPARE $CRC_name FROM "$CRC_ARG_stmt_sidef"
+ --let $CRC_RET_stmt_sidef= EXECUTE $CRC_name
+ --let $CRC_RET_value=
+ --let $CRC_RET_sel_retval=
+ --let $CRC_RET_sel_sidef=
+ --let $CRC_RET_drop= DROP PREPARE $CRC_name
+ --let $CRC_RET_is_toplevel= 1
+ --let $CRC_RET_desc= prepared statement $CRC_name invoking $CRC_ARG_desc
+}
+
+######## no recursive construct: just return the given statement ########
+if (`SELECT $CRC_ARG_type = 7`) {
+ # CRC_ARG_type=7 is a special case. We just set $CRC_RET_x =
+ # $CRC_ARG_x. This way, the $CRC_ARG_stmt gets executed directly
+ # (below). In binlog_unsafe.test, it is used to invoke the unsafe
+ # statement created in the outermost loop directly, without
+ # enclosing it in a recursive construct.
+ --let $CRC_RET_stmt_sidef= $CRC_ARG_stmt_sidef
+ --let $CRC_RET_value= $CRC_ARG_value
+ --let $CRC_RET_sel_retval= $CRC_ARG_sel_retval
+ --let $CRC_RET_sel_sidef= $CRC_ARG_sel_sidef
+ --let $CRC_RET_drop=
+ --let $CRC_RET_is_toplevel= 1
+ --let $CRC_RET_desc= $CRC_ARG_desc
+}
+
+######## execute! ########
+if (`SELECT '$CRC_RET_stmt_sidef' != ''`) {
+ --echo
+ --echo Invoking $CRC_RET_desc.
+ if (`SELECT '$CRC_create' != ''`) {
+ --eval $CRC_create
+ }
+
+ --echo * binlog_format = STATEMENT: expect warning.
+ --eval $CRC_RET_stmt_sidef
+
+ # These queries are run without query log, to make result file more
+ # readable. Debug info is only printed if something abnormal
+ # happens.
+ --disable_query_log
+
+ --echo * SQL_LOG_BIN = 0: expect nothing logged and no warning.
+ SET SQL_LOG_BIN = 0;
+ RESET MASTER;
+ --eval $CRC_RET_stmt_sidef
+ --let $binlog_event= query_get_value(SHOW BINLOG EVENTS, Event_type, 2)
+ if (`SELECT '$binlog_event' != 'No such row'`) {
+ --enable_query_log
+ --echo Failure! Something was written to the binlog despite SQL_LOG_BIN=0:
+ SHOW BINLOG EVENTS;
+ --die
+ }
+ SET SQL_LOG_BIN = 1;
+
+ --echo * binlog_format = MIXED: expect row events in binlog and no warning.
+ SET binlog_format = MIXED;
+ RESET MASTER;
+ --eval $CRC_RET_stmt_sidef
+ # The first event is format_description, the second is
+ # Query_event('BEGIN'), and the third should be our Table_map.
+ --let $event_type= query_get_value(SHOW BINLOG EVENTS, Event_type, 3)
+ if (`SELECT '$event_type' != 'Table_map'`) {
+ --enable_query_log
+ --echo Failure! Event number 3 was a '$event_type', not a 'Table_map'.
+
+ # Currently, there is a bug causing some statements to be logged
+ # partially in statement format. Hence, we don't fail here, we
+ # just print the events (masking out nondeterministic components
+ # of the output) and continue. When binloggging works perfectly,
+ # we should instead execute:
+ #--enable_query_log
+ #SHOW BINLOG EVENTS;
+ #--die
+
+ # Here, we should really source
+ # include/show_binlog_events.inc. But due to BUG#41913, that
+ # doesn't work, and we have to inline the entire file here. Sigh
+ # :-(
+ --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR 106 <binlog_start>
+ --replace_column 2 # 4 # 5 #
+ --replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/ /file_id=[0-9]+/file_id=#/ /block_len=[0-9]+/block_len=#/
+ --eval SHOW BINLOG EVENTS FROM 106
+ --disable_query_log
+ }
+ SET binlog_format = STATEMENT;
+
+ --enable_query_log
+}
+
+# Invoke created object, discarding the return value. This should not
+# give any warning.
+if (`SELECT '$CRC_RET_sel_retval' != ''`) {
+ --echo * Invoke statement so that return value is dicarded: expect no warning.
+ --disable_result_log
+ --eval $CRC_RET_sel_retval
+ --enable_result_log
+}
+
+#--echo debug: <<<<EXIT create_recursive_construct
+#--echo debug: stmt_sidef=$CRC_RET_stmt_sidef
+#--echo debug: value=$CRC_RET_value
+#--echo debug: sel_retval=$CRC_RET_sel_retval
+#--echo debug: sel_sidef=$CRC_RET_sel_sidef
+#--echo debug: drop=$CRC_RET_drop
+#--echo debug: is_toplevel=$CRC_RET_is_toplevel
+#--echo debug: desc=$CRC_RET_desc
diff --git a/mysql-test/extra/rpl_tests/rpl_foreign_key.test b/mysql-test/extra/rpl_tests/rpl_foreign_key.test
index 8755bf5aa87..ea16237435c 100644
--- a/mysql-test/extra/rpl_tests/rpl_foreign_key.test
+++ b/mysql-test/extra/rpl_tests/rpl_foreign_key.test
@@ -47,7 +47,6 @@ insert into t1 set b=1;
insert into t2 set a=1, b=1;
set foreign_key_checks=0;
-set @@session.binlog_format=row;
delete from t1;
--echo must sync w/o a problem (could not with the buggy code)
diff --git a/mysql-test/extra/rpl_tests/rpl_insert_delayed.test b/mysql-test/extra/rpl_tests/rpl_insert_delayed.test
index e492903afad..a2c8c94bb05 100644
--- a/mysql-test/extra/rpl_tests/rpl_insert_delayed.test
+++ b/mysql-test/extra/rpl_tests/rpl_insert_delayed.test
@@ -38,14 +38,14 @@ connection master;
truncate table t1;
# first scenario: duplicate on first row
insert delayed into t1 values(10, "my name");
-if ($binlog_format_statement)
+if (`SELECT @@session.binlog_format = 'STATEMENT'`)
{
# statement below will be converted to non-delayed INSERT and so
# will stop at first error, guaranteeing replication.
--error ER_DUP_ENTRY
insert delayed into t1 values(10, "is Bond"), (20, "James Bond");
}
-if (!$binlog_format_statement)
+if (`SELECT @@session.binlog_format != 'STATEMENT'`)
{
insert delayed into t1 values(10, "is Bond"), (20, "James Bond");
}
@@ -59,7 +59,7 @@ select * from t1;
# second scenario: duplicate on second row
connection master;
delete from t1 where id!=10;
-if ($binlog_format_statement)
+if (`SELECT @@session.binlog_format = 'STATEMENT'`)
{
# statement below will be converted to non-delayed INSERT and so
# will be binlogged with its ER_DUP_ENTRY error code, guaranteeing
@@ -67,7 +67,7 @@ if ($binlog_format_statement)
--error ER_DUP_ENTRY
insert delayed into t1 values(20, "is Bond"), (10, "James Bond");
}
-if (!$binlog_format_statement)
+if (`SELECT @@session.binlog_format != 'STATEMENT'`)
{
insert delayed into t1 values(20, "is Bond"), (10, "James Bond");
}
@@ -90,7 +90,7 @@ connection master;
# Bug #29571: INSERT DELAYED IGNORE written to binary log on the master but
# on the slave
#
-if (`SELECT @@global.binlog_format != 'ROW'`)
+if (`SELECT @@session.binlog_format != 'ROW'`)
{
#flush the logs before the test
connection slave;
@@ -104,20 +104,22 @@ INSERT DELAYED IGNORE INTO t1 VALUES(1);
INSERT DELAYED IGNORE INTO t1 VALUES(1);
flush table t1; # to wait for INSERT DELAYED to be done
-if (`SELECT @@global.binlog_format != 'ROW'`)
+if (`SELECT @@session.binlog_format != 'ROW'`)
{
#must show two INSERT DELAYED
--replace_column 1 x 2 x 3 x 4 x 5 x
+ --replace_regex /table_id: [0-9]+/table_id: #/
show binlog events in 'master-bin.000002' LIMIT 2,2;
}
select * from t1;
sync_slave_with_master;
echo On slave;
-if (`SELECT @@global.binlog_format != 'ROW'`)
+if (`SELECT @@session.binlog_format != 'ROW'`)
{
#must show two INSERT DELAYED
--replace_column 1 x 2 x 3 x 4 x 5 x
+ --replace_regex /table_id: [0-9]+/table_id: #/
show binlog events in 'slave-bin.000002' LIMIT 2,2;
}
select * from t1;
@@ -127,7 +129,7 @@ select * from t1;
connection master;
drop table t1;
sync_slave_with_master;
-if (`SELECT @@global.binlog_format != 'ROW'`)
+if (`SELECT @@session.binlog_format != 'ROW'`)
{
#flush the logs after the test
FLUSH LOGS;
diff --git a/mysql-test/extra/rpl_tests/rpl_ndb_apply_status.test b/mysql-test/extra/rpl_tests/rpl_ndb_apply_status.test
index 4677f6da25d..7ab99ef65dd 100644
--- a/mysql-test/extra/rpl_tests/rpl_ndb_apply_status.test
+++ b/mysql-test/extra/rpl_tests/rpl_ndb_apply_status.test
@@ -141,7 +141,9 @@ let $run= 5;
while ($run)
{
START TRANSACTION;
+ --disable_warnings
--eval CALL tpcb.trans($rpl_format);
+ --enable_warnings
eval SET @my_errno= $mysql_errno;
let $run_good= `SELECT @my_errno = 0`;
let $run_bad= `SELECT @my_errno <> 0`;
@@ -190,7 +192,9 @@ let $run= 5;
while ($run)
{
START TRANSACTION;
+ --disable_warnings
--eval CALL tpcb.trans($rpl_format);
+ --enable_warnings
eval SET @my_errno= $mysql_errno;
let $run_good= `SELECT @my_errno = 0`;
let $run_bad= `SELECT @my_errno <> 0`;
@@ -240,7 +244,9 @@ let $run= 5;
while ($run)
{
START TRANSACTION;
+ --disable_warnings
--eval CALL tpcb.trans($rpl_format);
+ --enable_warnings
eval SET @my_errno= $mysql_errno;
let $run_good= `SELECT @my_errno = 0`;
let $run_bad= `SELECT @my_errno <> 0`;
diff --git a/mysql-test/include/rpl_udf.inc b/mysql-test/include/rpl_udf.inc
index 30f39d79d49..8be866613cb 100644
--- a/mysql-test/include/rpl_udf.inc
+++ b/mysql-test/include/rpl_udf.inc
@@ -55,11 +55,13 @@ connection master;
--echo "Running on the master"
--enable_info
eval CREATE TABLE t1(sum INT, price FLOAT(24)) ENGINE=$engine_type;
+--disable_warnings
INSERT INTO t1 VALUES(myfunc_int(100), myfunc_double(50.00));
INSERT INTO t1 VALUES(myfunc_int(10), myfunc_double(5.00));
INSERT INTO t1 VALUES(myfunc_int(200), myfunc_double(25.00));
INSERT INTO t1 VALUES(myfunc_int(1), myfunc_double(500.00));
SELECT * FROM t1 ORDER BY sum;
+--enable_warnings
--disable_info
sync_slave_with_master;
diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result
index 1345481d6d8..5c03c3fa13c 100644
--- a/mysql-test/r/mysqldump.result
+++ b/mysql-test/r/mysqldump.result
@@ -2239,6 +2239,8 @@ create view v1 as
select * from v3 where b in (1, 2, 3, 4, 5, 6, 7);
create view v2 as
select v3.a from v3, v1 where v1.a=v3.a and v3.b=3 limit 1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS select v3.a from v3, v1 where v1.a=v3.a and v3.b=3 limit 1
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
diff --git a/mysql-test/r/sp_trans.result b/mysql-test/r/sp_trans.result
index 3cc251bc0a6..8ce6d696bcc 100644
--- a/mysql-test/r/sp_trans.result
+++ b/mysql-test/r/sp_trans.result
@@ -506,6 +506,8 @@ select count(*)*255 from t3 into table_size;
until table_size > max_table_size*2 end repeat;
end|
call bug14210_fill_table()|
+Warnings:
+Note 1592 Unsafe statement binlogged as statement since BINLOG_FORMAT is STATEMENT.
drop procedure bug14210_fill_table|
create table t4 like t3|
create procedure bug14210()
diff --git a/mysql-test/suite/binlog/r/binlog_innodb.result b/mysql-test/suite/binlog/r/binlog_innodb.result
index 1922897f631..4a04a7f967e 100644
--- a/mysql-test/suite/binlog/r/binlog_innodb.result
+++ b/mysql-test/suite/binlog/r/binlog_innodb.result
@@ -14,12 +14,12 @@ SET BINLOG_FORMAT=STATEMENT;
BEGIN;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
UPDATE t1 SET b = 1*a WHERE a > 1;
-ERROR HY000: Binary logging not possible. Message: Transaction level 'READ-UNCOMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT'
+ERROR HY000: Cannot execute statement: binlogging impossible since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.
COMMIT;
BEGIN;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
UPDATE t1 SET b = 2*a WHERE a > 2;
-ERROR HY000: Binary logging not possible. Message: Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT'
+ERROR HY000: Cannot execute statement: binlogging impossible since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.
COMMIT;
BEGIN;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
diff --git a/mysql-test/suite/binlog/r/binlog_multi_engine.result b/mysql-test/suite/binlog/r/binlog_multi_engine.result
index 9252229903b..d7636b1cb77 100644
--- a/mysql-test/suite/binlog/r/binlog_multi_engine.result
+++ b/mysql-test/suite/binlog/r/binlog_multi_engine.result
@@ -42,7 +42,7 @@ INSERT INTO t1m VALUES (1,1), (1,2), (2,1), (2,2);
INSERT INTO t1n VALUES (1,1), (1,2), (2,1), (2,2);
UPDATE t1m, t1b SET m = 2, b = 3 WHERE n = c;
UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
-ERROR HY000: Binary logging not possible. Message: Statement cannot be written atomically since more than one engine involved and at least one engine is self-logging
+ERROR HY000: Cannot execute statement: binlogging impossible since more than one engine is involved and at least one engine is self-logging.
TRUNCATE t1m;
TRUNCATE t1b;
TRUNCATE t1n;
@@ -68,9 +68,9 @@ INSERT INTO t1m VALUES (1,1), (1,2), (2,1), (2,2);
INSERT INTO t1b VALUES (1,1), (1,2), (2,1), (2,2);
INSERT INTO t1n VALUES (1,1), (1,2), (2,1), (2,2);
UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
-ERROR HY000: Binary logging not possible. Message: Statement cannot be written atomically since more than one engine involved and at least one engine is self-logging
+ERROR HY000: Cannot execute statement: binlogging impossible since more than one engine is involved and at least one engine is self-logging.
UPDATE t1n, t1b SET e = 2, b = 3 WHERE f = c;
-ERROR HY000: Binary logging not possible. Message: Statement cannot be written atomically since more than one engine involved and at least one engine is self-logging
+ERROR HY000: Cannot execute statement: binlogging impossible since more than one engine is involved and at least one engine is self-logging.
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
mysqld-bin.000001 # Query # # BEGIN
diff --git a/mysql-test/suite/binlog/r/binlog_statement_insert_delayed.result b/mysql-test/suite/binlog/r/binlog_statement_insert_delayed.result
index 800bb58e9cc..f4c9e4091b9 100644
--- a/mysql-test/suite/binlog/r/binlog_statement_insert_delayed.result
+++ b/mysql-test/suite/binlog/r/binlog_statement_insert_delayed.result
@@ -12,7 +12,11 @@ master-bin.000001 # Query # # use `test`; insert delayed into t1 values (null)
master-bin.000001 # Query # # use `test`; insert delayed into t1 values (300)
master-bin.000001 # Query # # use `test`; FLUSH TABLES
insert delayed into t1 values (null),(null),(null),(null);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: insert delayed into t1 values (null),(null),(null),(null)
insert delayed into t1 values (null),(null),(400),(null);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: insert delayed into t1 values (null),(null),(400),(null)
select * from t1;
a
207
diff --git a/mysql-test/suite/binlog/r/binlog_stm_ps.result b/mysql-test/suite/binlog/r/binlog_stm_ps.result
index 3af525e297c..97daba735b2 100644
--- a/mysql-test/suite/binlog/r/binlog_stm_ps.result
+++ b/mysql-test/suite/binlog/r/binlog_stm_ps.result
@@ -11,7 +11,7 @@ prepare s from "insert into t1 select 100 limit ?";
set @a=100;
execute s using @a;
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: insert into t1 select 100 limit 100
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Query # # use `test`; create table t1 (a int)
diff --git a/mysql-test/suite/binlog/r/binlog_unsafe.result b/mysql-test/suite/binlog/r/binlog_unsafe.result
index 4c2c32ad8f1..685a0f9ef57 100644
--- a/mysql-test/suite/binlog/r/binlog_unsafe.result
+++ b/mysql-test/suite/binlog/r/binlog_unsafe.result
@@ -1,210 +1,2451 @@
-==== Setup tables ====
-CREATE TABLE t1 (a INT);
+#### Setup tables ####
+CREATE TABLE t0 (a CHAR(40));
+CREATE TABLE t1 (a CHAR(40));
CREATE TABLE t2 (a CHAR(40));
-CREATE TABLE t3 (a INT AUTO_INCREMENT PRIMARY KEY);
-CREATE TABLE trigger_table (a CHAR(7));
-CREATE TABLE trigger_table2 (a INT);
-==== Non-deterministic statements ====
-INSERT DELAYED INTO t1 VALUES (5);
-==== Some variables that *should* be unsafe ====
----- Insert directly ----
-INSERT INTO t1 VALUES (@@global.sync_binlog);
+CREATE TABLE t3 (a CHAR(40));
+CREATE TABLE ta1 (a CHAR(40));
+CREATE TABLE ta2 (a CHAR(40));
+CREATE TABLE ta3 (a CHAR(40));
+CREATE TABLE autoinc_table (a INT PRIMARY KEY AUTO_INCREMENT);
+CREATE TABLE double_autoinc_table (a INT PRIMARY KEY AUTO_INCREMENT);
+CREATE TRIGGER double_autoinc_trig BEFORE INSERT ON double_autoinc_table FOR EACH ROW BEGIN
+INSERT INTO autoinc_table VALUES (NULL);
+END|
+CREATE TABLE data_table (a CHAR(40));
+INSERT INTO data_table VALUES ('foo');
+CREATE TABLE trigger_table_1 (a INT);
+CREATE TABLE trigger_table_2 (a INT);
+CREATE TABLE trigger_table_3 (a INT);
+CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "UDF_EXAMPLE_LIB";
+
+==== Testing UUID() unsafeness ====
+
+Invoking function func_retval_1 returning value from unsafe UUID() function.
+CREATE FUNCTION func_retval_1() RETURNS VARCHAR(100) BEGIN INSERT INTO ta1 VALUES (47); RETURN UUID(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t1 VALUES (func_retval_1());
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-INSERT INTO t1 VALUES (@@session.insert_id);
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (func_retval_1())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT func_retval_1();
+
+Invoking function func_retval_2 returning value from function func_retval_1 returning value from unsafe UUID() function.
+CREATE FUNCTION func_retval_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); RETURN func_retval_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 VALUES (func_retval_2());
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-INSERT INTO t1 VALUES (@@global.auto_increment_increment);
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 VALUES (func_retval_2())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT func_retval_2();
+DROP FUNCTION func_retval_2;
+
+Invoking function func_sidef_2 invoking function func_retval_1 returning value from unsafe UUID() function.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 VALUES (func_retval_1()); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-INSERT INTO t2 SELECT UUID();
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (func_retval_1())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking function func_retval_1 returning value from unsafe UUID() function.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 VALUES (func_retval_1()); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-INSERT INTO t2 VALUES (@@session.sql_mode);
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (func_retval_1())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking function func_retval_1 returning value from unsafe UUID() function.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 VALUES (func_retval_1()); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-INSERT INTO t2 VALUES (@@global.init_slave);
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (func_retval_1())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking view view_retval_2 returning value from function func_retval_1 returning value from unsafe UUID() function.
+CREATE VIEW view_retval_2 AS SELECT func_retval_1();
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-INSERT INTO t2 VALUES (@@hostname);
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_retval_2` AS SELECT func_retval_1()
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT * FROM view_retval_2;
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
----- Insert from stored procedure ----
-CREATE PROCEDURE proc()
-BEGIN
-INSERT INTO t1 VALUES (@@global.sync_binlog);
-INSERT INTO t1 VALUES (@@session.insert_id);
-INSERT INTO t1 VALUES (@@global.auto_increment_increment);
-INSERT INTO t2 SELECT UUID();
-INSERT INTO t2 VALUES (@@session.sql_mode);
-INSERT INTO t2 VALUES (@@global.init_slave);
-INSERT INTO t2 VALUES (@@hostname);
-END|
-CALL proc();
-Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
----- Insert from stored function ----
-CREATE FUNCTION func()
-RETURNS INT
-BEGIN
-INSERT INTO t1 VALUES (@@global.sync_binlog);
-INSERT INTO t1 VALUES (@@session.insert_id);
-INSERT INTO t1 VALUES (@@global.auto_increment_increment);
-INSERT INTO t2 SELECT UUID();
-INSERT INTO t2 VALUES (@@session.sql_mode);
-INSERT INTO t2 VALUES (@@global.init_slave);
-INSERT INTO t2 VALUES (@@hostname);
-RETURN 0;
-END|
-SELECT func();
-func()
-0
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT * FROM view_retval_2
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT * FROM view_retval_2;
+DROP VIEW view_retval_2;
+
+Invoking prepared statement prep_2 invoking function func_retval_1 returning value from unsafe UUID() function.
+PREPARE prep_2 FROM "INSERT INTO t1 VALUES (func_retval_1())";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
----- Insert from trigger ----
-CREATE TRIGGER trig
-BEFORE INSERT ON trigger_table
-FOR EACH ROW
-BEGIN
-INSERT INTO t1 VALUES (@@global.sync_binlog);
-INSERT INTO t1 VALUES (@@session.insert_id);
-INSERT INTO t1 VALUES (@@global.auto_increment_increment);
-INSERT INTO t2 SELECT UUID();
-INSERT INTO t2 VALUES (@@session.sql_mode);
-INSERT INTO t2 VALUES (@@global.init_slave);
-INSERT INTO t2 VALUES (@@hostname);
-END|
-INSERT INTO trigger_table VALUES ('bye.');
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (func_retval_1())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP FUNCTION func_retval_1;
+
+Invoking function func_sidef_1 invoking unsafe UUID() function.
+CREATE FUNCTION func_sidef_1() RETURNS VARCHAR(100) BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO t0 VALUES (UUID()); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t1 SELECT func_sidef_1();
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
----- Insert from prepared statement ----
-PREPARE p1 FROM 'INSERT INTO t1 VALUES (@@global.sync_binlog)';
-PREPARE p2 FROM 'INSERT INTO t1 VALUES (@@session.insert_id)';
-PREPARE p3 FROM 'INSERT INTO t1 VALUES (@@global.auto_increment_increment)';
-PREPARE p4 FROM 'INSERT INTO t2 SELECT UUID()';
-PREPARE p5 FROM 'INSERT INTO t2 VALUES (@@session.sql_mode)';
-PREPARE p6 FROM 'INSERT INTO t2 VALUES (@@global.init_slave)';
-PREPARE p7 FROM 'INSERT INTO t2 VALUES (@@hostname)';
-EXECUTE p1;
-Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-EXECUTE p2;
-Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-EXECUTE p3;
-Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-EXECUTE p4;
-Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-EXECUTE p5;
-Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-EXECUTE p6;
-Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-EXECUTE p7;
-Warnings:
-Note 1592 Statement may not be safe to log in statement format.
----- Insert from nested call of triggers / functions / procedures ----
-CREATE PROCEDURE proc1()
-INSERT INTO trigger_table VALUES ('ha!')|
-CREATE FUNCTION func2()
-RETURNS INT
-BEGIN
-CALL proc1();
-RETURN 0;
-END|
-CREATE TRIGGER trig3
-BEFORE INSERT ON trigger_table2
-FOR EACH ROW
-BEGIN
-DECLARE tmp INT;
-SELECT func2() INTO tmp;
-END|
-CREATE PROCEDURE proc4()
-INSERT INTO trigger_table2 VALUES (1)|
-CREATE FUNCTION func5()
-RETURNS INT
-BEGIN
-CALL proc4;
-RETURN 0;
-END|
-PREPARE prep6 FROM 'SELECT func5()'|
-EXECUTE prep6;
-func5()
-0
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking function func_sidef_1 invoking unsafe UUID() function.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-==== Variables that should *not* be unsafe ====
-INSERT INTO t1 VALUES (@@session.pseudo_thread_id);
-INSERT INTO t1 VALUES (@@session.pseudo_thread_id);
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking function func_sidef_1 invoking unsafe UUID() function.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking function func_sidef_1 invoking unsafe UUID() function.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking view view_sidef_2 invoking function func_sidef_1 invoking unsafe UUID() function.
+CREATE VIEW view_sidef_2 AS SELECT func_sidef_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_sidef_2` AS SELECT func_sidef_1()
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT * FROM view_sidef_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT * FROM view_sidef_2
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP VIEW view_sidef_2;
+
+Invoking prepared statement prep_2 invoking function func_sidef_1 invoking unsafe UUID() function.
+PREPARE prep_2 FROM "INSERT INTO t1 SELECT func_sidef_1()";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP FUNCTION func_sidef_1;
+
+Invoking procedure proc_1 invoking unsafe UUID() function.
+CREATE PROCEDURE proc_1() BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO t0 VALUES (UUID()); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking procedure proc_1 invoking unsafe UUID() function.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking procedure proc_1 invoking unsafe UUID() function.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking procedure proc_1 invoking unsafe UUID() function.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking prepared statement prep_2 invoking procedure proc_1 invoking unsafe UUID() function.
+PREPARE prep_2 FROM "CALL proc_1()";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP PROCEDURE proc_1;
+
+Invoking trigger trig_1 invoking unsafe UUID() function.
+CREATE TRIGGER trig_1 BEFORE INSERT ON trigger_table_1 FOR EACH ROW BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO t0 VALUES (UUID()); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_1 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking trigger trig_1 invoking unsafe UUID() function.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking trigger trig_1 invoking unsafe UUID() function.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.trigger_table_1)
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking trigger trig_1 invoking unsafe UUID() function.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking prepared statement prep_2 invoking trigger trig_1 invoking unsafe UUID() function.
+PREPARE prep_2 FROM "INSERT INTO trigger_table_1 VALUES (1)";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP TRIGGER trig_1;
+
+Invoking view view_retval_1 returning value from unsafe UUID() function.
+CREATE VIEW view_retval_1 AS SELECT UUID();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_retval_1` AS SELECT UUID()
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t1 SELECT * FROM view_retval_1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_retval_1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT * FROM view_retval_1;
+
+Invoking function func_sidef_2 invoking view view_retval_1 returning value from unsafe UUID() function.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT * FROM view_retval_1; RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_retval_1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking view view_retval_1 returning value from unsafe UUID() function.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT * FROM view_retval_1; END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_retval_1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking view view_retval_1 returning value from unsafe UUID() function.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT * FROM view_retval_1; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_retval_1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking view view_retval_2 returning value from view view_retval_1 returning value from unsafe UUID() function.
+CREATE VIEW view_retval_2 AS SELECT * FROM view_retval_1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_retval_2` AS SELECT * FROM view_retval_1
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT * FROM view_retval_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT * FROM view_retval_2
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT * FROM view_retval_2;
+DROP VIEW view_retval_2;
+
+Invoking prepared statement prep_2 invoking view view_retval_1 returning value from unsafe UUID() function.
+PREPARE prep_2 FROM "INSERT INTO t1 SELECT * FROM view_retval_1";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_retval_1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP VIEW view_retval_1;
+
+Invoking prepared statement prep_1 invoking unsafe UUID() function.
+PREPARE prep_1 FROM "INSERT INTO t0 VALUES (UUID())";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_1;
+
+Invoking unsafe UUID() function.
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t0 VALUES (UUID());
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (UUID())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT UUID();
+
+==== Testing @@hostname unsafeness ====
+
+Invoking function func_retval_1 returning value from unsafe @@hostname variable.
+CREATE FUNCTION func_retval_1() RETURNS VARCHAR(100) BEGIN INSERT INTO ta1 VALUES (47); RETURN @@hostname; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t1 VALUES (func_retval_1());
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (func_retval_1())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT func_retval_1();
+
+Invoking function func_retval_2 returning value from function func_retval_1 returning value from unsafe @@hostname variable.
+CREATE FUNCTION func_retval_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); RETURN func_retval_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 VALUES (func_retval_2());
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 VALUES (func_retval_2())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT func_retval_2();
+DROP FUNCTION func_retval_2;
+
+Invoking function func_sidef_2 invoking function func_retval_1 returning value from unsafe @@hostname variable.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 VALUES (func_retval_1()); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (func_retval_1())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking function func_retval_1 returning value from unsafe @@hostname variable.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 VALUES (func_retval_1()); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (func_retval_1())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking function func_retval_1 returning value from unsafe @@hostname variable.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 VALUES (func_retval_1()); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (func_retval_1())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking view view_retval_2 returning value from function func_retval_1 returning value from unsafe @@hostname variable.
+CREATE VIEW view_retval_2 AS SELECT func_retval_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_retval_2` AS SELECT func_retval_1()
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT * FROM view_retval_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT * FROM view_retval_2
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT * FROM view_retval_2;
+DROP VIEW view_retval_2;
+
+Invoking prepared statement prep_2 invoking function func_retval_1 returning value from unsafe @@hostname variable.
+PREPARE prep_2 FROM "INSERT INTO t1 VALUES (func_retval_1())";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (func_retval_1())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP FUNCTION func_retval_1;
+
+Invoking function func_sidef_1 invoking unsafe @@hostname variable.
+CREATE FUNCTION func_sidef_1() RETURNS VARCHAR(100) BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO t0 VALUES (@@hostname); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t1 SELECT func_sidef_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking function func_sidef_1 invoking unsafe @@hostname variable.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking function func_sidef_1 invoking unsafe @@hostname variable.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking function func_sidef_1 invoking unsafe @@hostname variable.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking view view_sidef_2 invoking function func_sidef_1 invoking unsafe @@hostname variable.
+CREATE VIEW view_sidef_2 AS SELECT func_sidef_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_sidef_2` AS SELECT func_sidef_1()
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT * FROM view_sidef_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT * FROM view_sidef_2
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP VIEW view_sidef_2;
+
+Invoking prepared statement prep_2 invoking function func_sidef_1 invoking unsafe @@hostname variable.
+PREPARE prep_2 FROM "INSERT INTO t1 SELECT func_sidef_1()";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP FUNCTION func_sidef_1;
+
+Invoking procedure proc_1 invoking unsafe @@hostname variable.
+CREATE PROCEDURE proc_1() BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO t0 VALUES (@@hostname); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking procedure proc_1 invoking unsafe @@hostname variable.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking procedure proc_1 invoking unsafe @@hostname variable.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking procedure proc_1 invoking unsafe @@hostname variable.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking prepared statement prep_2 invoking procedure proc_1 invoking unsafe @@hostname variable.
+PREPARE prep_2 FROM "CALL proc_1()";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP PROCEDURE proc_1;
+
+Invoking trigger trig_1 invoking unsafe @@hostname variable.
+CREATE TRIGGER trig_1 BEFORE INSERT ON trigger_table_1 FOR EACH ROW BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO t0 VALUES (@@hostname); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_1 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking trigger trig_1 invoking unsafe @@hostname variable.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking trigger trig_1 invoking unsafe @@hostname variable.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.trigger_table_1)
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking trigger trig_1 invoking unsafe @@hostname variable.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking prepared statement prep_2 invoking trigger trig_1 invoking unsafe @@hostname variable.
+PREPARE prep_2 FROM "INSERT INTO trigger_table_1 VALUES (1)";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP TRIGGER trig_1;
+
+Invoking prepared statement prep_1 invoking unsafe @@hostname variable.
+PREPARE prep_1 FROM "INSERT INTO t0 VALUES (@@hostname)";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_1;
+
+Invoking unsafe @@hostname variable.
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t0 VALUES (@@hostname);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (@@hostname)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+==== Testing SELECT...LIMIT unsafeness ====
+
+Invoking function func_sidef_1 invoking unsafe SELECT...LIMIT statement.
+CREATE FUNCTION func_sidef_1() RETURNS VARCHAR(100) BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO t0 SELECT * FROM data_table LIMIT 1; RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t1 SELECT func_sidef_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking function func_sidef_1 invoking unsafe SELECT...LIMIT statement.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking function func_sidef_1 invoking unsafe SELECT...LIMIT statement.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking function func_sidef_1 invoking unsafe SELECT...LIMIT statement.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking view view_sidef_2 invoking function func_sidef_1 invoking unsafe SELECT...LIMIT statement.
+CREATE VIEW view_sidef_2 AS SELECT func_sidef_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_sidef_2` AS SELECT func_sidef_1()
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT * FROM view_sidef_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT * FROM view_sidef_2
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP VIEW view_sidef_2;
+
+Invoking prepared statement prep_2 invoking function func_sidef_1 invoking unsafe SELECT...LIMIT statement.
+PREPARE prep_2 FROM "INSERT INTO t1 SELECT func_sidef_1()";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP FUNCTION func_sidef_1;
+
+Invoking procedure proc_1 invoking unsafe SELECT...LIMIT statement.
+CREATE PROCEDURE proc_1() BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO t0 SELECT * FROM data_table LIMIT 1; END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking procedure proc_1 invoking unsafe SELECT...LIMIT statement.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking procedure proc_1 invoking unsafe SELECT...LIMIT statement.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking procedure proc_1 invoking unsafe SELECT...LIMIT statement.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking prepared statement prep_2 invoking procedure proc_1 invoking unsafe SELECT...LIMIT statement.
+PREPARE prep_2 FROM "CALL proc_1()";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP PROCEDURE proc_1;
+
+Invoking trigger trig_1 invoking unsafe SELECT...LIMIT statement.
+CREATE TRIGGER trig_1 BEFORE INSERT ON trigger_table_1 FOR EACH ROW BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO t0 SELECT * FROM data_table LIMIT 1; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_1 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking trigger trig_1 invoking unsafe SELECT...LIMIT statement.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking trigger trig_1 invoking unsafe SELECT...LIMIT statement.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.trigger_table_1)
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking trigger trig_1 invoking unsafe SELECT...LIMIT statement.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking prepared statement prep_2 invoking trigger trig_1 invoking unsafe SELECT...LIMIT statement.
+PREPARE prep_2 FROM "INSERT INTO trigger_table_1 VALUES (1)";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP TRIGGER trig_1;
+
+Invoking view view_retval_1 returning value from unsafe SELECT...LIMIT statement.
+CREATE VIEW view_retval_1 AS SELECT * FROM data_table LIMIT 1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_retval_1` AS SELECT * FROM data_table LIMIT 1
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t1 SELECT * FROM view_retval_1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_retval_1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT * FROM view_retval_1;
+
+Invoking function func_sidef_2 invoking view view_retval_1 returning value from unsafe SELECT...LIMIT statement.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT * FROM view_retval_1; RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_retval_1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking view view_retval_1 returning value from unsafe SELECT...LIMIT statement.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT * FROM view_retval_1; END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_retval_1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking view view_retval_1 returning value from unsafe SELECT...LIMIT statement.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT * FROM view_retval_1; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_retval_1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking view view_retval_2 returning value from view view_retval_1 returning value from unsafe SELECT...LIMIT statement.
+CREATE VIEW view_retval_2 AS SELECT * FROM view_retval_1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_retval_2` AS SELECT * FROM view_retval_1
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT * FROM view_retval_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT * FROM view_retval_2
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT * FROM view_retval_2;
+DROP VIEW view_retval_2;
+
+Invoking prepared statement prep_2 invoking view view_retval_1 returning value from unsafe SELECT...LIMIT statement.
+PREPARE prep_2 FROM "INSERT INTO t1 SELECT * FROM view_retval_1";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_retval_1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP VIEW view_retval_1;
+
+Invoking prepared statement prep_1 invoking unsafe SELECT...LIMIT statement.
+PREPARE prep_1 FROM "INSERT INTO t0 SELECT * FROM data_table LIMIT 1";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_1;
+
+Invoking unsafe SELECT...LIMIT statement.
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t0 SELECT * FROM data_table LIMIT 1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT * FROM data_table LIMIT 1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT * FROM data_table LIMIT 1;
+
+==== Testing INSERT DELAYED unsafeness ====
+
+Invoking function func_sidef_1 invoking unsafe INSERT DELAYED statement.
+CREATE FUNCTION func_sidef_1() RETURNS VARCHAR(100) BEGIN INSERT INTO ta1 VALUES (47); INSERT DELAYED INTO t0 VALUES (1), (2); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t1 SELECT func_sidef_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking function func_sidef_1 invoking unsafe INSERT DELAYED statement.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking function func_sidef_1 invoking unsafe INSERT DELAYED statement.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking function func_sidef_1 invoking unsafe INSERT DELAYED statement.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking view view_sidef_2 invoking function func_sidef_1 invoking unsafe INSERT DELAYED statement.
+CREATE VIEW view_sidef_2 AS SELECT func_sidef_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_sidef_2` AS SELECT func_sidef_1()
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT * FROM view_sidef_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT * FROM view_sidef_2
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP VIEW view_sidef_2;
+
+Invoking prepared statement prep_2 invoking function func_sidef_1 invoking unsafe INSERT DELAYED statement.
+PREPARE prep_2 FROM "INSERT INTO t1 SELECT func_sidef_1()";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP FUNCTION func_sidef_1;
+
+Invoking procedure proc_1 invoking unsafe INSERT DELAYED statement.
+CREATE PROCEDURE proc_1() BEGIN INSERT INTO ta1 VALUES (47); INSERT DELAYED INTO t0 VALUES (1), (2); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking procedure proc_1 invoking unsafe INSERT DELAYED statement.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking procedure proc_1 invoking unsafe INSERT DELAYED statement.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking procedure proc_1 invoking unsafe INSERT DELAYED statement.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking prepared statement prep_2 invoking procedure proc_1 invoking unsafe INSERT DELAYED statement.
+PREPARE prep_2 FROM "CALL proc_1()";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP PROCEDURE proc_1;
+
+Invoking trigger trig_1 invoking unsafe INSERT DELAYED statement.
+CREATE TRIGGER trig_1 BEFORE INSERT ON trigger_table_1 FOR EACH ROW BEGIN INSERT INTO ta1 VALUES (47); INSERT DELAYED INTO t0 VALUES (1), (2); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_1 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking trigger trig_1 invoking unsafe INSERT DELAYED statement.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking trigger trig_1 invoking unsafe INSERT DELAYED statement.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.trigger_table_1)
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking trigger trig_1 invoking unsafe INSERT DELAYED statement.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking prepared statement prep_2 invoking trigger trig_1 invoking unsafe INSERT DELAYED statement.
+PREPARE prep_2 FROM "INSERT INTO trigger_table_1 VALUES (1)";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP TRIGGER trig_1;
+
+Invoking prepared statement prep_1 invoking unsafe INSERT DELAYED statement.
+PREPARE prep_1 FROM "INSERT DELAYED INTO t0 VALUES (1), (2)";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_1;
+
+Invoking unsafe INSERT DELAYED statement.
+* binlog_format = STATEMENT: expect warning.
+INSERT DELAYED INTO t0 VALUES (1), (2);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT DELAYED INTO t0 VALUES (1), (2)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+==== Testing unsafeness of insert of two autoinc values ====
+
+Invoking function func_sidef_1 invoking unsafe update of two autoinc columns.
+CREATE FUNCTION func_sidef_1() RETURNS VARCHAR(100) BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO double_autoinc_table VALUES (NULL); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t1 SELECT func_sidef_1();
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking function func_sidef_1 invoking unsafe update of two autoinc columns.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking function func_sidef_1 invoking unsafe update of two autoinc columns.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Table_map # # table_id: # (test.double_autoinc_table)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Table_map # # table_id: # (test.autoinc_table)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking function func_sidef_1 invoking unsafe update of two autoinc columns.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking view view_sidef_2 invoking function func_sidef_1 invoking unsafe update of two autoinc columns.
+CREATE VIEW view_sidef_2 AS SELECT func_sidef_1();
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT * FROM view_sidef_2;
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP VIEW view_sidef_2;
+
+Invoking prepared statement prep_2 invoking function func_sidef_1 invoking unsafe update of two autoinc columns.
+PREPARE prep_2 FROM "INSERT INTO t1 SELECT func_sidef_1()";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP FUNCTION func_sidef_1;
+
+Invoking procedure proc_1 invoking unsafe update of two autoinc columns.
+CREATE PROCEDURE proc_1() BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO double_autoinc_table VALUES (NULL); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_1();
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta1 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.double_autoinc_table)
+master-bin.000001 # Table_map # # table_id: # (test.autoinc_table)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+
+Invoking function func_sidef_2 invoking procedure proc_1 invoking unsafe update of two autoinc columns.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking procedure proc_1 invoking unsafe update of two autoinc columns.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # use `test`; INSERT INTO ta1 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.double_autoinc_table)
+master-bin.000001 # Table_map # # table_id: # (test.autoinc_table)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking procedure proc_1 invoking unsafe update of two autoinc columns.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking prepared statement prep_2 invoking procedure proc_1 invoking unsafe update of two autoinc columns.
+PREPARE prep_2 FROM "CALL proc_1()";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta1 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.double_autoinc_table)
+master-bin.000001 # Table_map # # table_id: # (test.autoinc_table)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PREPARE prep_2;
+DROP PROCEDURE proc_1;
+
+Invoking trigger trig_1 invoking unsafe update of two autoinc columns.
+CREATE TRIGGER trig_1 BEFORE INSERT ON trigger_table_1 FOR EACH ROW BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO double_autoinc_table VALUES (NULL); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_1 VALUES (1);
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking trigger trig_1 invoking unsafe update of two autoinc columns.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking trigger trig_1 invoking unsafe update of two autoinc columns.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.trigger_table_1)
+master-bin.000001 # Table_map # # table_id: # (test.double_autoinc_table)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Table_map # # table_id: # (test.autoinc_table)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking trigger trig_1 invoking unsafe update of two autoinc columns.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking prepared statement prep_2 invoking trigger trig_1 invoking unsafe update of two autoinc columns.
+PREPARE prep_2 FROM "INSERT INTO trigger_table_1 VALUES (1)";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP TRIGGER trig_1;
+
+Invoking prepared statement prep_1 invoking unsafe update of two autoinc columns.
+PREPARE prep_1 FROM "INSERT INTO double_autoinc_table VALUES (NULL)";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_1;
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_1;
+
+Invoking unsafe update of two autoinc columns.
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO double_autoinc_table VALUES (NULL);
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+==== Testing unsafeness of UDF's ====
+
+Invoking function func_retval_1 returning value from unsafe UDF.
+CREATE FUNCTION func_retval_1() RETURNS VARCHAR(100) BEGIN INSERT INTO ta1 VALUES (47); RETURN myfunc_int(10); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t1 VALUES (func_retval_1());
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (func_retval_1())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT func_retval_1();
+
+Invoking function func_retval_2 returning value from function func_retval_1 returning value from unsafe UDF.
+CREATE FUNCTION func_retval_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); RETURN func_retval_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 VALUES (func_retval_2());
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 VALUES (func_retval_2())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT func_retval_2();
+DROP FUNCTION func_retval_2;
+
+Invoking function func_sidef_2 invoking function func_retval_1 returning value from unsafe UDF.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 VALUES (func_retval_1()); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (func_retval_1())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking function func_retval_1 returning value from unsafe UDF.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 VALUES (func_retval_1()); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (func_retval_1())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking function func_retval_1 returning value from unsafe UDF.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 VALUES (func_retval_1()); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (func_retval_1())
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking view view_retval_2 returning value from function func_retval_1 returning value from unsafe UDF.
+CREATE VIEW view_retval_2 AS SELECT func_retval_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_retval_2` AS SELECT func_retval_1()
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT * FROM view_retval_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT * FROM view_retval_2
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT * FROM view_retval_2;
+DROP VIEW view_retval_2;
+
+Invoking prepared statement prep_2 invoking function func_retval_1 returning value from unsafe UDF.
+PREPARE prep_2 FROM "INSERT INTO t1 VALUES (func_retval_1())";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (func_retval_1())
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP FUNCTION func_retval_1;
+
+Invoking function func_sidef_1 invoking unsafe UDF.
+CREATE FUNCTION func_sidef_1() RETURNS VARCHAR(100) BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO t0 VALUES (myfunc_int(10)); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t1 SELECT func_sidef_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking function func_sidef_1 invoking unsafe UDF.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking function func_sidef_1 invoking unsafe UDF.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking function func_sidef_1 invoking unsafe UDF.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking view view_sidef_2 invoking function func_sidef_1 invoking unsafe UDF.
+CREATE VIEW view_sidef_2 AS SELECT func_sidef_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_sidef_2` AS SELECT func_sidef_1()
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT * FROM view_sidef_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT * FROM view_sidef_2
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP VIEW view_sidef_2;
+
+Invoking prepared statement prep_2 invoking function func_sidef_1 invoking unsafe UDF.
+PREPARE prep_2 FROM "INSERT INTO t1 SELECT func_sidef_1()";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP FUNCTION func_sidef_1;
+
+Invoking procedure proc_1 invoking unsafe UDF.
+CREATE PROCEDURE proc_1() BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO t0 VALUES (myfunc_int(10)); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking procedure proc_1 invoking unsafe UDF.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking procedure proc_1 invoking unsafe UDF.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking procedure proc_1 invoking unsafe UDF.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking prepared statement prep_2 invoking procedure proc_1 invoking unsafe UDF.
+PREPARE prep_2 FROM "CALL proc_1()";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP PROCEDURE proc_1;
+
+Invoking trigger trig_1 invoking unsafe UDF.
+CREATE TRIGGER trig_1 BEFORE INSERT ON trigger_table_1 FOR EACH ROW BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO t0 VALUES (myfunc_int(10)); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_1 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking trigger trig_1 invoking unsafe UDF.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking trigger trig_1 invoking unsafe UDF.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.trigger_table_1)
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking trigger trig_1 invoking unsafe UDF.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking prepared statement prep_2 invoking trigger trig_1 invoking unsafe UDF.
+PREPARE prep_2 FROM "INSERT INTO trigger_table_1 VALUES (1)";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP TRIGGER trig_1;
+
+Invoking view view_sidef_1 invoking unsafe UDF.
+CREATE VIEW view_sidef_1 AS SELECT myfunc_int(10);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_sidef_1` AS SELECT myfunc_int(10)
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t1 SELECT * FROM view_sidef_1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_sidef_1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking view view_sidef_1 invoking unsafe UDF.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT * FROM view_sidef_1; RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_sidef_1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking view view_sidef_1 invoking unsafe UDF.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT * FROM view_sidef_1; END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_sidef_1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking view view_sidef_1 invoking unsafe UDF.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT * FROM view_sidef_1; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_sidef_1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking view view_sidef_2 invoking view view_sidef_1 invoking unsafe UDF.
+CREATE VIEW view_sidef_2 AS SELECT * FROM view_sidef_1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_sidef_2` AS SELECT * FROM view_sidef_1
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT * FROM view_sidef_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT * FROM view_sidef_2
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP VIEW view_sidef_2;
+
+Invoking prepared statement prep_2 invoking view view_sidef_1 invoking unsafe UDF.
+PREPARE prep_2 FROM "INSERT INTO t1 SELECT * FROM view_sidef_1";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_sidef_1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP VIEW view_sidef_1;
+
+Invoking prepared statement prep_1 invoking unsafe UDF.
+PREPARE prep_1 FROM "INSERT INTO t0 VALUES (myfunc_int(10))";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_1;
+
+Invoking unsafe UDF.
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t0 VALUES (myfunc_int(10));
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 VALUES (myfunc_int(10))
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+==== Testing unsafeness of access to mysql.general_log ====
+
+Invoking function func_sidef_1 invoking unsafe use of mysql.general_log.
+CREATE FUNCTION func_sidef_1() RETURNS VARCHAR(100) BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log; RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t1 SELECT func_sidef_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking function func_sidef_1 invoking unsafe use of mysql.general_log.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking function func_sidef_1 invoking unsafe use of mysql.general_log.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking function func_sidef_1 invoking unsafe use of mysql.general_log.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT func_sidef_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking view view_sidef_2 invoking function func_sidef_1 invoking unsafe use of mysql.general_log.
+CREATE VIEW view_sidef_2 AS SELECT func_sidef_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_sidef_2` AS SELECT func_sidef_1()
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT * FROM view_sidef_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT * FROM view_sidef_2
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP VIEW view_sidef_2;
+
+Invoking prepared statement prep_2 invoking function func_sidef_1 invoking unsafe use of mysql.general_log.
+PREPARE prep_2 FROM "INSERT INTO t1 SELECT func_sidef_1()";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT func_sidef_1()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP FUNCTION func_sidef_1;
+
+Invoking procedure proc_1 invoking unsafe use of mysql.general_log.
+CREATE PROCEDURE proc_1() BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log; END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_1();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta1 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+
+Invoking function func_sidef_2 invoking procedure proc_1 invoking unsafe use of mysql.general_log.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking procedure proc_1 invoking unsafe use of mysql.general_log.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # use `test`; INSERT INTO ta1 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking procedure proc_1 invoking unsafe use of mysql.general_log.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); CALL proc_1(); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking prepared statement prep_2 invoking procedure proc_1 invoking unsafe use of mysql.general_log.
+PREPARE prep_2 FROM "CALL proc_1()";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta1 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PREPARE prep_2;
+DROP PROCEDURE proc_1;
+
+Invoking trigger trig_1 invoking unsafe use of mysql.general_log.
+CREATE TRIGGER trig_1 BEFORE INSERT ON trigger_table_1 FOR EACH ROW BEGIN INSERT INTO ta1 VALUES (47); INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_1 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+
+Invoking function func_sidef_2 invoking trigger trig_1 invoking unsafe use of mysql.general_log.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking trigger trig_1 invoking unsafe use of mysql.general_log.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.trigger_table_1)
+master-bin.000001 # Table_map # # table_id: # (test.t0)
+master-bin.000001 # Table_map # # table_id: # (test.ta1)
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: #
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking trigger trig_1 invoking unsafe use of mysql.general_log.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO trigger_table_1 VALUES (1); END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking prepared statement prep_2 invoking trigger trig_1 invoking unsafe use of mysql.general_log.
+PREPARE prep_2 FROM "INSERT INTO trigger_table_1 VALUES (1)";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta1 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_1 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP TRIGGER trig_1;
+
+Invoking view view_retval_1 returning value from unsafe use of mysql.general_log.
+CREATE VIEW view_retval_1 AS SELECT COUNT(*) FROM mysql.general_log;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_retval_1` AS SELECT COUNT(*) FROM mysql.general_log
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t1 SELECT * FROM view_retval_1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_retval_1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT * FROM view_retval_1;
+
+Invoking function func_sidef_2 invoking view view_retval_1 returning value from unsafe use of mysql.general_log.
+CREATE FUNCTION func_sidef_2() RETURNS VARCHAR(100) BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT * FROM view_retval_1; RETURN 0; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT func_sidef_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_retval_1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT func_sidef_2()
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP FUNCTION func_sidef_2;
+
+Invoking procedure proc_2 invoking view view_retval_1 returning value from unsafe use of mysql.general_log.
+CREATE PROCEDURE proc_2() BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT * FROM view_retval_1; END;
+* binlog_format = STATEMENT: expect warning.
+CALL proc_2();
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_retval_1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+Failure! Event number 3 was a 'Query', not a 'Table_map'.
+SHOW BINLOG EVENTS FROM <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; INSERT INTO ta2 VALUES (47)
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+DROP PROCEDURE proc_2;
+
+Invoking trigger trig_2 invoking view view_retval_1 returning value from unsafe use of mysql.general_log.
+CREATE TRIGGER trig_2 BEFORE INSERT ON trigger_table_2 FOR EACH ROW BEGIN INSERT INTO ta2 VALUES (47); INSERT INTO t1 SELECT * FROM view_retval_1; END;
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO trigger_table_2 VALUES (1);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO ta2 VALUES (47)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_retval_1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO trigger_table_2 VALUES (1)
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP TRIGGER trig_2;
+
+Invoking view view_retval_2 returning value from view view_retval_1 returning value from unsafe use of mysql.general_log.
+CREATE VIEW view_retval_2 AS SELECT * FROM view_retval_1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_retval_2` AS SELECT * FROM view_retval_1
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t2 SELECT * FROM view_retval_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t2 SELECT * FROM view_retval_2
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT * FROM view_retval_2;
+DROP VIEW view_retval_2;
+
+Invoking prepared statement prep_2 invoking view view_retval_1 returning value from unsafe use of mysql.general_log.
+PREPARE prep_2 FROM "INSERT INTO t1 SELECT * FROM view_retval_1";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_2;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM view_retval_1
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_2;
+DROP VIEW view_retval_1;
+
+Invoking prepared statement prep_1 invoking unsafe use of mysql.general_log.
+PREPARE prep_1 FROM "INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log";
+* binlog_format = STATEMENT: expect warning.
+EXECUTE prep_1;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+DROP PREPARE prep_1;
+
+Invoking unsafe use of mysql.general_log.
+* binlog_format = STATEMENT: expect warning.
+INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log;
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log
+* SQL_LOG_BIN = 0: expect nothing logged and no warning.
+* binlog_format = MIXED: expect row events in binlog and no warning.
+* Invoke statement so that return value is dicarded: expect no warning.
+SELECT COUNT(*) FROM mysql.general_log;
+DROP TRIGGER double_autoinc_trig;
+DROP TABLE t0, t1, t2, t3, ta1, ta2, ta3,
+autoinc_table, double_autoinc_table,
+data_table,
+trigger_table_1, trigger_table_2, trigger_table_3;
+DROP FUNCTION myfunc_int;
+==== Special system variables that should *not* be unsafe ====
+CREATE TABLE t1 (a VARCHAR(1000));
+CREATE TABLE autoinc_table (a INT PRIMARY KEY AUTO_INCREMENT);
+INSERT INTO t1 VALUES (@@session.auto_increment_increment);
+INSERT INTO t1 VALUES (@@session.auto_increment_offset);
+INSERT INTO t1 VALUES (@@session.character_set_client);
+INSERT INTO t1 VALUES (@@session.character_set_connection);
+INSERT INTO t1 VALUES (@@session.character_set_database);
+INSERT INTO t1 VALUES (@@session.character_set_server);
+INSERT INTO t1 VALUES (@@session.collation_connection);
+INSERT INTO t1 VALUES (@@session.collation_database);
+INSERT INTO t1 VALUES (@@session.collation_server);
INSERT INTO t1 VALUES (@@session.foreign_key_checks);
+INSERT INTO t1 VALUES (@@session.identity);
+INSERT INTO t1 VALUES (@@session.last_insert_id);
+INSERT INTO t1 VALUES (@@session.lc_time_names);
+INSERT INTO t1 VALUES (@@session.pseudo_thread_id);
INSERT INTO t1 VALUES (@@session.sql_auto_is_null);
+INSERT INTO t1 VALUES (@@session.timestamp);
+INSERT INTO t1 VALUES (@@session.time_zone);
INSERT INTO t1 VALUES (@@session.unique_checks);
-INSERT INTO t1 VALUES (@@session.auto_increment_increment);
-INSERT INTO t1 VALUES (@@session.auto_increment_offset);
-INSERT INTO t2 VALUES (@@session.character_set_client);
-INSERT INTO t2 VALUES (@@session.collation_connection);
-INSERT INTO t2 VALUES (@@session.collation_server);
-INSERT INTO t2 VALUES (@@session.time_zone);
-INSERT INTO t2 VALUES (@@session.lc_time_names);
-INSERT INTO t2 VALUES (@@session.collation_database);
-INSERT INTO t2 VALUES (@@session.timestamp);
-INSERT INTO t2 VALUES (@@session.last_insert_id);
SET @my_var= 4711;
INSERT INTO t1 VALUES (@my_var);
-SET insert_id=12;
-INSERT INTO t3 VALUES (NULL);
-==== Clean up ====
-DROP PROCEDURE proc;
-DROP FUNCTION func;
-DROP TRIGGER trig;
-DROP PROCEDURE proc1;
-DROP FUNCTION func2;
-DROP TRIGGER trig3;
-DROP PROCEDURE proc4;
-DROP FUNCTION func5;
-DROP PREPARE prep6;
-DROP TABLE t1, t2, t3, trigger_table, trigger_table2;
+SET insert_id= 12;
+INSERT INTO autoinc_table VALUES (NULL);
+The following variables *should* give a warning, despite they are replicated.
+INSERT INTO t1 VALUES (@@session.sql_mode);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (@@session.sql_mode)
+INSERT INTO t1 VALUES (@@session.insert_id);
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (@@session.insert_id)
+DROP TABLE t1, autoinc_table;
CREATE TABLE t1(a INT, b INT, KEY(a), PRIMARY KEY(b));
INSERT INTO t1 SELECT * FROM t1 LIMIT 1;
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM t1 LIMIT 1
REPLACE INTO t1 SELECT * FROM t1 LIMIT 1;
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: REPLACE INTO t1 SELECT * FROM t1 LIMIT 1
UPDATE t1 SET a=1 LIMIT 1;
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: UPDATE t1 SET a=1 LIMIT 1
DELETE FROM t1 LIMIT 1;
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: DELETE FROM t1 LIMIT 1
CREATE PROCEDURE p1()
BEGIN
INSERT INTO t1 SELECT * FROM t1 LIMIT 1;
@@ -214,10 +2455,10 @@ DELETE FROM t1 LIMIT 1;
END|
CALL p1();
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
-Note 1592 Statement may not be safe to log in statement format.
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM t1 LIMIT 1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: REPLACE INTO t1 SELECT * FROM t1 LIMIT 1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: UPDATE t1 SET a=1 LIMIT 1
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: DELETE FROM t1 LIMIT 1
DROP PROCEDURE p1;
DROP TABLE t1;
DROP TABLE IF EXISTS t1;
@@ -225,7 +2466,7 @@ CREATE TABLE t1 (a VARCHAR(100), b VARCHAR(100));
INSERT INTO t1 VALUES ('a','b');
UPDATE t1 SET b = '%s%s%s%s%s%s%s%s%s%s%s%s%s%s' WHERE a = 'a' LIMIT 1;
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: UPDATE t1 SET b = '%s%s%s%s%s%s%s%s%s%s%s%s%s%s' WHERE a = 'a' LIMIT 1
DROP TABLE t1;
DROP TABLE IF EXISTS t1, t2;
CREATE TABLE t1(i INT PRIMARY KEY);
@@ -234,7 +2475,7 @@ CREATE TABLE t3(i INT, ch CHAR(50));
"Should issue message Statement may not be safe to log in statement format."
INSERT INTO t1 SELECT * FROM t2 LIMIT 1;
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM t2 LIMIT 1
CREATE FUNCTION func6()
RETURNS INT
BEGIN
@@ -246,7 +2487,10 @@ END|
"Should issue message Statement may not be safe to log in statement format only once"
INSERT INTO t3 VALUES(func6(), UUID());
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (10)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (11)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES (12)
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t3 VALUES(func6(), UUID())
"Check whether SET @@SQL_LOG_BIN = 0/1 doesn't work in substatements"
CREATE FUNCTION fun_check_log_bin() RETURNS INT
BEGIN
@@ -259,7 +2503,7 @@ SELECT fun_check_log_bin();
fun_check_log_bin()
100
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES(@@global.sync_binlog)
"SQL_LOG_BIN should be ON still"
SHOW VARIABLES LIKE "SQL_LOG_BIN";
Variable_name Value
@@ -315,16 +2559,50 @@ CREATE TABLE t1(i INT PRIMARY KEY);
CREATE TABLE t2(i INT PRIMARY KEY);
INSERT INTO t1 SELECT * FROM t2 LIMIT 1;
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 SELECT * FROM t2 LIMIT 1
INSERT INTO t1 VALUES(@@global.sync_binlog);
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t1 VALUES(@@global.sync_binlog)
UPDATE t1 SET i = 999 LIMIT 1;
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: UPDATE t1 SET i = 999 LIMIT 1
DELETE FROM t1 LIMIT 1;
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: DELETE FROM t1 LIMIT 1
DROP TABLE t1, t2;
SET @@SESSION.SQL_MODE = @save_sql_mode;
+SET @old_binlog_format = @@session.binlog_format;
+SET binlog_format = MIXED;
+CREATE TABLE t1 (a INT);
+CREATE TABLE t2 (a INT);
+INSERT INTO t2 VALUES (1), (2);
+CREATE PROCEDURE proc_insert_delayed ()
+BEGIN
+INSERT DELAYED INTO t1 VALUES (1), (2);
+END|
+CREATE FUNCTION func_limit ()
+RETURNS INT
+BEGIN
+INSERT INTO t1 SELECT * FROM t2 LIMIT 1;
+RETURN 1;
+END|
+RESET MASTER;
+CALL proc_insert_delayed();
+SELECT func_limit();
+func_limit()
+1
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+master-bin.000001 # Query # # BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # COMMIT
+SET @@session.binlog_format = @old_binlog_format;
+DROP TABLE t1, t2;
+DROP PROCEDURE proc_insert_delayed;
+DROP FUNCTION func_limit;
"End of tests"
diff --git a/mysql-test/suite/binlog/t/binlog_innodb.test b/mysql-test/suite/binlog/t/binlog_innodb.test
index f84fd65226a..7b167a2971f 100644
--- a/mysql-test/suite/binlog/t/binlog_innodb.test
+++ b/mysql-test/suite/binlog/t/binlog_innodb.test
@@ -27,13 +27,13 @@ SET BINLOG_FORMAT=STATEMENT;
BEGIN;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-error ER_BINLOG_LOGGING_IMPOSSIBLE;
+error ER_BINLOG_STMT_MODE_AND_ROW_ENGINE;
UPDATE t1 SET b = 1*a WHERE a > 1;
COMMIT;
BEGIN;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-error ER_BINLOG_LOGGING_IMPOSSIBLE;
+error ER_BINLOG_STMT_MODE_AND_ROW_ENGINE;
UPDATE t1 SET b = 2*a WHERE a > 2;
COMMIT;
diff --git a/mysql-test/suite/binlog/t/binlog_multi_engine.test b/mysql-test/suite/binlog/t/binlog_multi_engine.test
index c8136d669e4..2e80ba427e7 100644
--- a/mysql-test/suite/binlog/t/binlog_multi_engine.test
+++ b/mysql-test/suite/binlog/t/binlog_multi_engine.test
@@ -60,7 +60,7 @@ let $wait_binlog_event= COMMIT;
source include/wait_for_binlog_event.inc;
UPDATE t1m, t1b SET m = 2, b = 3 WHERE n = c;
-error ER_BINLOG_LOGGING_IMPOSSIBLE;
+error ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE;
UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
# Not possible to test this since NDB writes its own binlog, which
@@ -84,7 +84,7 @@ INSERT INTO t1m VALUES (1,1), (1,2), (2,1), (2,2);
INSERT INTO t1b VALUES (1,1), (1,2), (2,1), (2,2);
INSERT INTO t1n VALUES (1,1), (1,2), (2,1), (2,2);
-error ER_BINLOG_LOGGING_IMPOSSIBLE;
+error ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE;
UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
# Not possible to test this since NDB writes its own binlog, which
@@ -93,7 +93,7 @@ UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
#UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
-error ER_BINLOG_LOGGING_IMPOSSIBLE;
+error ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE;
UPDATE t1n, t1b SET e = 2, b = 3 WHERE f = c;
source include/show_binlog_events.inc;
diff --git a/mysql-test/suite/binlog/t/binlog_unsafe-master.opt b/mysql-test/suite/binlog/t/binlog_unsafe-master.opt
new file mode 100644
index 00000000000..7d8786c156a
--- /dev/null
+++ b/mysql-test/suite/binlog/t/binlog_unsafe-master.opt
@@ -0,0 +1 @@
+$UDF_EXAMPLE_LIB_OPT
diff --git a/mysql-test/suite/binlog/t/binlog_unsafe.test b/mysql-test/suite/binlog/t/binlog_unsafe.test
index c4e1f31cbce..2bf2f477166 100644
--- a/mysql-test/suite/binlog/t/binlog_unsafe.test
+++ b/mysql-test/suite/binlog/t/binlog_unsafe.test
@@ -1,34 +1,61 @@
+# ==== Background ====
+#
+# Some statements may execute differently on master and slave when
+# logged in statement format. Such statements are called unsafe.
+# Unsafe statements include:
+#
+# - statements using @@variables (with a small number of exceptions;
+# see below);
+# - statements using certain functions, e.g., UUID();
+# - statements using LIMIT;
+# - INSERT DELAYED;
+# - insert into two autoinc columns;
+# - statements using UDF's.
+# - statements reading from log tables in the mysql database.
+#
+# Note that statements that use stored functions, stored procedures,
+# triggers, views, or prepared statements that invoke unsafe
+# statements shall also be unsafe.
+#
+# Unsafeness of a statement shall have the following consequences:
+#
+# 1. If the binlogging is on and the unsafe statement is logged:
+# - If binlog_format=STATEMENT, the statement shall give a warning.
+# - If binlog_format=MIXED or binlog_format=ROW, the statement shall
+# be logged in row format.
+#
+# 2. If binlogging is off or the statement is not logged (e.g. SELECT
+# UUID()), no warning shall be issued and the statement shall not
+# be logged.
+#
+# Moreover, when a sub-statement of a recursive construct (i.e.,
+# stored function, stored procedure, trigger, view, or prepared
+# statement) is unsafe and binlog_format=STATEMENT, then a warning
+# shall be issued for every recursive construct. In effect, this
+# creates a stack trace from the top-level statement to the unsafe
+# statement.
+#
+#
# ==== Purpose ====
#
-# Some statements can not be written to the binlog in a safe manner
-# with statement-based replication, either because they rely on
-# features that are local to the server they are replicated from
-# (e.g., @@variables), or because they include nondeterministic
-# queries (e.g., LIMIT), or because the time at which the query is
-# executed cannot be determined (e.g., INSERT DELAYED). Such
-# statements should be marked unsafe. All unsafe statements should
-# give a warning.
-# Yet the warning/error message isn't issued when SQL_LOG_BIN is turned off.
-#
-# This test verifies that a warning is generated for statements that
-# should be unsafe, when they are executed under statement mode
-# logging.
-#
-# All variables should be unsafe, with some exceptions. Therefore,
-# this test also verifies that the exceptions do *not* generare a
+# This test verifies that a warning is generated when it should,
+# according to the rules above.
+#
+# All @@variables should be unsafe, with some exceptions. Therefore,
+# this test also verifies that the exceptions do *not* generate a
# warning.
#
#
# ==== Method ====
#
-# We try an INSERT DELAYED statement and verify that a warning is
-# issued.
+# 1. Each type of statements listed above is executed.
+#
+# 2. Each unsafe statement is wrapped in each type of recursive
+# construct (stored function, stored procedure, trigger, view, or
+# prepared statement).
#
-# We try to insert unsafe variables into a table in several ways:
-# directly with an INSERT statement, from a stored procedure, from a
-# stored function, from a trigger, from a prepared statement, and from
-# a complicated nesting of triggers, functions, procedures, and
-# prepared statements. In all cases, a warning should be issued.
+# 3. Each unsafe statement is wrapped in two levels of recursive
+# constructs (function invoking trigger invoking UUID(), etc).
#
# We try to insert the variables that should not be unsafe into a
# table, and verify that *no* warning is issued.
@@ -38,7 +65,8 @@
# Execute a unsafe statement calling a trigger or stored function
# or neither when @@SQL_LOG_BIN is turned OFF,
# no warning/error is issued
-
+#
+#
# ==== Related bugs and worklogs ====
#
# WL#3339: Issue warnings when statement-based replication may fail
@@ -47,6 +75,9 @@
# BUG#34768: nondeterministic INSERT using LIMIT logged in stmt mode if binlog_format=mixed
# BUG#41980, SBL, INSERT .. SELECT .. LIMIT = ERROR, even when @@SQL_LOG_BIN is 0
# BUG#42640: mysqld crashes when unsafe statements are executed (STRICT_TRANS_TABLES mode)
+# BUG#45825: INSERT DELAYED is not unsafe: logged in statement format
+# BUG#45785: LIMIT in SP does not cause RBL if binlog_format=MIXED
+#
#
# ==== Related test cases ====
#
@@ -57,192 +88,265 @@
# rpl.rpl_variables_stm tests the small subset of variables that
# actually can be replicated safely in statement mode.
#
-#
-# ==== Todo ====
-#
-# There are several other ways to create unsafe statements: see, e.g.,
-# WL#3339, BUG#34768.
+# rpl_ndb.rpl_ndb_binlog_format_errors tests all errors and warnings
+# related to logging format (not just 'Unsafe statement binlogged in
+# statement mode since BINLOG_FORMAT = STATEMENT').
source include/have_log_bin.inc;
source include/have_binlog_format_statement.inc;
---echo ==== Setup tables ====
+--echo #### Setup tables ####
-CREATE TABLE t1 (a INT);
+CREATE TABLE t0 (a CHAR(40));
+CREATE TABLE t1 (a CHAR(40));
CREATE TABLE t2 (a CHAR(40));
-CREATE TABLE t3 (a INT AUTO_INCREMENT PRIMARY KEY);
-CREATE TABLE trigger_table (a CHAR(7));
-CREATE TABLE trigger_table2 (a INT);
-
-
---echo ==== Non-deterministic statements ====
-
-INSERT DELAYED INTO t1 VALUES (5);
-
-
---echo ==== Some variables that *should* be unsafe ====
-
---echo ---- Insert directly ----
-
-INSERT INTO t1 VALUES (@@global.sync_binlog);
-INSERT INTO t1 VALUES (@@session.insert_id);
-INSERT INTO t1 VALUES (@@global.auto_increment_increment);
-INSERT INTO t2 SELECT UUID();
-INSERT INTO t2 VALUES (@@session.sql_mode);
-INSERT INTO t2 VALUES (@@global.init_slave);
-INSERT INTO t2 VALUES (@@hostname);
-
---echo ---- Insert from stored procedure ----
-
-DELIMITER |;
-CREATE PROCEDURE proc()
-BEGIN
- INSERT INTO t1 VALUES (@@global.sync_binlog);
- INSERT INTO t1 VALUES (@@session.insert_id);
- INSERT INTO t1 VALUES (@@global.auto_increment_increment);
- INSERT INTO t2 SELECT UUID();
- INSERT INTO t2 VALUES (@@session.sql_mode);
- INSERT INTO t2 VALUES (@@global.init_slave);
- INSERT INTO t2 VALUES (@@hostname);
+CREATE TABLE t3 (a CHAR(40));
+CREATE TABLE ta1 (a CHAR(40));
+CREATE TABLE ta2 (a CHAR(40));
+CREATE TABLE ta3 (a CHAR(40));
+CREATE TABLE autoinc_table (a INT PRIMARY KEY AUTO_INCREMENT);
+CREATE TABLE double_autoinc_table (a INT PRIMARY KEY AUTO_INCREMENT);
+--DELIMITER |
+CREATE TRIGGER double_autoinc_trig BEFORE INSERT ON double_autoinc_table FOR EACH ROW BEGIN
+ INSERT INTO autoinc_table VALUES (NULL);
END|
-DELIMITER ;|
-
-CALL proc();
+--DELIMITER ;
+CREATE TABLE data_table (a CHAR(40));
+INSERT INTO data_table VALUES ('foo');
+CREATE TABLE trigger_table_1 (a INT);
+CREATE TABLE trigger_table_2 (a INT);
+CREATE TABLE trigger_table_3 (a INT);
+--replace_result $UDF_EXAMPLE_LIB UDF_EXAMPLE_LIB
+eval CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "$UDF_EXAMPLE_LIB";
+
+# In each iteration of this loop, we select one method to make the
+# statement unsafe.
+let $unsafe_type= 0;
+while (`SELECT $unsafe_type < 7`) {
+
+ --echo
+
+ if (`SELECT $unsafe_type = 0`) {
+ --echo ==== Testing UUID() unsafeness ====
+ let $desc_0= unsafe UUID() function;
+ let $stmt_sidef_0= INSERT INTO t0 VALUES (UUID());
+ let $value_0= UUID();
+ let $sel_sidef_0=;
+ let $sel_retval_0= SELECT UUID();
+ }
+
+ if (`SELECT $unsafe_type = 1`) {
+ --echo ==== Testing @@hostname unsafeness ====
+ let $desc_0= unsafe @@hostname variable;
+ let $stmt_sidef_0= INSERT INTO t0 VALUES (@@hostname);
+ let $value_0= @@hostname;
+ let $sel_sidef_0=;
+ # $sel_retval is going to be used in views. Views cannot execute
+ # statements that refer to @@variables. Hence, we set $set_retval
+ # to empty instead of SELECT @@hostname.
+ let $sel_retval_0=;
+ }
+
+ if (`SELECT $unsafe_type = 2`) {
+ --echo ==== Testing SELECT...LIMIT unsafeness ====
+ let $desc_0= unsafe SELECT...LIMIT statement;
+ let $stmt_sidef_0= INSERT INTO t0 SELECT * FROM data_table LIMIT 1;
+ let $value_0=;
+ let $sel_sidef_0=;
+ let $sel_retval_0= SELECT * FROM data_table LIMIT 1;
+ }
+
+ if (`SELECT $unsafe_type = 3`) {
+ --echo ==== Testing INSERT DELAYED unsafeness ====
+ let $desc_0= unsafe INSERT DELAYED statement;
+ let $stmt_sidef_0= INSERT DELAYED INTO t0 VALUES (1), (2);
+ let $value_0=;
+ let $sel_sidef_0=;
+ let $sel_retval_0=;
+ }
+
+ if (`SELECT $unsafe_type = 4`) {
+ --echo ==== Testing unsafeness of insert of two autoinc values ====
+ let $desc_0= unsafe update of two autoinc columns;
+ let $stmt_sidef_0= INSERT INTO double_autoinc_table VALUES (NULL);
+ let $value_0=;
+ let $sel_sidef_0=;
+ let $sel_retval_0=;
+ }
+
+ if (`SELECT $unsafe_type = 5`) {
+ --echo ==== Testing unsafeness of UDF's ====
+ let $desc_0= unsafe UDF;
+ let $stmt_sidef_0= INSERT INTO t0 VALUES (myfunc_int(10));
+ let $value_0= myfunc_int(10);
+ let $sel_sidef_0= SELECT myfunc_int(10);
+ let $sel_retval_0= ;
+ }
+
+ if (`SELECT $unsafe_type = 6`) {
+ --echo ==== Testing unsafeness of access to mysql.general_log ====
+ let $desc_0= unsafe use of mysql.general_log;
+ let $stmt_sidef_0= INSERT INTO t0 SELECT COUNT(*) FROM mysql.general_log;
+ let $value_0=;
+ let $sel_sidef_0=;
+ let $sel_retval_0= SELECT COUNT(*) FROM mysql.general_log;
+ }
+
+ # In each iteration of the following loop, we select one way to
+ # enclose the unsafe statement as a sub-statement of a recursive
+ # construct (i.e., a function, procedure, trigger, view, or prepared
+ # statement).
+ #
+ # In the last iteration, $call_type_1=7, we don't create a recursive
+ # construct. Instead, we just invoke the unsafe statement directly.
+
+ let $call_type_1= 0;
+ while (`SELECT $call_type_1 < 8`) {
+ #--echo debug: level 1, types $call_type_1 -> $unsafe_type
+ let $CRC_ARG_level= 1;
+ let $CRC_ARG_type= $call_type_1;
+ let $CRC_ARG_stmt_sidef= $stmt_sidef_0;
+ let $CRC_ARG_value= $value_0;
+ let $CRC_ARG_sel_sidef= $sel_sidef_0;
+ let $CRC_ARG_sel_retval= $sel_retval_0;
+ let $CRC_ARG_desc= $desc_0;
+ source extra/rpl_tests/create_recursive_construct.inc;
+ let $stmt_sidef_1= $CRC_RET_stmt_sidef;
+ let $value_1= $CRC_RET_value;
+ let $sel_sidef_1= $CRC_RET_sel_sidef;
+ let $sel_retval_1= $CRC_RET_sel_retval;
+ let $is_toplevel_1= $CRC_RET_is_toplevel;
+ let $drop_1= $CRC_RET_drop;
+ let $desc_1= $CRC_RET_desc;
+
+ # Some statements must be top-level statements, i.e., cannot be
+ # called as a sub-statement of any recursive construct. (One
+ # example is 'EXECUTE prepared_stmt'). When
+ # create_recursive_construct.inc creates a top-level statement, it
+ # sets $CRC_RET_is_toplevel=1.
+
+ if (!$is_toplevel_1) {
+
+ # In each iteration of this loop, we select one way to enclose
+ # the previous recursive construct in another recursive
+ # construct.
+
+ let $call_type_2= 0;
+ while (`SELECT $call_type_2 < 7`) {
+ #--echo debug: level 2, types $call_type_2 -> $call_type_1 -> $unsafe_type
+ let $CRC_ARG_level= 2;
+ let $CRC_ARG_type= $call_type_2;
+ let $CRC_ARG_stmt_sidef= $stmt_sidef_1;
+ let $CRC_ARG_value= $value_1;
+ let $CRC_ARG_sel_sidef= $sel_sidef_1;
+ let $CRC_ARG_sel_retval= $sel_retval_1;
+ let $CRC_ARG_desc= $desc_1;
+ source extra/rpl_tests/create_recursive_construct.inc;
+ let $stmt_sidef_2= $CRC_RET_stmt_sidef;
+ let $value_2= $CRC_RET_value;
+ let $sel_sidef_2= $CRC_RET_sel_sidef;
+ let $sel_retval_2= $CRC_RET_sel_retval;
+ let $is_toplevel_2= $CRC_RET_is_toplevel;
+ let $drop_2= $CRC_RET_drop;
+ let $desc_2= $CRC_RET_desc;
+
+ if (!$is_toplevel_2) {
+
+ # Conditioned out since it makes result file really big.
+
+ if (0) {
+
+ # In each iteration of this loop, we select one way to enclose
+ # the previous recursive construct in another recursive
+ # construct.
+
+ let $call_type_3= 0;
+ while (`SELECT $call_type_3 < 7`) {
+ #--echo debug: level 3, types $call_type_2 -> $call_type_2 -> $call_type_1 -> $unsafe_type
+ let $CRC_ARG_level= 3;
+ let $CRC_ARG_type= $call_type_3;
+ let $CRC_ARG_stmt_sidef= $stmt_sidef_2;
+ let $CRC_ARG_value= $value_2;
+ let $CRC_ARG_sel_sidef= $sel_sidef_2;
+ let $CRC_ARG_sel_retval= $sel_retval_2;
+ let $CRC_ARG_desc= $desc_2;
+ source extra/rpl_tests/create_recursive_construct.inc;
+
+ # Drop created object.
+ if (`SELECT '$drop_3' != ''`) {
+ eval $drop_3;
+ }
+ inc $call_type_3;
+ } # while (call_type_3)
+ } # if (0)
+ } # if (!is_toplevel_2)
+
+ # Drop created object.
+ if (`SELECT '$drop_2' != ''`) {
+ eval $drop_2;
+ }
+ inc $call_type_2;
+ } # while (call_type_2)
+ } # if (!is_toplevel_1)
+
+ # Drop created object.
+ if (`SELECT '$drop_1' != ''`) {
+ eval $drop_1;
+ }
+ inc $call_type_1;
+ } # while (call_type_1)
+
+ inc $unsafe_type;
+} # while (unsafe_type)
+
+DROP TRIGGER double_autoinc_trig;
+DROP TABLE t0, t1, t2, t3, ta1, ta2, ta3,
+ autoinc_table, double_autoinc_table,
+ data_table,
+ trigger_table_1, trigger_table_2, trigger_table_3;
+DROP FUNCTION myfunc_int;
+
+
+--echo ==== Special system variables that should *not* be unsafe ====
+
+CREATE TABLE t1 (a VARCHAR(1000));
+CREATE TABLE autoinc_table (a INT PRIMARY KEY AUTO_INCREMENT);
---echo ---- Insert from stored function ----
-
-DELIMITER |;
-CREATE FUNCTION func()
-RETURNS INT
-BEGIN
- INSERT INTO t1 VALUES (@@global.sync_binlog);
- INSERT INTO t1 VALUES (@@session.insert_id);
- INSERT INTO t1 VALUES (@@global.auto_increment_increment);
- INSERT INTO t2 SELECT UUID();
- INSERT INTO t2 VALUES (@@session.sql_mode);
- INSERT INTO t2 VALUES (@@global.init_slave);
- INSERT INTO t2 VALUES (@@hostname);
- RETURN 0;
-END|
-DELIMITER ;|
-
-SELECT func();
-
---echo ---- Insert from trigger ----
-
-DELIMITER |;
-CREATE TRIGGER trig
-BEFORE INSERT ON trigger_table
-FOR EACH ROW
-BEGIN
- INSERT INTO t1 VALUES (@@global.sync_binlog);
- INSERT INTO t1 VALUES (@@session.insert_id);
- INSERT INTO t1 VALUES (@@global.auto_increment_increment);
- INSERT INTO t2 SELECT UUID();
- INSERT INTO t2 VALUES (@@session.sql_mode);
- INSERT INTO t2 VALUES (@@global.init_slave);
- INSERT INTO t2 VALUES (@@hostname);
-END|
-DELIMITER ;|
-
-INSERT INTO trigger_table VALUES ('bye.');
-
---echo ---- Insert from prepared statement ----
-
-PREPARE p1 FROM 'INSERT INTO t1 VALUES (@@global.sync_binlog)';
-PREPARE p2 FROM 'INSERT INTO t1 VALUES (@@session.insert_id)';
-PREPARE p3 FROM 'INSERT INTO t1 VALUES (@@global.auto_increment_increment)';
-PREPARE p4 FROM 'INSERT INTO t2 SELECT UUID()';
-PREPARE p5 FROM 'INSERT INTO t2 VALUES (@@session.sql_mode)';
-PREPARE p6 FROM 'INSERT INTO t2 VALUES (@@global.init_slave)';
-PREPARE p7 FROM 'INSERT INTO t2 VALUES (@@hostname)';
-
-EXECUTE p1; EXECUTE p2; EXECUTE p3; EXECUTE p4; EXECUTE p5;
-EXECUTE p6; EXECUTE p7;
-
---echo ---- Insert from nested call of triggers / functions / procedures ----
-
-DELIMITER |;
-
-# proc1: cause trigger 'trig' above to be triggered.
-CREATE PROCEDURE proc1()
- INSERT INTO trigger_table VALUES ('ha!')|
-
-# func2: call proc1 above.
-CREATE FUNCTION func2()
-RETURNS INT
-BEGIN
- CALL proc1();
- RETURN 0;
-END|
-
-# trig3: call func2 above
-CREATE TRIGGER trig3
-BEFORE INSERT ON trigger_table2
-FOR EACH ROW
-BEGIN
- DECLARE tmp INT;
- SELECT func2() INTO tmp;
-END|
-
-# proc4: cause trig3 above to be triggered.
-CREATE PROCEDURE proc4()
- INSERT INTO trigger_table2 VALUES (1)|
-
-# func5: call proc4 above.
-CREATE FUNCTION func5()
-RETURNS INT
-BEGIN
- CALL proc4;
- RETURN 0;
-END|
-
-# prep6: call func5() above.
-PREPARE prep6 FROM 'SELECT func5()'|
-
-DELIMITER ;|
-
-# try a complicated call path to trigger 'trig'.
-EXECUTE prep6;
-
-
---echo ==== Variables that should *not* be unsafe ====
-
-INSERT INTO t1 VALUES (@@session.pseudo_thread_id);
-INSERT INTO t1 VALUES (@@session.pseudo_thread_id);
+INSERT INTO t1 VALUES (@@session.auto_increment_increment);
+INSERT INTO t1 VALUES (@@session.auto_increment_offset);
+INSERT INTO t1 VALUES (@@session.character_set_client);
+INSERT INTO t1 VALUES (@@session.character_set_connection);
+INSERT INTO t1 VALUES (@@session.character_set_database);
+INSERT INTO t1 VALUES (@@session.character_set_server);
+INSERT INTO t1 VALUES (@@session.collation_connection);
+INSERT INTO t1 VALUES (@@session.collation_database);
+INSERT INTO t1 VALUES (@@session.collation_server);
INSERT INTO t1 VALUES (@@session.foreign_key_checks);
+INSERT INTO t1 VALUES (@@session.identity);
+INSERT INTO t1 VALUES (@@session.last_insert_id);
+INSERT INTO t1 VALUES (@@session.lc_time_names);
+INSERT INTO t1 VALUES (@@session.pseudo_thread_id);
INSERT INTO t1 VALUES (@@session.sql_auto_is_null);
+INSERT INTO t1 VALUES (@@session.timestamp);
+INSERT INTO t1 VALUES (@@session.time_zone);
INSERT INTO t1 VALUES (@@session.unique_checks);
-INSERT INTO t1 VALUES (@@session.auto_increment_increment);
-INSERT INTO t1 VALUES (@@session.auto_increment_offset);
-INSERT INTO t2 VALUES (@@session.character_set_client);
-INSERT INTO t2 VALUES (@@session.collation_connection);
-INSERT INTO t2 VALUES (@@session.collation_server);
-INSERT INTO t2 VALUES (@@session.time_zone);
-INSERT INTO t2 VALUES (@@session.lc_time_names);
-INSERT INTO t2 VALUES (@@session.collation_database);
-INSERT INTO t2 VALUES (@@session.timestamp);
-INSERT INTO t2 VALUES (@@session.last_insert_id);
+
SET @my_var= 4711;
INSERT INTO t1 VALUES (@my_var);
# using insert_id implicitly should be ok.
-SET insert_id=12;
-INSERT INTO t3 VALUES (NULL);
+SET insert_id= 12;
+INSERT INTO autoinc_table VALUES (NULL);
+
+# See set_var.cc for explanation.
+--echo The following variables *should* give a warning, despite they are replicated.
+INSERT INTO t1 VALUES (@@session.sql_mode);
+INSERT INTO t1 VALUES (@@session.insert_id);
---echo ==== Clean up ====
+DROP TABLE t1, autoinc_table;
+
-DROP PROCEDURE proc;
-DROP FUNCTION func;
-DROP TRIGGER trig;
-DROP PROCEDURE proc1;
-DROP FUNCTION func2;
-DROP TRIGGER trig3;
-DROP PROCEDURE proc4;
-DROP FUNCTION func5;
-DROP PREPARE prep6;
-DROP TABLE t1, t2, t3, trigger_table, trigger_table2;
#
# BUG#34768 - nondeterministic INSERT using LIMIT logged in stmt mode if
# binlog_format=mixed
@@ -388,4 +492,41 @@ DELETE FROM t1 LIMIT 1;
DROP TABLE t1, t2;
SET @@SESSION.SQL_MODE = @save_sql_mode;
+
+#
+# BUG#45825: INSERT DELAYED is not unsafe: logged in statement format
+# BUG#45785: LIMIT in SP does not cause RBL if binlog_format=MIXED
+#
+SET @old_binlog_format = @@session.binlog_format;
+SET binlog_format = MIXED;
+
+CREATE TABLE t1 (a INT);
+CREATE TABLE t2 (a INT);
+INSERT INTO t2 VALUES (1), (2);
+
+--DELIMITER |
+CREATE PROCEDURE proc_insert_delayed ()
+BEGIN
+ INSERT DELAYED INTO t1 VALUES (1), (2);
+END|
+
+CREATE FUNCTION func_limit ()
+RETURNS INT
+BEGIN
+ INSERT INTO t1 SELECT * FROM t2 LIMIT 1;
+ RETURN 1;
+END|
+--DELIMITER ;
+
+RESET MASTER;
+CALL proc_insert_delayed();
+SELECT func_limit();
+source include/show_binlog_events.inc;
+
+SET @@session.binlog_format = @old_binlog_format;
+DROP TABLE t1, t2;
+DROP PROCEDURE proc_insert_delayed;
+DROP FUNCTION func_limit;
+
+
--echo "End of tests"
diff --git a/mysql-test/suite/rpl/r/rpl_events.result b/mysql-test/suite/rpl/r/rpl_events.result
index b797183f9d2..0652235a734 100644
--- a/mysql-test/suite/rpl/r/rpl_events.result
+++ b/mysql-test/suite/rpl/r/rpl_events.result
@@ -6,96 +6,6 @@ drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
SET @old_event_scheduler = @@global.event_scheduler;
set global event_scheduler=1;
-set binlog_format=row;
-DROP EVENT IF EXISTS test.justonce;
-drop table if exists t1,t2;
-CREATE TABLE `t1` (
-`id` INT(10) UNSIGNED NOT NULL,
-`c` VARCHAR(50) NOT NULL,
-`ts` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-INSERT INTO t1 (id, c) VALUES (1, 'manually');
-"Creating event test.justonce on the master"
-CREATE EVENT test.justonce ON SCHEDULE EVERY 2 SECOND DO
-INSERT IGNORE INTO t1 (id, c) VALUES (2, 'from justonce');
-"Checking event is active on master"
-SELECT db, name, status, originator FROM mysql.event WHERE db = 'test' AND name = 'justonce';
-db name status originator
-test justonce ENABLED 1
-"Checking event data on the master"
-ONE
-1
-"Checking event data on the slave"
-ZERO
-0
-"Checking event is inactive on slave"
-SELECT db, name, status, originator FROM mysql.event WHERE db = 'test' AND name = 'justonce';
-db name status originator
-test justonce SLAVESIDE_DISABLED 1
-"Dropping event test.slave_once on the slave"
-DROP EVENT IF EXISTS test.slave_once;
-CREATE EVENT test.slave_once ON SCHEDULE EVERY 5 MINUTE STARTS CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO
-INSERT IGNORE INTO t1(id, c) VALUES (3, 'from slave_once');
-"Checking event status on the slave for originator value = slave's server_id"
-SELECT db, name, status, originator FROM mysql.event WHERE db = 'test' AND name = 'slave_once';
-db name status originator
-test slave_once ENABLED 2
-"Dropping event test.slave_once on the slave"
-DROP EVENT IF EXISTS test.slave_once;
-"Dropping event test.justonce on the master"
-DROP EVENT IF EXISTS test.justonce;
-"Creating event test.er on the master"
-CREATE EVENT test.er ON SCHEDULE EVERY 3 SECOND STARTS CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO
-INSERT IGNORE INTO t1(id, c) VALUES (4, 'from er');
-"Checking event status on the master"
-SELECT db, name, status, originator, body FROM mysql.event WHERE db = 'test' AND name = 'er';
-db name status originator body
-test er ENABLED 1 INSERT IGNORE INTO t1(id, c) VALUES (4, 'from er')
-"Checking event status on the slave"
-SELECT db, name, status, originator, body FROM mysql.event WHERE db = 'test' AND name = 'er';
-db name status originator body
-test er SLAVESIDE_DISABLED 1 INSERT IGNORE INTO t1(id, c) VALUES (4, 'from er')
-"Altering event test.er on the master"
-ALTER EVENT test.er ON SCHEDULE EVERY 5 SECOND STARTS CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO
-INSERT IGNORE INTO t1(id, c) VALUES (5, 'from alter er');
-"Checking event status on the master"
-SELECT db, name, status, originator, body FROM mysql.event WHERE db = 'test' AND name = 'er';
-db name status originator body
-test er ENABLED 1 INSERT IGNORE INTO t1(id, c) VALUES (5, 'from alter er')
-"Checking event status on the slave"
-SELECT db, name, status, originator, body FROM mysql.event WHERE db = 'test' AND name = 'er';
-db name status originator body
-test er SLAVESIDE_DISABLED 1 INSERT IGNORE INTO t1(id, c) VALUES (5, 'from alter er')
-"Dropping event test.er on the master"
-DROP EVENT test.er;
-"Checking event status on the master"
-SELECT db, name, status, originator FROM mysql.event WHERE db = 'test';
-db name status originator
-"Checking event status on the slave"
-SELECT db, name, status, originator FROM mysql.event WHERE db = 'test';
-db name status originator
-"Creating event test.slave_terminate on the slave"
-CREATE EVENT test.slave_terminate ON SCHEDULE EVERY 3 SECOND STARTS CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO
-INSERT IGNORE INTO t1(id, c) VALUES (6, 'from slave_terminate');
-"Checking event status on the slave"
-SELECT db, name, status, originator FROM mysql.event WHERE db = 'test' AND name = 'slave_terminate';
-db name status originator
-test slave_terminate ENABLED 2
-"Dropping event test.slave_terminate on the slave"
-DROP EVENT test.slave_terminate;
-"Creating event test.slave_terminate with DISABLE ON SLAVE on the slave"
-CREATE EVENT test.slave_terminate ON SCHEDULE EVERY 3 SECOND DISABLE ON SLAVE DO
-INSERT IGNORE INTO t1(c) VALUES (7, 'from slave_terminate');
-"Checking event status on the slave"
-SELECT db, name, status, originator FROM mysql.event WHERE db = 'test' AND name = 'slave_terminate';
-db name status originator
-test slave_terminate SLAVESIDE_DISABLED 2
-"Dropping event test.slave_terminate on the slave"
-DROP EVENT test.slave_terminate;
-"Cleanup"
-DROP TABLE t1;
-set binlog_format=statement;
DROP EVENT IF EXISTS test.justonce;
drop table if exists t1,t2;
CREATE TABLE `t1` (
diff --git a/mysql-test/suite/rpl/r/rpl_extraColmaster_innodb.result b/mysql-test/suite/rpl/r/rpl_extraColmaster_innodb.result
index ad67f96db71..dc1efaf77e7 100644
--- a/mysql-test/suite/rpl/r/rpl_extraColmaster_innodb.result
+++ b/mysql-test/suite/rpl/r/rpl_extraColmaster_innodb.result
@@ -4,7 +4,6 @@ reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
-set binlog_format=row;
***********************************************************
***********************************************************
@@ -1145,2285 +1144,3 @@ c1 hex(c4) c5
3 6231623162316231 QA
DROP TABLE t5;
-set binlog_format=statement;
-
-***********************************************************
-***********************************************************
-***************** Start of Testing ************************
-***********************************************************
-***********************************************************
-* This test format == binlog_format STATEMENT and engine == 'InnoDB'
-***********************************************************
-***********************************************************
-
-***** Testing more columns on the Master *****
-
-CREATE TABLE t1 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 FLOAT DEFAULT '2.00',
-f6 CHAR(4) DEFAULT 'TEST',
-f7 INT DEFAULT '0',
-f8 TEXT,
-f9 LONGBLOB,
-f10 BIT(63),
-f11 VARBINARY(64))ENGINE='InnoDB';
-
-* Alter Table on Slave and drop columns f5 through f11 *
-
-alter table t1 drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11;
-
-* Insert data in Master then update and delete some rows*
-
-* Select count and 20 rows from Master *
-
-SELECT COUNT(*) FROM t1;
-COUNT(*)
-40
-
-SELECT f1,f2,f3,f4,f5,f6,f7,f8,f9,
-hex(f10),hex(f11) FROM t1 ORDER BY f3 LIMIT 20;
-f1 f2 f3 f4 f5 f6 f7 f8 f9 hex(f10) hex(f11)
-2 2 2 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-3 3 3 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-5 5 5 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-6 6 6 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-8 8 8 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-9 9 9 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-11 11 11 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-12 12 12 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-14 14 14 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-15 15 15 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-17 17 17 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-18 18 18 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-20 20 20 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-21 21 21 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-23 23 23 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-24 24 24 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-26 26 26 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-27 27 27 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-29 29 29 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-30 30 30 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-
-* Select count and 20 rows from Slave *
-
-SELECT COUNT(*) FROM t1;
-COUNT(*)
-40
-
-SELECT * FROM t1 ORDER BY f3 LIMIT 20;
-f1 f2 f3 f4
-2 2 2 second
-3 3 3 next
-5 5 5 second
-6 6 6 next
-8 8 8 second
-9 9 9 next
-11 11 11 second
-12 12 12 next
-14 14 14 second
-15 15 15 next
-17 17 17 second
-18 18 18 next
-20 20 20 second
-21 21 21 next
-23 23 23 second
-24 24 24 next
-26 26 26 second
-27 27 27 next
-29 29 29 second
-30 30 30 next
-
-* Show Slave Status *
-
-show slave status;;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running Yes
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 0
-Last_Error
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 0
-Last_SQL_Error
-
-
-***** Testing Altering table def scenario *****
-
-CREATE TABLE t2 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 DOUBLE DEFAULT '2.00',
-f6 ENUM('a', 'b', 'c') default 'a',
-f7 DECIMAL(17,9) default '1000.00',
-f8 MEDIUMBLOB,
-f9 NUMERIC(6,4) default '2000.00',
-f10 VARCHAR(1024),
-f11 BINARY(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-f12 SET('a', 'b', 'c') default 'b')
-ENGINE='InnoDB';
-Warnings:
-Warning 1264 Out of range value for column 'f9' at row 1
-
-CREATE TABLE t3 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 DOUBLE DEFAULT '2.00',
-f6 ENUM('a', 'b', 'c') default 'a',
-f8 MEDIUMBLOB,
-f10 VARCHAR(1024),
-f11 BINARY(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-f12 SET('a', 'b', 'c') default 'b')
-ENGINE='InnoDB';
-
-CREATE TABLE t4 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 DOUBLE DEFAULT '2.00',
-f6 DECIMAL(17,9) default '1000.00',
-f7 MEDIUMBLOB,
-f8 NUMERIC(6,4) default '2000.00',
-f9 VARCHAR(1024),
-f10 BINARY(20) not null default '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-f11 CHAR(255))
-ENGINE='InnoDB';
-Warnings:
-Warning 1264 Out of range value for column 'f8' at row 1
-
-CREATE TABLE t31 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 BIGINT,
-f6 BLOB,
-f7 DATE,
-f8 DATETIME,
-f9 FLOAT,
-f10 INT,
-f11 LONGBLOB,
-f12 LONGTEXT,
-f13 MEDIUMBLOB,
-f14 MEDIUMINT,
-f15 MEDIUMTEXT,
-f16 REAL,
-f17 SMALLINT,
-f18 TEXT,
-f19 TIME,
-f20 TIMESTAMP,
-f21 TINYBLOB,
-f22 TINYINT,
-f23 TINYTEXT,
-f24 YEAR,
-f25 BINARY(255),
-f26 BIT(64),
-f27 CHAR(255),
-f28 DECIMAL(30,7),
-f29 DOUBLE,
-f30 ENUM ('a','b', 'c') default 'a',
-f31 FLOAT,
-f32 NUMERIC(17,9),
-f33 SET ('a', 'b', 'c') default 'b',
-f34 VARBINARY(1025),
-f35 VARCHAR(257)
-) ENGINE='InnoDB';
-
-** Alter tables on slave and drop columns **
-
-alter table t2 drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11, drop
-f12;
-alter table t3 drop f5, drop f6, drop f8, drop f10, drop f11, drop f12;
-alter table t4 drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11;
-alter table t31
-drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11,
-drop f12, drop f13, drop f14, drop f15, drop f16, drop f17, drop f18,
-drop f19, drop f20, drop f21, drop f22, drop f23, drop f24, drop f25,
-drop f26, drop f27, drop f28, drop f29, drop f30, drop f31, drop f32,
-drop f33, drop f34, drop f35;
-
-** Insert Data into Master **
-INSERT into t2 set f1=1, f2=1, f3=1, f4='first', f8='f8: medium size blob', f10='f10:
-some var char';
-INSERT into t2 values (2, 2, 2, 'second',
-2.0, 'b', 2000.0002, 'f8: medium size blob', 2000, 'f10: some var char',
-'01234567', 'c'),
-(3, 3, 3, 'third',
-3.0, 'b', 3000.0003, 'f8: medium size blob', 3000, 'f10: some var char',
-'01234567', 'c');
-Warnings:
-Warning 1264 Out of range value for column 'f9' at row 1
-Warning 1264 Out of range value for column 'f9' at row 2
-INSERT into t3 set f1=1, f2=1, f3=1, f4='first', f10='f10: some var char';
-INSERT into t4 set f1=1, f2=1, f3=1, f4='first', f7='f7: medium size blob', f10='f10:
-binary data';
-INSERT into t31 set f1=1, f2=1, f3=1, f4='first';
-INSERT into t31 set f1=1, f2=1, f3=2, f4='second',
-f9=2.2, f10='seven samurai', f28=222.222, f35='222';
-Warnings:
-Warning 1366 Incorrect integer value: 'seven samurai' for column 'f10' at row 1
-INSERT into t31 values (1, 1, 3, 'third',
-/* f5 BIGINT, */ 333333333333333333333333,
-/* f6 BLOB, */ '3333333333333333333333',
-/* f7 DATE, */ '2007-07-18',
-/* f8 DATETIME, */ "2007-07-18",
-/* f9 FLOAT, */ 3.33333333,
-/* f10 INT, */ 333333333,
-/* f11 LONGBLOB, */ '3333333333333333333',
-/* f12 LONGTEXT, */ '3333333333333333333',
-/* f13 MEDIUMBLOB, */ '3333333333333333333',
-/* f14 MEDIUMINT, */ 33,
-/* f15 MEDIUMTEXT, */ 3.3,
-/* f16 REAL, */ 3.3,
-/* f17 SMALLINT, */ 3,
-/* f18 TEXT, */ '33',
-/* f19 TIME, */ '2:59:58.999',
-/* f20 TIMESTAMP, */ 20000303000000,
-/* f21 TINYBLOB, */ '3333',
-/* f22 TINYINT, */ 3,
-/* f23 TINYTEXT, */ '3',
-/* f24 YEAR, */ 3000,
-/* f25 BINARY(255), */ 'three_33333',
-/* f26 BIT(64), */ b'011',
-/* f27 CHAR(255), */ 'three',
-/* f28 DECIMAL(30,7), */ 3.333,
-/* f29 DOUBLE, */ 3.333333333333333333333333333,
-/* f30 ENUM ('a','b','c')*/ 'c',
-/* f31 FLOAT, */ 3.0,
-/* f32 NUMERIC(17,9), */ 3.3333,
-/* f33 SET ('a','b','c'),*/ 'c',
-/*f34 VARBINARY(1025),*/ '3333 minus 3',
-/*f35 VARCHAR(257),*/ 'three times three'
- );
-Warnings:
-Warning 1264 Out of range value for column 'f5' at row 1
-Warning 1264 Out of range value for column 'f24' at row 1
-INSERT into t31 values (1, 1, 4, 'fourth',
-/* f5 BIGINT, */ 333333333333333333333333,
-/* f6 BLOB, */ '3333333333333333333333',
-/* f7 DATE, */ '2007-07-18',
-/* f8 DATETIME, */ "2007-07-18",
-/* f9 FLOAT, */ 3.33333333,
-/* f10 INT, */ 333333333,
-/* f11 LONGBLOB, */ '3333333333333333333',
-/* f12 LONGTEXT, */ '3333333333333333333',
-/* f13 MEDIUMBLOB, */ '3333333333333333333',
-/* f14 MEDIUMINT, */ 33,
-/* f15 MEDIUMTEXT, */ 3.3,
-/* f16 REAL, */ 3.3,
-/* f17 SMALLINT, */ 3,
-/* f18 TEXT, */ '33',
-/* f19 TIME, */ '2:59:58.999',
-/* f20 TIMESTAMP, */ 20000303000000,
-/* f21 TINYBLOB, */ '3333',
-/* f22 TINYINT, */ 3,
-/* f23 TINYTEXT, */ '3',
-/* f24 YEAR, */ 3000,
-/* f25 BINARY(255), */ 'three_33333',
-/* f26 BIT(64), */ b'011',
-/* f27 CHAR(255), */ 'three',
-/* f28 DECIMAL(30,7), */ 3.333,
-/* f29 DOUBLE, */ 3.333333333333333333333333333,
-/* f30 ENUM ('a','b','c')*/ 'c',
-/* f31 FLOAT, */ 3.0,
-/* f32 NUMERIC(17,9), */ 3.3333,
-/* f33 SET ('a','b','c'),*/ 'c',
-/*f34 VARBINARY(1025),*/ '3333 minus 3',
-/*f35 VARCHAR(257),*/ 'three times three'
- ),
-(1, 1, 5, 'fifth',
-/* f5 BIGINT, */ 333333333333333333333333,
-/* f6 BLOB, */ '3333333333333333333333',
-/* f7 DATE, */ '2007-07-18',
-/* f8 DATETIME, */ "2007-07-18",
-/* f9 FLOAT, */ 3.33333333,
-/* f10 INT, */ 333333333,
-/* f11 LONGBLOB, */ '3333333333333333333',
-/* f12 LONGTEXT, */ '3333333333333333333',
-/* f13 MEDIUMBLOB, */ '3333333333333333333',
-/* f14 MEDIUMINT, */ 33,
-/* f15 MEDIUMTEXT, */ 3.3,
-/* f16 REAL, */ 3.3,
-/* f17 SMALLINT, */ 3,
-/* f18 TEXT, */ '33',
-/* f19 TIME, */ '2:59:58.999',
-/* f20 TIMESTAMP, */ 20000303000000,
-/* f21 TINYBLOB, */ '3333',
-/* f22 TINYINT, */ 3,
-/* f23 TINYTEXT, */ '3',
-/* f24 YEAR, */ 3000,
-/* f25 BINARY(255), */ 'three_33333',
-/* f26 BIT(64), */ b'011',
-/* f27 CHAR(255), */ 'three',
-/* f28 DECIMAL(30,7), */ 3.333,
-/* f29 DOUBLE, */ 3.333333333333333333333333333,
-/* f30 ENUM ('a','b','c')*/ 'c',
-/* f31 FLOAT, */ 3.0,
-/* f32 NUMERIC(17,9), */ 3.3333,
-/* f33 SET ('a','b','c'),*/ 'c',
-/*f34 VARBINARY(1025),*/ '3333 minus 3',
-/*f35 VARCHAR(257),*/ 'three times three'
- ),
-(1, 1, 6, 'sixth',
-/* f5 BIGINT, */ NULL,
-/* f6 BLOB, */ '3333333333333333333333',
-/* f7 DATE, */ '2007-07-18',
-/* f8 DATETIME, */ "2007-07-18",
-/* f9 FLOAT, */ 3.33333333,
-/* f10 INT, */ 333333333,
-/* f11 LONGBLOB, */ '3333333333333333333',
-/* f12 LONGTEXT, */ '3333333333333333333',
-/* f13 MEDIUMBLOB, */ '3333333333333333333',
-/* f14 MEDIUMINT, */ 33,
-/* f15 MEDIUMTEXT, */ 3.3,
-/* f16 REAL, */ 3.3,
-/* f17 SMALLINT, */ 3,
-/* f18 TEXT, */ '33',
-/* f19 TIME, */ '2:59:58.999',
-/* f20 TIMESTAMP, */ 20000303000000,
-/* f21 TINYBLOB, */ '3333',
-/* f22 TINYINT, */ 3,
-/* f23 TINYTEXT, */ '3',
-/* f24 YEAR, */ 3000,
-/* f25 BINARY(255), */ 'three_33333',
-/* f26 BIT(64), */ b'011',
-/* f27 CHAR(255), */ 'three',
-/* f28 DECIMAL(30,7), */ 3.333,
-/* f29 DOUBLE, */ 3.333333333333333333333333333,
-/* f30 ENUM ('a','b','c')*/ 'c',
-/* f31 FLOAT, */ 3.0,
-/* f32 NUMERIC(17,9), */ 3.3333,
-/* f33 SET ('a','b','c'),*/ 'c',
-/*f34 VARBINARY(1025),*/ '3333 minus 3',
-/*f35 VARCHAR(257),*/ NULL
-);
-Warnings:
-Warning 1264 Out of range value for column 'f5' at row 1
-Warning 1264 Out of range value for column 'f24' at row 1
-Warning 1264 Out of range value for column 'f5' at row 2
-Warning 1264 Out of range value for column 'f24' at row 2
-Warning 1264 Out of range value for column 'f24' at row 3
-
-** Sync slave with master **
-** Do selects from tables **
-
-select * from t1 order by f3;
-f1 f2 f3 f4
-2 2 2 second
-3 3 3 next
-5 5 5 second
-6 6 6 next
-8 8 8 second
-9 9 9 next
-11 11 11 second
-12 12 12 next
-14 14 14 second
-15 15 15 next
-17 17 17 second
-18 18 18 next
-20 20 20 second
-21 21 21 next
-23 23 23 second
-24 24 24 next
-26 26 26 second
-27 27 27 next
-29 29 29 second
-30 30 30 next
-31 31 31 second
-32 32 32 second
-33 33 33 second
-34 34 34 second
-35 35 35 second
-36 36 36 second
-37 37 37 second
-38 38 38 second
-39 39 39 second
-40 40 40 second
-41 41 41 second
-42 42 42 second
-43 43 43 second
-44 44 44 second
-45 45 45 second
-46 46 46 second
-47 47 47 second
-48 48 48 second
-49 49 49 second
-50 50 50 second
-select * from t2 order by f1;
-f1 f2 f3 f4
-1 1 1 first
-2 2 2 second
-3 3 3 third
-select * from t3 order by f1;
-f1 f2 f3 f4
-1 1 1 first
-select * from t4 order by f1;
-f1 f2 f3 f4
-1 1 1 first
-select * from t31 order by f3;
-f1 f2 f3 f4
-1 1 1 first
-1 1 2 second
-1 1 3 third
-1 1 4 fourth
-1 1 5 fifth
-1 1 6 sixth
-
-** Do updates master **
-
-update t31 set f5=555555555555555 where f3=6;
-update t31 set f2=2 where f3=2;
-update t31 set f1=NULL where f3=1;
-update t31 set f3=NULL, f27=NULL, f35='f35 new value' where f3=3;
-Warnings:
-Warning 1048 Column 'f3' cannot be null
-
-** Delete from Master **
-
-delete from t1;
-delete from t2;
-delete from t3;
-delete from t4;
-delete from t31;
-
-** Check slave status **
-
-select * from t31;
-f1 f2 f3 f4
-show slave status;;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running Yes
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 0
-Last_Error
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 0
-Last_SQL_Error
-
-****************************************
-* columns in master at middle of table *
-* Expect: Proper error message *
-****************************************
-
-** Stop and Reset Slave **
-
-STOP SLAVE;
-RESET SLAVE;
-
-** create table slave side **
-CREATE TABLE t10 (a INT PRIMARY KEY, b BLOB, c CHAR(5)
-) ENGINE='InnoDB';
-
-** Connect to master and create table **
-
-CREATE TABLE t10 (a INT KEY, b BLOB, f DOUBLE DEFAULT '233',
-c CHAR(5), e INT DEFAULT '1')ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t10 () VALUES(1,@b1,DEFAULT,'Kyle',DEFAULT),
-(2,@b1,DEFAULT,'JOE',DEFAULT),
-(3,@b1,DEFAULT,'QA',DEFAULT);
-
-********************************************
-*** Expect slave to fail with Error 1523 ***
-********************************************
-
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1535
-Last_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 5, test.t10 has type 254
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1535
-Last_SQL_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 5, test.t10 has type 254
-SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
-START SLAVE;
-
-*** Drop t10 ***
-DROP TABLE t10;
-
-*********************************************
-* More columns in master at middle of table *
-* Expect: Proper error message *
-*********************************************
-
-*** Create t11 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t11 (a INT PRIMARY KEY, b BLOB, c VARCHAR(254)
-) ENGINE='InnoDB';
-
-*** Create t11 on Master ***
-CREATE TABLE t11 (a INT KEY, b BLOB, f TEXT,
-c CHAR(5) DEFAULT 'test', e INT DEFAULT '1')ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t11 () VALUES(1,@b1,'Testing is fun','Kyle',DEFAULT),
-(2,@b1,'Testing is cool','JOE',DEFAULT),
-(3,@b1,DEFAULT,'QA',DEFAULT);
-
-********************************************
-*** Expect slave to fail with Error 1523 ***
-********************************************
-
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1535
-Last_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 252, test.t11 has type 15
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1535
-Last_SQL_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 252, test.t11 has type 15
-SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
-START SLAVE;
-
-*** Drop t11 ***
-DROP TABLE t11;
-
-*********************************************
-* More columns in master at middle of table *
-* Expect: This one should pass blob-text *
-*********************************************
-
-*** Create t12 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t12 (a INT PRIMARY KEY, b BLOB, c BLOB
-) ENGINE='InnoDB';
-
-*** Create t12 on Master ***
-CREATE TABLE t12 (a INT KEY, b BLOB, f TEXT,
-c CHAR(5) DEFAULT 'test', e INT DEFAULT '1')ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t12 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT),
-(2,@b1,'JOE',DEFAULT,DEFAULT),
-(3,@b1,'QA',DEFAULT,DEFAULT);
-
-SELECT a,hex(b),f,c,e FROM t12 ORDER BY a;
-a hex(b) f c e
-1 62316231623162316231623162316231 Kyle test 1
-2 62316231623162316231623162316231 JOE test 1
-3 62316231623162316231623162316231 QA test 1
-
-*** Select on Slave ***
-SELECT a,hex(b),c FROM t12 ORDER BY a;
-a hex(b) c
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-3 62316231623162316231623162316231 QA
-
-*** Drop t12 ***
-DROP TABLE t12;
-
-****************************************************
-* - Alter Master adding columns at middle of table *
-* Expect: columns added *
-****************************************************
-
-
-*** Create t14 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t14 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='InnoDB';
-
-*** Create t14 on Master ***
-CREATE TABLE t14 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-ALTER TABLE t14 ADD COLUMN c2 DECIMAL(8,2) AFTER c1;
-ALTER TABLE t14 ADD COLUMN c3 TEXT AFTER c2;
-
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t14 () VALUES(1,1.00,'Replication Testing Extra Col',@b1,'Kyle',DEFAULT,DEFAULT),
-(2,2.00,'This Test Should work',@b1,'JOE',DEFAULT,DEFAULT),
-(3,3.00,'If is does not, I will open a bug',@b1,'QA',DEFAULT,DEFAULT);
-
-SELECT c1,c2,c3,hex(c4),c5,c6,c7 FROM t14 ORDER BY c1;
-c1 c2 c3 hex(c4) c5 c6 c7
-1 1.00 Replication Testing Extra Col 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 2.00 This Test Should work 62316231623162316231623162316231 JOE 1 CURRENT_TIMESTAMP
-3 3.00 If is does not, I will open a bug 62316231623162316231623162316231 QA 1 CURRENT_TIMESTAMP
-
-*** Select on Slave ****
-SELECT c1,c2,c3,hex(c4),c5 FROM t14 ORDER BY c1;
-c1 c2 c3 hex(c4) c5
-1 1.00 Replication Testing Extra Col 62316231623162316231623162316231 Kyle
-2 2.00 This Test Should work 62316231623162316231623162316231 JOE
-3 3.00 If is does not, I will open a bug 62316231623162316231623162316231 QA
-
-****************************************************
-* - Alter Master Dropping columns from the middle. *
-* Expect: columns dropped *
-****************************************************
-
-*** connect to master and drop columns ***
-ALTER TABLE t14 DROP COLUMN c2;
-ALTER TABLE t14 DROP COLUMN c7;
-
-*** Select from Master ***
-SELECT c1,c3,hex(c4),c5,c6 FROM t14 ORDER BY c1;
-c1 c3 hex(c4) c5 c6
-1 Replication Testing Extra Col 62316231623162316231623162316231 Kyle 1
-2 This Test Should work 62316231623162316231623162316231 JOE 1
-3 If is does not, I will open a bug 62316231623162316231623162316231 QA 1
-
-************
-* Bug30415 *
-************
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1091
-Last_Error Error 'Can't DROP 'c7'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t14 DROP COLUMN c7'
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1091
-Last_SQL_Error Error 'Can't DROP 'c7'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t14 DROP COLUMN c7'
-STOP SLAVE;
-RESET SLAVE;
-
-*** Drop t14 ***
-DROP TABLE t14;
-DROP TABLE t14;
-RESET MASTER;
-START SLAVE;
-
-*************************************************
-* - Alter Master adding columns at end of table *
-* Expect: Error 1054 *
-*************************************************
-
-*** Create t15 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t15 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='InnoDB';
-
-*** Create t15 on Master ***
-CREATE TABLE t15 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-ALTER TABLE t15 ADD COLUMN c2 DECIMAL(8,2) AFTER c7;
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t15 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT,3.00),
-(2,@b1,'JOE',DEFAULT,DEFAULT,3.00),
-(3,@b1,'QA',DEFAULT,DEFAULT,3.00);
-SELECT c1,hex(c4),c5,c6,c7,c2 FROM t15 ORDER BY c1;
-c1 hex(c4) c5 c6 c7 c2
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP 3.00
-2 62316231623162316231623162316231 JOE 1 CURRENT_TIMESTAMP 3.00
-3 62316231623162316231623162316231 QA 1 CURRENT_TIMESTAMP 3.00
-
-********************************************
-*** Expect slave to fail with Error 1054 ***
-********************************************
-
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1054
-Last_Error Error 'Unknown column 'c7' in 't15'' on query. Default database: 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c2 DECIMAL(8,2) AFTER c7'
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1054
-Last_SQL_Error Error 'Unknown column 'c7' in 't15'' on query. Default database: 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c2 DECIMAL(8,2) AFTER c7'
-STOP SLAVE;
-RESET SLAVE;
-
-*** Drop t15 ***
-DROP TABLE t15;
-DROP TABLE t15;
-RESET MASTER;
-START SLAVE;
-
-************************************************
-* - Create index on Master column not on slave *
-* Expect:Warning *
-************************************************
-
-*** Create t16 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t16 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='InnoDB';
-
-*** Create t16 on Master ***
-CREATE TABLE t16 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Create Index and Data Insert ***
-CREATE INDEX part_of_c6 ON t16 (c6);
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t16 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT),
-(2,@b1,'JOE',2,DEFAULT),
-(3,@b1,'QA',3,DEFAULT);
-SELECT c1,hex(c4),c5,c6,c7 FROM t16 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-3 62316231623162316231623162316231 QA 3 CURRENT_TIMESTAMP
-
-*****************
-*** BUG 30434 ***
-*****************
-
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1072
-Last_Error Error 'Key column 'c6' doesn't exist in table' on query. Default database: 'test'. Query: 'CREATE INDEX part_of_c6 ON t16 (c6)'
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1072
-Last_SQL_Error Error 'Key column 'c6' doesn't exist in table' on query. Default database: 'test'. Query: 'CREATE INDEX part_of_c6 ON t16 (c6)'
-STOP SLAVE;
-RESET SLAVE;
-
-*** Drop t16 ***
-DROP TABLE t16;
-DROP TABLE t16;
-RESET MASTER;
-START SLAVE;
-
-*****************************************************
-* - Delete rows using column on Master not on slave *
-* Expect: Rows Deleted *
-*****************************************************
-
-*** Create t17 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t17 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='InnoDB';
-
-*** Create t17 on Master ***
-CREATE TABLE t17 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t17 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT),
-(2,@b1,'JOE',2,DEFAULT),
-(3,@b1,'QA',3,DEFAULT);
-SELECT c1,hex(c4),c5,c6,c7 FROM t17 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-3 62316231623162316231623162316231 QA 3 CURRENT_TIMESTAMP
-
-** Select * from Slave **
-SELECT c1,hex(c4),c5 FROM t17 ORDER BY c1;
-c1 hex(c4) c5
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-3 62316231623162316231623162316231 QA
-
-** Delete from master **
-DELETE FROM t17 WHERE c6 = 3;
-SELECT c1,hex(c4),c5,c6,c7 FROM t17 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-
-** Check slave **
-SELECT c1,hex(c4),c5 FROM t17 ORDER BY c1;
-c1 hex(c4) c5
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-DROP TABLE t17;
-
-
-*****************************************************
-* - Update row using column on Master not on slave *
-* Expect: Rows updated *
-*****************************************************
-
-** Bug30674 **
-
-*** Create t18 on slave ***
-
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t18 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='InnoDB';
-
-*** Create t18 on Master ***
-CREATE TABLE t18 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t18 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT),
-(2,@b1,'JOE',2,DEFAULT),
-(3,@b1,'QA',3,DEFAULT);
-SELECT c1,hex(c4),c5,c6,c7 FROM t18 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-3 62316231623162316231623162316231 QA 3 CURRENT_TIMESTAMP
-
-** Select * from Slave **
-SELECT c1,hex(c4),c5 FROM t18 ORDER BY c1;
-c1 hex(c4) c5
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-3 62316231623162316231623162316231 QA
-
-** update from master **
-UPDATE t18 SET c5 = 'TEST' WHERE c6 = 3;
-SELECT c1,hex(c4),c5,c6,c7 FROM t18 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-3 62316231623162316231623162316231 TEST 3 CURRENT_TIMESTAMP
-
-** Check slave **
-SELECT c1,hex(c4),c5 FROM t18 ORDER BY c1;
-c1 hex(c4) c5
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-3 62316231623162316231623162316231 TEST
-DROP TABLE t18;
-
-
-*****************************************************
-* - Insert UUID column on Master not on slave *
-* Expect: Rows inserted *
-*****************************************************
-
-*** Create t5 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t5 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='InnoDB';
-
-*** Create t5 on Master ***
-CREATE TABLE t5 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 LONG,
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-INSERT INTO t5 () VALUES(1,@b1,'Kyle',UUID(),DEFAULT),
-(2,@b1,'JOE',UUID(),DEFAULT),
-(3,@b1,'QA',UUID(),DEFAULT);
-SELECT c1,hex(c4),c5,c6,c7 FROM t5 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 6231623162316231 Kyle UUID TIME
-2 6231623162316231 JOE UUID TIME
-3 6231623162316231 QA UUID TIME
-
-** Select * from Slave **
-SELECT c1,hex(c4),c5 FROM t5 ORDER BY c1;
-c1 hex(c4) c5
-1 6231623162316231 Kyle
-2 6231623162316231 JOE
-3 6231623162316231 QA
-DROP TABLE t5;
-
-set binlog_format=mixed;
-
-***********************************************************
-***********************************************************
-***************** Start of Testing ************************
-***********************************************************
-***********************************************************
-* This test format == binlog_format MIXED and engine == 'InnoDB'
-***********************************************************
-***********************************************************
-
-***** Testing more columns on the Master *****
-
-CREATE TABLE t1 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 FLOAT DEFAULT '2.00',
-f6 CHAR(4) DEFAULT 'TEST',
-f7 INT DEFAULT '0',
-f8 TEXT,
-f9 LONGBLOB,
-f10 BIT(63),
-f11 VARBINARY(64))ENGINE='InnoDB';
-
-* Alter Table on Slave and drop columns f5 through f11 *
-
-alter table t1 drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11;
-
-* Insert data in Master then update and delete some rows*
-
-* Select count and 20 rows from Master *
-
-SELECT COUNT(*) FROM t1;
-COUNT(*)
-40
-
-SELECT f1,f2,f3,f4,f5,f6,f7,f8,f9,
-hex(f10),hex(f11) FROM t1 ORDER BY f3 LIMIT 20;
-f1 f2 f3 f4 f5 f6 f7 f8 f9 hex(f10) hex(f11)
-2 2 2 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-3 3 3 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-5 5 5 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-6 6 6 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-8 8 8 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-9 9 9 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-11 11 11 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-12 12 12 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-14 14 14 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-15 15 15 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-17 17 17 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-18 18 18 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-20 20 20 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-21 21 21 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-23 23 23 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-24 24 24 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-26 26 26 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-27 27 27 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-29 29 29 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-30 30 30 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-
-* Select count and 20 rows from Slave *
-
-SELECT COUNT(*) FROM t1;
-COUNT(*)
-40
-
-SELECT * FROM t1 ORDER BY f3 LIMIT 20;
-f1 f2 f3 f4
-2 2 2 second
-3 3 3 next
-5 5 5 second
-6 6 6 next
-8 8 8 second
-9 9 9 next
-11 11 11 second
-12 12 12 next
-14 14 14 second
-15 15 15 next
-17 17 17 second
-18 18 18 next
-20 20 20 second
-21 21 21 next
-23 23 23 second
-24 24 24 next
-26 26 26 second
-27 27 27 next
-29 29 29 second
-30 30 30 next
-
-* Show Slave Status *
-
-show slave status;;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running Yes
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 0
-Last_Error
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 0
-Last_SQL_Error
-
-
-***** Testing Altering table def scenario *****
-
-CREATE TABLE t2 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 DOUBLE DEFAULT '2.00',
-f6 ENUM('a', 'b', 'c') default 'a',
-f7 DECIMAL(17,9) default '1000.00',
-f8 MEDIUMBLOB,
-f9 NUMERIC(6,4) default '2000.00',
-f10 VARCHAR(1024),
-f11 BINARY(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-f12 SET('a', 'b', 'c') default 'b')
-ENGINE='InnoDB';
-Warnings:
-Warning 1264 Out of range value for column 'f9' at row 1
-
-CREATE TABLE t3 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 DOUBLE DEFAULT '2.00',
-f6 ENUM('a', 'b', 'c') default 'a',
-f8 MEDIUMBLOB,
-f10 VARCHAR(1024),
-f11 BINARY(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-f12 SET('a', 'b', 'c') default 'b')
-ENGINE='InnoDB';
-
-CREATE TABLE t4 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 DOUBLE DEFAULT '2.00',
-f6 DECIMAL(17,9) default '1000.00',
-f7 MEDIUMBLOB,
-f8 NUMERIC(6,4) default '2000.00',
-f9 VARCHAR(1024),
-f10 BINARY(20) not null default '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-f11 CHAR(255))
-ENGINE='InnoDB';
-Warnings:
-Warning 1264 Out of range value for column 'f8' at row 1
-
-CREATE TABLE t31 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 BIGINT,
-f6 BLOB,
-f7 DATE,
-f8 DATETIME,
-f9 FLOAT,
-f10 INT,
-f11 LONGBLOB,
-f12 LONGTEXT,
-f13 MEDIUMBLOB,
-f14 MEDIUMINT,
-f15 MEDIUMTEXT,
-f16 REAL,
-f17 SMALLINT,
-f18 TEXT,
-f19 TIME,
-f20 TIMESTAMP,
-f21 TINYBLOB,
-f22 TINYINT,
-f23 TINYTEXT,
-f24 YEAR,
-f25 BINARY(255),
-f26 BIT(64),
-f27 CHAR(255),
-f28 DECIMAL(30,7),
-f29 DOUBLE,
-f30 ENUM ('a','b', 'c') default 'a',
-f31 FLOAT,
-f32 NUMERIC(17,9),
-f33 SET ('a', 'b', 'c') default 'b',
-f34 VARBINARY(1025),
-f35 VARCHAR(257)
-) ENGINE='InnoDB';
-
-** Alter tables on slave and drop columns **
-
-alter table t2 drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11, drop
-f12;
-alter table t3 drop f5, drop f6, drop f8, drop f10, drop f11, drop f12;
-alter table t4 drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11;
-alter table t31
-drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11,
-drop f12, drop f13, drop f14, drop f15, drop f16, drop f17, drop f18,
-drop f19, drop f20, drop f21, drop f22, drop f23, drop f24, drop f25,
-drop f26, drop f27, drop f28, drop f29, drop f30, drop f31, drop f32,
-drop f33, drop f34, drop f35;
-
-** Insert Data into Master **
-INSERT into t2 set f1=1, f2=1, f3=1, f4='first', f8='f8: medium size blob', f10='f10:
-some var char';
-INSERT into t2 values (2, 2, 2, 'second',
-2.0, 'b', 2000.0002, 'f8: medium size blob', 2000, 'f10: some var char',
-'01234567', 'c'),
-(3, 3, 3, 'third',
-3.0, 'b', 3000.0003, 'f8: medium size blob', 3000, 'f10: some var char',
-'01234567', 'c');
-Warnings:
-Warning 1264 Out of range value for column 'f9' at row 1
-Warning 1264 Out of range value for column 'f9' at row 2
-INSERT into t3 set f1=1, f2=1, f3=1, f4='first', f10='f10: some var char';
-INSERT into t4 set f1=1, f2=1, f3=1, f4='first', f7='f7: medium size blob', f10='f10:
-binary data';
-INSERT into t31 set f1=1, f2=1, f3=1, f4='first';
-INSERT into t31 set f1=1, f2=1, f3=2, f4='second',
-f9=2.2, f10='seven samurai', f28=222.222, f35='222';
-Warnings:
-Warning 1366 Incorrect integer value: 'seven samurai' for column 'f10' at row 1
-INSERT into t31 values (1, 1, 3, 'third',
-/* f5 BIGINT, */ 333333333333333333333333,
-/* f6 BLOB, */ '3333333333333333333333',
-/* f7 DATE, */ '2007-07-18',
-/* f8 DATETIME, */ "2007-07-18",
-/* f9 FLOAT, */ 3.33333333,
-/* f10 INT, */ 333333333,
-/* f11 LONGBLOB, */ '3333333333333333333',
-/* f12 LONGTEXT, */ '3333333333333333333',
-/* f13 MEDIUMBLOB, */ '3333333333333333333',
-/* f14 MEDIUMINT, */ 33,
-/* f15 MEDIUMTEXT, */ 3.3,
-/* f16 REAL, */ 3.3,
-/* f17 SMALLINT, */ 3,
-/* f18 TEXT, */ '33',
-/* f19 TIME, */ '2:59:58.999',
-/* f20 TIMESTAMP, */ 20000303000000,
-/* f21 TINYBLOB, */ '3333',
-/* f22 TINYINT, */ 3,
-/* f23 TINYTEXT, */ '3',
-/* f24 YEAR, */ 3000,
-/* f25 BINARY(255), */ 'three_33333',
-/* f26 BIT(64), */ b'011',
-/* f27 CHAR(255), */ 'three',
-/* f28 DECIMAL(30,7), */ 3.333,
-/* f29 DOUBLE, */ 3.333333333333333333333333333,
-/* f30 ENUM ('a','b','c')*/ 'c',
-/* f31 FLOAT, */ 3.0,
-/* f32 NUMERIC(17,9), */ 3.3333,
-/* f33 SET ('a','b','c'),*/ 'c',
-/*f34 VARBINARY(1025),*/ '3333 minus 3',
-/*f35 VARCHAR(257),*/ 'three times three'
- );
-Warnings:
-Warning 1264 Out of range value for column 'f5' at row 1
-Warning 1264 Out of range value for column 'f24' at row 1
-INSERT into t31 values (1, 1, 4, 'fourth',
-/* f5 BIGINT, */ 333333333333333333333333,
-/* f6 BLOB, */ '3333333333333333333333',
-/* f7 DATE, */ '2007-07-18',
-/* f8 DATETIME, */ "2007-07-18",
-/* f9 FLOAT, */ 3.33333333,
-/* f10 INT, */ 333333333,
-/* f11 LONGBLOB, */ '3333333333333333333',
-/* f12 LONGTEXT, */ '3333333333333333333',
-/* f13 MEDIUMBLOB, */ '3333333333333333333',
-/* f14 MEDIUMINT, */ 33,
-/* f15 MEDIUMTEXT, */ 3.3,
-/* f16 REAL, */ 3.3,
-/* f17 SMALLINT, */ 3,
-/* f18 TEXT, */ '33',
-/* f19 TIME, */ '2:59:58.999',
-/* f20 TIMESTAMP, */ 20000303000000,
-/* f21 TINYBLOB, */ '3333',
-/* f22 TINYINT, */ 3,
-/* f23 TINYTEXT, */ '3',
-/* f24 YEAR, */ 3000,
-/* f25 BINARY(255), */ 'three_33333',
-/* f26 BIT(64), */ b'011',
-/* f27 CHAR(255), */ 'three',
-/* f28 DECIMAL(30,7), */ 3.333,
-/* f29 DOUBLE, */ 3.333333333333333333333333333,
-/* f30 ENUM ('a','b','c')*/ 'c',
-/* f31 FLOAT, */ 3.0,
-/* f32 NUMERIC(17,9), */ 3.3333,
-/* f33 SET ('a','b','c'),*/ 'c',
-/*f34 VARBINARY(1025),*/ '3333 minus 3',
-/*f35 VARCHAR(257),*/ 'three times three'
- ),
-(1, 1, 5, 'fifth',
-/* f5 BIGINT, */ 333333333333333333333333,
-/* f6 BLOB, */ '3333333333333333333333',
-/* f7 DATE, */ '2007-07-18',
-/* f8 DATETIME, */ "2007-07-18",
-/* f9 FLOAT, */ 3.33333333,
-/* f10 INT, */ 333333333,
-/* f11 LONGBLOB, */ '3333333333333333333',
-/* f12 LONGTEXT, */ '3333333333333333333',
-/* f13 MEDIUMBLOB, */ '3333333333333333333',
-/* f14 MEDIUMINT, */ 33,
-/* f15 MEDIUMTEXT, */ 3.3,
-/* f16 REAL, */ 3.3,
-/* f17 SMALLINT, */ 3,
-/* f18 TEXT, */ '33',
-/* f19 TIME, */ '2:59:58.999',
-/* f20 TIMESTAMP, */ 20000303000000,
-/* f21 TINYBLOB, */ '3333',
-/* f22 TINYINT, */ 3,
-/* f23 TINYTEXT, */ '3',
-/* f24 YEAR, */ 3000,
-/* f25 BINARY(255), */ 'three_33333',
-/* f26 BIT(64), */ b'011',
-/* f27 CHAR(255), */ 'three',
-/* f28 DECIMAL(30,7), */ 3.333,
-/* f29 DOUBLE, */ 3.333333333333333333333333333,
-/* f30 ENUM ('a','b','c')*/ 'c',
-/* f31 FLOAT, */ 3.0,
-/* f32 NUMERIC(17,9), */ 3.3333,
-/* f33 SET ('a','b','c'),*/ 'c',
-/*f34 VARBINARY(1025),*/ '3333 minus 3',
-/*f35 VARCHAR(257),*/ 'three times three'
- ),
-(1, 1, 6, 'sixth',
-/* f5 BIGINT, */ NULL,
-/* f6 BLOB, */ '3333333333333333333333',
-/* f7 DATE, */ '2007-07-18',
-/* f8 DATETIME, */ "2007-07-18",
-/* f9 FLOAT, */ 3.33333333,
-/* f10 INT, */ 333333333,
-/* f11 LONGBLOB, */ '3333333333333333333',
-/* f12 LONGTEXT, */ '3333333333333333333',
-/* f13 MEDIUMBLOB, */ '3333333333333333333',
-/* f14 MEDIUMINT, */ 33,
-/* f15 MEDIUMTEXT, */ 3.3,
-/* f16 REAL, */ 3.3,
-/* f17 SMALLINT, */ 3,
-/* f18 TEXT, */ '33',
-/* f19 TIME, */ '2:59:58.999',
-/* f20 TIMESTAMP, */ 20000303000000,
-/* f21 TINYBLOB, */ '3333',
-/* f22 TINYINT, */ 3,
-/* f23 TINYTEXT, */ '3',
-/* f24 YEAR, */ 3000,
-/* f25 BINARY(255), */ 'three_33333',
-/* f26 BIT(64), */ b'011',
-/* f27 CHAR(255), */ 'three',
-/* f28 DECIMAL(30,7), */ 3.333,
-/* f29 DOUBLE, */ 3.333333333333333333333333333,
-/* f30 ENUM ('a','b','c')*/ 'c',
-/* f31 FLOAT, */ 3.0,
-/* f32 NUMERIC(17,9), */ 3.3333,
-/* f33 SET ('a','b','c'),*/ 'c',
-/*f34 VARBINARY(1025),*/ '3333 minus 3',
-/*f35 VARCHAR(257),*/ NULL
-);
-Warnings:
-Warning 1264 Out of range value for column 'f5' at row 1
-Warning 1264 Out of range value for column 'f24' at row 1
-Warning 1264 Out of range value for column 'f5' at row 2
-Warning 1264 Out of range value for column 'f24' at row 2
-Warning 1264 Out of range value for column 'f24' at row 3
-
-** Sync slave with master **
-** Do selects from tables **
-
-select * from t1 order by f3;
-f1 f2 f3 f4
-2 2 2 second
-3 3 3 next
-5 5 5 second
-6 6 6 next
-8 8 8 second
-9 9 9 next
-11 11 11 second
-12 12 12 next
-14 14 14 second
-15 15 15 next
-17 17 17 second
-18 18 18 next
-20 20 20 second
-21 21 21 next
-23 23 23 second
-24 24 24 next
-26 26 26 second
-27 27 27 next
-29 29 29 second
-30 30 30 next
-31 31 31 second
-32 32 32 second
-33 33 33 second
-34 34 34 second
-35 35 35 second
-36 36 36 second
-37 37 37 second
-38 38 38 second
-39 39 39 second
-40 40 40 second
-41 41 41 second
-42 42 42 second
-43 43 43 second
-44 44 44 second
-45 45 45 second
-46 46 46 second
-47 47 47 second
-48 48 48 second
-49 49 49 second
-50 50 50 second
-select * from t2 order by f1;
-f1 f2 f3 f4
-1 1 1 first
-2 2 2 second
-3 3 3 third
-select * from t3 order by f1;
-f1 f2 f3 f4
-1 1 1 first
-select * from t4 order by f1;
-f1 f2 f3 f4
-1 1 1 first
-select * from t31 order by f3;
-f1 f2 f3 f4
-1 1 1 first
-1 1 2 second
-1 1 3 third
-1 1 4 fourth
-1 1 5 fifth
-1 1 6 sixth
-
-** Do updates master **
-
-update t31 set f5=555555555555555 where f3=6;
-update t31 set f2=2 where f3=2;
-update t31 set f1=NULL where f3=1;
-update t31 set f3=NULL, f27=NULL, f35='f35 new value' where f3=3;
-Warnings:
-Warning 1048 Column 'f3' cannot be null
-
-** Delete from Master **
-
-delete from t1;
-delete from t2;
-delete from t3;
-delete from t4;
-delete from t31;
-
-** Check slave status **
-
-select * from t31;
-f1 f2 f3 f4
-show slave status;;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running Yes
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 0
-Last_Error
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 0
-Last_SQL_Error
-
-****************************************
-* columns in master at middle of table *
-* Expect: Proper error message *
-****************************************
-
-** Stop and Reset Slave **
-
-STOP SLAVE;
-RESET SLAVE;
-
-** create table slave side **
-CREATE TABLE t10 (a INT PRIMARY KEY, b BLOB, c CHAR(5)
-) ENGINE='InnoDB';
-
-** Connect to master and create table **
-
-CREATE TABLE t10 (a INT KEY, b BLOB, f DOUBLE DEFAULT '233',
-c CHAR(5), e INT DEFAULT '1')ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t10 () VALUES(1,@b1,DEFAULT,'Kyle',DEFAULT),
-(2,@b1,DEFAULT,'JOE',DEFAULT),
-(3,@b1,DEFAULT,'QA',DEFAULT);
-
-********************************************
-*** Expect slave to fail with Error 1523 ***
-********************************************
-
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1535
-Last_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 5, test.t10 has type 254
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1535
-Last_SQL_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 5, test.t10 has type 254
-SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
-START SLAVE;
-
-*** Drop t10 ***
-DROP TABLE t10;
-
-*********************************************
-* More columns in master at middle of table *
-* Expect: Proper error message *
-*********************************************
-
-*** Create t11 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t11 (a INT PRIMARY KEY, b BLOB, c VARCHAR(254)
-) ENGINE='InnoDB';
-
-*** Create t11 on Master ***
-CREATE TABLE t11 (a INT KEY, b BLOB, f TEXT,
-c CHAR(5) DEFAULT 'test', e INT DEFAULT '1')ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t11 () VALUES(1,@b1,'Testing is fun','Kyle',DEFAULT),
-(2,@b1,'Testing is cool','JOE',DEFAULT),
-(3,@b1,DEFAULT,'QA',DEFAULT);
-
-********************************************
-*** Expect slave to fail with Error 1523 ***
-********************************************
-
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1535
-Last_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 252, test.t11 has type 15
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1535
-Last_SQL_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 252, test.t11 has type 15
-SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
-START SLAVE;
-
-*** Drop t11 ***
-DROP TABLE t11;
-
-*********************************************
-* More columns in master at middle of table *
-* Expect: This one should pass blob-text *
-*********************************************
-
-*** Create t12 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t12 (a INT PRIMARY KEY, b BLOB, c BLOB
-) ENGINE='InnoDB';
-
-*** Create t12 on Master ***
-CREATE TABLE t12 (a INT KEY, b BLOB, f TEXT,
-c CHAR(5) DEFAULT 'test', e INT DEFAULT '1')ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t12 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT),
-(2,@b1,'JOE',DEFAULT,DEFAULT),
-(3,@b1,'QA',DEFAULT,DEFAULT);
-
-SELECT a,hex(b),f,c,e FROM t12 ORDER BY a;
-a hex(b) f c e
-1 62316231623162316231623162316231 Kyle test 1
-2 62316231623162316231623162316231 JOE test 1
-3 62316231623162316231623162316231 QA test 1
-
-*** Select on Slave ***
-SELECT a,hex(b),c FROM t12 ORDER BY a;
-a hex(b) c
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-3 62316231623162316231623162316231 QA
-
-*** Drop t12 ***
-DROP TABLE t12;
-
-****************************************************
-* - Alter Master adding columns at middle of table *
-* Expect: columns added *
-****************************************************
-
-
-*** Create t14 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t14 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='InnoDB';
-
-*** Create t14 on Master ***
-CREATE TABLE t14 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-ALTER TABLE t14 ADD COLUMN c2 DECIMAL(8,2) AFTER c1;
-ALTER TABLE t14 ADD COLUMN c3 TEXT AFTER c2;
-
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t14 () VALUES(1,1.00,'Replication Testing Extra Col',@b1,'Kyle',DEFAULT,DEFAULT),
-(2,2.00,'This Test Should work',@b1,'JOE',DEFAULT,DEFAULT),
-(3,3.00,'If is does not, I will open a bug',@b1,'QA',DEFAULT,DEFAULT);
-
-SELECT c1,c2,c3,hex(c4),c5,c6,c7 FROM t14 ORDER BY c1;
-c1 c2 c3 hex(c4) c5 c6 c7
-1 1.00 Replication Testing Extra Col 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 2.00 This Test Should work 62316231623162316231623162316231 JOE 1 CURRENT_TIMESTAMP
-3 3.00 If is does not, I will open a bug 62316231623162316231623162316231 QA 1 CURRENT_TIMESTAMP
-
-*** Select on Slave ****
-SELECT c1,c2,c3,hex(c4),c5 FROM t14 ORDER BY c1;
-c1 c2 c3 hex(c4) c5
-1 1.00 Replication Testing Extra Col 62316231623162316231623162316231 Kyle
-2 2.00 This Test Should work 62316231623162316231623162316231 JOE
-3 3.00 If is does not, I will open a bug 62316231623162316231623162316231 QA
-
-****************************************************
-* - Alter Master Dropping columns from the middle. *
-* Expect: columns dropped *
-****************************************************
-
-*** connect to master and drop columns ***
-ALTER TABLE t14 DROP COLUMN c2;
-ALTER TABLE t14 DROP COLUMN c7;
-
-*** Select from Master ***
-SELECT c1,c3,hex(c4),c5,c6 FROM t14 ORDER BY c1;
-c1 c3 hex(c4) c5 c6
-1 Replication Testing Extra Col 62316231623162316231623162316231 Kyle 1
-2 This Test Should work 62316231623162316231623162316231 JOE 1
-3 If is does not, I will open a bug 62316231623162316231623162316231 QA 1
-
-************
-* Bug30415 *
-************
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1091
-Last_Error Error 'Can't DROP 'c7'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t14 DROP COLUMN c7'
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1091
-Last_SQL_Error Error 'Can't DROP 'c7'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t14 DROP COLUMN c7'
-STOP SLAVE;
-RESET SLAVE;
-
-*** Drop t14 ***
-DROP TABLE t14;
-DROP TABLE t14;
-RESET MASTER;
-START SLAVE;
-
-*************************************************
-* - Alter Master adding columns at end of table *
-* Expect: Error 1054 *
-*************************************************
-
-*** Create t15 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t15 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='InnoDB';
-
-*** Create t15 on Master ***
-CREATE TABLE t15 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-ALTER TABLE t15 ADD COLUMN c2 DECIMAL(8,2) AFTER c7;
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t15 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT,3.00),
-(2,@b1,'JOE',DEFAULT,DEFAULT,3.00),
-(3,@b1,'QA',DEFAULT,DEFAULT,3.00);
-SELECT c1,hex(c4),c5,c6,c7,c2 FROM t15 ORDER BY c1;
-c1 hex(c4) c5 c6 c7 c2
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP 3.00
-2 62316231623162316231623162316231 JOE 1 CURRENT_TIMESTAMP 3.00
-3 62316231623162316231623162316231 QA 1 CURRENT_TIMESTAMP 3.00
-
-********************************************
-*** Expect slave to fail with Error 1054 ***
-********************************************
-
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1054
-Last_Error Error 'Unknown column 'c7' in 't15'' on query. Default database: 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c2 DECIMAL(8,2) AFTER c7'
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1054
-Last_SQL_Error Error 'Unknown column 'c7' in 't15'' on query. Default database: 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c2 DECIMAL(8,2) AFTER c7'
-STOP SLAVE;
-RESET SLAVE;
-
-*** Drop t15 ***
-DROP TABLE t15;
-DROP TABLE t15;
-RESET MASTER;
-START SLAVE;
-
-************************************************
-* - Create index on Master column not on slave *
-* Expect:Warning *
-************************************************
-
-*** Create t16 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t16 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='InnoDB';
-
-*** Create t16 on Master ***
-CREATE TABLE t16 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Create Index and Data Insert ***
-CREATE INDEX part_of_c6 ON t16 (c6);
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t16 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT),
-(2,@b1,'JOE',2,DEFAULT),
-(3,@b1,'QA',3,DEFAULT);
-SELECT c1,hex(c4),c5,c6,c7 FROM t16 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-3 62316231623162316231623162316231 QA 3 CURRENT_TIMESTAMP
-
-*****************
-*** BUG 30434 ***
-*****************
-
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1072
-Last_Error Error 'Key column 'c6' doesn't exist in table' on query. Default database: 'test'. Query: 'CREATE INDEX part_of_c6 ON t16 (c6)'
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1072
-Last_SQL_Error Error 'Key column 'c6' doesn't exist in table' on query. Default database: 'test'. Query: 'CREATE INDEX part_of_c6 ON t16 (c6)'
-STOP SLAVE;
-RESET SLAVE;
-
-*** Drop t16 ***
-DROP TABLE t16;
-DROP TABLE t16;
-RESET MASTER;
-START SLAVE;
-
-*****************************************************
-* - Delete rows using column on Master not on slave *
-* Expect: Rows Deleted *
-*****************************************************
-
-*** Create t17 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t17 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='InnoDB';
-
-*** Create t17 on Master ***
-CREATE TABLE t17 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t17 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT),
-(2,@b1,'JOE',2,DEFAULT),
-(3,@b1,'QA',3,DEFAULT);
-SELECT c1,hex(c4),c5,c6,c7 FROM t17 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-3 62316231623162316231623162316231 QA 3 CURRENT_TIMESTAMP
-
-** Select * from Slave **
-SELECT c1,hex(c4),c5 FROM t17 ORDER BY c1;
-c1 hex(c4) c5
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-3 62316231623162316231623162316231 QA
-
-** Delete from master **
-DELETE FROM t17 WHERE c6 = 3;
-SELECT c1,hex(c4),c5,c6,c7 FROM t17 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-
-** Check slave **
-SELECT c1,hex(c4),c5 FROM t17 ORDER BY c1;
-c1 hex(c4) c5
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-DROP TABLE t17;
-
-
-*****************************************************
-* - Update row using column on Master not on slave *
-* Expect: Rows updated *
-*****************************************************
-
-** Bug30674 **
-
-*** Create t18 on slave ***
-
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t18 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='InnoDB';
-
-*** Create t18 on Master ***
-CREATE TABLE t18 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t18 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT),
-(2,@b1,'JOE',2,DEFAULT),
-(3,@b1,'QA',3,DEFAULT);
-SELECT c1,hex(c4),c5,c6,c7 FROM t18 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-3 62316231623162316231623162316231 QA 3 CURRENT_TIMESTAMP
-
-** Select * from Slave **
-SELECT c1,hex(c4),c5 FROM t18 ORDER BY c1;
-c1 hex(c4) c5
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-3 62316231623162316231623162316231 QA
-
-** update from master **
-UPDATE t18 SET c5 = 'TEST' WHERE c6 = 3;
-SELECT c1,hex(c4),c5,c6,c7 FROM t18 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-3 62316231623162316231623162316231 TEST 3 CURRENT_TIMESTAMP
-
-** Check slave **
-SELECT c1,hex(c4),c5 FROM t18 ORDER BY c1;
-c1 hex(c4) c5
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-3 62316231623162316231623162316231 TEST
-DROP TABLE t18;
-
-
-*****************************************************
-* - Insert UUID column on Master not on slave *
-* Expect: Rows inserted *
-*****************************************************
-
-*** Create t5 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t5 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='InnoDB';
-
-*** Create t5 on Master ***
-CREATE TABLE t5 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 LONG,
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='InnoDB';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-INSERT INTO t5 () VALUES(1,@b1,'Kyle',UUID(),DEFAULT),
-(2,@b1,'JOE',UUID(),DEFAULT),
-(3,@b1,'QA',UUID(),DEFAULT);
-SELECT c1,hex(c4),c5,c6,c7 FROM t5 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 6231623162316231 Kyle UUID TIME
-2 6231623162316231 JOE UUID TIME
-3 6231623162316231 QA UUID TIME
-
-** Select * from Slave **
-SELECT c1,hex(c4),c5 FROM t5 ORDER BY c1;
-c1 hex(c4) c5
-1 6231623162316231 Kyle
-2 6231623162316231 JOE
-3 6231623162316231 QA
-DROP TABLE t5;
-
diff --git a/mysql-test/suite/rpl/r/rpl_extraColmaster_myisam.result b/mysql-test/suite/rpl/r/rpl_extraColmaster_myisam.result
index 8859a8e24e3..d53886f98ea 100644
--- a/mysql-test/suite/rpl/r/rpl_extraColmaster_myisam.result
+++ b/mysql-test/suite/rpl/r/rpl_extraColmaster_myisam.result
@@ -4,7 +4,6 @@ reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
-set binlog_format=row;
***********************************************************
***********************************************************
@@ -1145,2285 +1144,3 @@ c1 hex(c4) c5
3 6231623162316231 QA
DROP TABLE t5;
-set binlog_format=statement;
-
-***********************************************************
-***********************************************************
-***************** Start of Testing ************************
-***********************************************************
-***********************************************************
-* This test format == binlog_format STATEMENT and engine == 'MyISAM'
-***********************************************************
-***********************************************************
-
-***** Testing more columns on the Master *****
-
-CREATE TABLE t1 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 FLOAT DEFAULT '2.00',
-f6 CHAR(4) DEFAULT 'TEST',
-f7 INT DEFAULT '0',
-f8 TEXT,
-f9 LONGBLOB,
-f10 BIT(63),
-f11 VARBINARY(64))ENGINE='MyISAM';
-
-* Alter Table on Slave and drop columns f5 through f11 *
-
-alter table t1 drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11;
-
-* Insert data in Master then update and delete some rows*
-
-* Select count and 20 rows from Master *
-
-SELECT COUNT(*) FROM t1;
-COUNT(*)
-40
-
-SELECT f1,f2,f3,f4,f5,f6,f7,f8,f9,
-hex(f10),hex(f11) FROM t1 ORDER BY f3 LIMIT 20;
-f1 f2 f3 f4 f5 f6 f7 f8 f9 hex(f10) hex(f11)
-2 2 2 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-3 3 3 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-5 5 5 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-6 6 6 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-8 8 8 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-9 9 9 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-11 11 11 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-12 12 12 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-14 14 14 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-15 15 15 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-17 17 17 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-18 18 18 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-20 20 20 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-21 21 21 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-23 23 23 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-24 24 24 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-26 26 26 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-27 27 27 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-29 29 29 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-30 30 30 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-
-* Select count and 20 rows from Slave *
-
-SELECT COUNT(*) FROM t1;
-COUNT(*)
-40
-
-SELECT * FROM t1 ORDER BY f3 LIMIT 20;
-f1 f2 f3 f4
-2 2 2 second
-3 3 3 next
-5 5 5 second
-6 6 6 next
-8 8 8 second
-9 9 9 next
-11 11 11 second
-12 12 12 next
-14 14 14 second
-15 15 15 next
-17 17 17 second
-18 18 18 next
-20 20 20 second
-21 21 21 next
-23 23 23 second
-24 24 24 next
-26 26 26 second
-27 27 27 next
-29 29 29 second
-30 30 30 next
-
-* Show Slave Status *
-
-show slave status;;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running Yes
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 0
-Last_Error
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 0
-Last_SQL_Error
-
-
-***** Testing Altering table def scenario *****
-
-CREATE TABLE t2 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 DOUBLE DEFAULT '2.00',
-f6 ENUM('a', 'b', 'c') default 'a',
-f7 DECIMAL(17,9) default '1000.00',
-f8 MEDIUMBLOB,
-f9 NUMERIC(6,4) default '2000.00',
-f10 VARCHAR(1024),
-f11 BINARY(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-f12 SET('a', 'b', 'c') default 'b')
-ENGINE='MyISAM';
-Warnings:
-Warning 1264 Out of range value for column 'f9' at row 1
-
-CREATE TABLE t3 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 DOUBLE DEFAULT '2.00',
-f6 ENUM('a', 'b', 'c') default 'a',
-f8 MEDIUMBLOB,
-f10 VARCHAR(1024),
-f11 BINARY(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-f12 SET('a', 'b', 'c') default 'b')
-ENGINE='MyISAM';
-
-CREATE TABLE t4 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 DOUBLE DEFAULT '2.00',
-f6 DECIMAL(17,9) default '1000.00',
-f7 MEDIUMBLOB,
-f8 NUMERIC(6,4) default '2000.00',
-f9 VARCHAR(1024),
-f10 BINARY(20) not null default '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-f11 CHAR(255))
-ENGINE='MyISAM';
-Warnings:
-Warning 1264 Out of range value for column 'f8' at row 1
-
-CREATE TABLE t31 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 BIGINT,
-f6 BLOB,
-f7 DATE,
-f8 DATETIME,
-f9 FLOAT,
-f10 INT,
-f11 LONGBLOB,
-f12 LONGTEXT,
-f13 MEDIUMBLOB,
-f14 MEDIUMINT,
-f15 MEDIUMTEXT,
-f16 REAL,
-f17 SMALLINT,
-f18 TEXT,
-f19 TIME,
-f20 TIMESTAMP,
-f21 TINYBLOB,
-f22 TINYINT,
-f23 TINYTEXT,
-f24 YEAR,
-f25 BINARY(255),
-f26 BIT(64),
-f27 CHAR(255),
-f28 DECIMAL(30,7),
-f29 DOUBLE,
-f30 ENUM ('a','b', 'c') default 'a',
-f31 FLOAT,
-f32 NUMERIC(17,9),
-f33 SET ('a', 'b', 'c') default 'b',
-f34 VARBINARY(1025),
-f35 VARCHAR(257)
-) ENGINE='MyISAM';
-
-** Alter tables on slave and drop columns **
-
-alter table t2 drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11, drop
-f12;
-alter table t3 drop f5, drop f6, drop f8, drop f10, drop f11, drop f12;
-alter table t4 drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11;
-alter table t31
-drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11,
-drop f12, drop f13, drop f14, drop f15, drop f16, drop f17, drop f18,
-drop f19, drop f20, drop f21, drop f22, drop f23, drop f24, drop f25,
-drop f26, drop f27, drop f28, drop f29, drop f30, drop f31, drop f32,
-drop f33, drop f34, drop f35;
-
-** Insert Data into Master **
-INSERT into t2 set f1=1, f2=1, f3=1, f4='first', f8='f8: medium size blob', f10='f10:
-some var char';
-INSERT into t2 values (2, 2, 2, 'second',
-2.0, 'b', 2000.0002, 'f8: medium size blob', 2000, 'f10: some var char',
-'01234567', 'c'),
-(3, 3, 3, 'third',
-3.0, 'b', 3000.0003, 'f8: medium size blob', 3000, 'f10: some var char',
-'01234567', 'c');
-Warnings:
-Warning 1264 Out of range value for column 'f9' at row 1
-Warning 1264 Out of range value for column 'f9' at row 2
-INSERT into t3 set f1=1, f2=1, f3=1, f4='first', f10='f10: some var char';
-INSERT into t4 set f1=1, f2=1, f3=1, f4='first', f7='f7: medium size blob', f10='f10:
-binary data';
-INSERT into t31 set f1=1, f2=1, f3=1, f4='first';
-INSERT into t31 set f1=1, f2=1, f3=2, f4='second',
-f9=2.2, f10='seven samurai', f28=222.222, f35='222';
-Warnings:
-Warning 1366 Incorrect integer value: 'seven samurai' for column 'f10' at row 1
-INSERT into t31 values (1, 1, 3, 'third',
-/* f5 BIGINT, */ 333333333333333333333333,
-/* f6 BLOB, */ '3333333333333333333333',
-/* f7 DATE, */ '2007-07-18',
-/* f8 DATETIME, */ "2007-07-18",
-/* f9 FLOAT, */ 3.33333333,
-/* f10 INT, */ 333333333,
-/* f11 LONGBLOB, */ '3333333333333333333',
-/* f12 LONGTEXT, */ '3333333333333333333',
-/* f13 MEDIUMBLOB, */ '3333333333333333333',
-/* f14 MEDIUMINT, */ 33,
-/* f15 MEDIUMTEXT, */ 3.3,
-/* f16 REAL, */ 3.3,
-/* f17 SMALLINT, */ 3,
-/* f18 TEXT, */ '33',
-/* f19 TIME, */ '2:59:58.999',
-/* f20 TIMESTAMP, */ 20000303000000,
-/* f21 TINYBLOB, */ '3333',
-/* f22 TINYINT, */ 3,
-/* f23 TINYTEXT, */ '3',
-/* f24 YEAR, */ 3000,
-/* f25 BINARY(255), */ 'three_33333',
-/* f26 BIT(64), */ b'011',
-/* f27 CHAR(255), */ 'three',
-/* f28 DECIMAL(30,7), */ 3.333,
-/* f29 DOUBLE, */ 3.333333333333333333333333333,
-/* f30 ENUM ('a','b','c')*/ 'c',
-/* f31 FLOAT, */ 3.0,
-/* f32 NUMERIC(17,9), */ 3.3333,
-/* f33 SET ('a','b','c'),*/ 'c',
-/*f34 VARBINARY(1025),*/ '3333 minus 3',
-/*f35 VARCHAR(257),*/ 'three times three'
- );
-Warnings:
-Warning 1264 Out of range value for column 'f5' at row 1
-Warning 1264 Out of range value for column 'f24' at row 1
-INSERT into t31 values (1, 1, 4, 'fourth',
-/* f5 BIGINT, */ 333333333333333333333333,
-/* f6 BLOB, */ '3333333333333333333333',
-/* f7 DATE, */ '2007-07-18',
-/* f8 DATETIME, */ "2007-07-18",
-/* f9 FLOAT, */ 3.33333333,
-/* f10 INT, */ 333333333,
-/* f11 LONGBLOB, */ '3333333333333333333',
-/* f12 LONGTEXT, */ '3333333333333333333',
-/* f13 MEDIUMBLOB, */ '3333333333333333333',
-/* f14 MEDIUMINT, */ 33,
-/* f15 MEDIUMTEXT, */ 3.3,
-/* f16 REAL, */ 3.3,
-/* f17 SMALLINT, */ 3,
-/* f18 TEXT, */ '33',
-/* f19 TIME, */ '2:59:58.999',
-/* f20 TIMESTAMP, */ 20000303000000,
-/* f21 TINYBLOB, */ '3333',
-/* f22 TINYINT, */ 3,
-/* f23 TINYTEXT, */ '3',
-/* f24 YEAR, */ 3000,
-/* f25 BINARY(255), */ 'three_33333',
-/* f26 BIT(64), */ b'011',
-/* f27 CHAR(255), */ 'three',
-/* f28 DECIMAL(30,7), */ 3.333,
-/* f29 DOUBLE, */ 3.333333333333333333333333333,
-/* f30 ENUM ('a','b','c')*/ 'c',
-/* f31 FLOAT, */ 3.0,
-/* f32 NUMERIC(17,9), */ 3.3333,
-/* f33 SET ('a','b','c'),*/ 'c',
-/*f34 VARBINARY(1025),*/ '3333 minus 3',
-/*f35 VARCHAR(257),*/ 'three times three'
- ),
-(1, 1, 5, 'fifth',
-/* f5 BIGINT, */ 333333333333333333333333,
-/* f6 BLOB, */ '3333333333333333333333',
-/* f7 DATE, */ '2007-07-18',
-/* f8 DATETIME, */ "2007-07-18",
-/* f9 FLOAT, */ 3.33333333,
-/* f10 INT, */ 333333333,
-/* f11 LONGBLOB, */ '3333333333333333333',
-/* f12 LONGTEXT, */ '3333333333333333333',
-/* f13 MEDIUMBLOB, */ '3333333333333333333',
-/* f14 MEDIUMINT, */ 33,
-/* f15 MEDIUMTEXT, */ 3.3,
-/* f16 REAL, */ 3.3,
-/* f17 SMALLINT, */ 3,
-/* f18 TEXT, */ '33',
-/* f19 TIME, */ '2:59:58.999',
-/* f20 TIMESTAMP, */ 20000303000000,
-/* f21 TINYBLOB, */ '3333',
-/* f22 TINYINT, */ 3,
-/* f23 TINYTEXT, */ '3',
-/* f24 YEAR, */ 3000,
-/* f25 BINARY(255), */ 'three_33333',
-/* f26 BIT(64), */ b'011',
-/* f27 CHAR(255), */ 'three',
-/* f28 DECIMAL(30,7), */ 3.333,
-/* f29 DOUBLE, */ 3.333333333333333333333333333,
-/* f30 ENUM ('a','b','c')*/ 'c',
-/* f31 FLOAT, */ 3.0,
-/* f32 NUMERIC(17,9), */ 3.3333,
-/* f33 SET ('a','b','c'),*/ 'c',
-/*f34 VARBINARY(1025),*/ '3333 minus 3',
-/*f35 VARCHAR(257),*/ 'three times three'
- ),
-(1, 1, 6, 'sixth',
-/* f5 BIGINT, */ NULL,
-/* f6 BLOB, */ '3333333333333333333333',
-/* f7 DATE, */ '2007-07-18',
-/* f8 DATETIME, */ "2007-07-18",
-/* f9 FLOAT, */ 3.33333333,
-/* f10 INT, */ 333333333,
-/* f11 LONGBLOB, */ '3333333333333333333',
-/* f12 LONGTEXT, */ '3333333333333333333',
-/* f13 MEDIUMBLOB, */ '3333333333333333333',
-/* f14 MEDIUMINT, */ 33,
-/* f15 MEDIUMTEXT, */ 3.3,
-/* f16 REAL, */ 3.3,
-/* f17 SMALLINT, */ 3,
-/* f18 TEXT, */ '33',
-/* f19 TIME, */ '2:59:58.999',
-/* f20 TIMESTAMP, */ 20000303000000,
-/* f21 TINYBLOB, */ '3333',
-/* f22 TINYINT, */ 3,
-/* f23 TINYTEXT, */ '3',
-/* f24 YEAR, */ 3000,
-/* f25 BINARY(255), */ 'three_33333',
-/* f26 BIT(64), */ b'011',
-/* f27 CHAR(255), */ 'three',
-/* f28 DECIMAL(30,7), */ 3.333,
-/* f29 DOUBLE, */ 3.333333333333333333333333333,
-/* f30 ENUM ('a','b','c')*/ 'c',
-/* f31 FLOAT, */ 3.0,
-/* f32 NUMERIC(17,9), */ 3.3333,
-/* f33 SET ('a','b','c'),*/ 'c',
-/*f34 VARBINARY(1025),*/ '3333 minus 3',
-/*f35 VARCHAR(257),*/ NULL
-);
-Warnings:
-Warning 1264 Out of range value for column 'f5' at row 1
-Warning 1264 Out of range value for column 'f24' at row 1
-Warning 1264 Out of range value for column 'f5' at row 2
-Warning 1264 Out of range value for column 'f24' at row 2
-Warning 1264 Out of range value for column 'f24' at row 3
-
-** Sync slave with master **
-** Do selects from tables **
-
-select * from t1 order by f3;
-f1 f2 f3 f4
-2 2 2 second
-3 3 3 next
-5 5 5 second
-6 6 6 next
-8 8 8 second
-9 9 9 next
-11 11 11 second
-12 12 12 next
-14 14 14 second
-15 15 15 next
-17 17 17 second
-18 18 18 next
-20 20 20 second
-21 21 21 next
-23 23 23 second
-24 24 24 next
-26 26 26 second
-27 27 27 next
-29 29 29 second
-30 30 30 next
-31 31 31 second
-32 32 32 second
-33 33 33 second
-34 34 34 second
-35 35 35 second
-36 36 36 second
-37 37 37 second
-38 38 38 second
-39 39 39 second
-40 40 40 second
-41 41 41 second
-42 42 42 second
-43 43 43 second
-44 44 44 second
-45 45 45 second
-46 46 46 second
-47 47 47 second
-48 48 48 second
-49 49 49 second
-50 50 50 second
-select * from t2 order by f1;
-f1 f2 f3 f4
-1 1 1 first
-2 2 2 second
-3 3 3 third
-select * from t3 order by f1;
-f1 f2 f3 f4
-1 1 1 first
-select * from t4 order by f1;
-f1 f2 f3 f4
-1 1 1 first
-select * from t31 order by f3;
-f1 f2 f3 f4
-1 1 1 first
-1 1 2 second
-1 1 3 third
-1 1 4 fourth
-1 1 5 fifth
-1 1 6 sixth
-
-** Do updates master **
-
-update t31 set f5=555555555555555 where f3=6;
-update t31 set f2=2 where f3=2;
-update t31 set f1=NULL where f3=1;
-update t31 set f3=NULL, f27=NULL, f35='f35 new value' where f3=3;
-Warnings:
-Warning 1048 Column 'f3' cannot be null
-
-** Delete from Master **
-
-delete from t1;
-delete from t2;
-delete from t3;
-delete from t4;
-delete from t31;
-
-** Check slave status **
-
-select * from t31;
-f1 f2 f3 f4
-show slave status;;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running Yes
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 0
-Last_Error
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 0
-Last_SQL_Error
-
-****************************************
-* columns in master at middle of table *
-* Expect: Proper error message *
-****************************************
-
-** Stop and Reset Slave **
-
-STOP SLAVE;
-RESET SLAVE;
-
-** create table slave side **
-CREATE TABLE t10 (a INT PRIMARY KEY, b BLOB, c CHAR(5)
-) ENGINE='MyISAM';
-
-** Connect to master and create table **
-
-CREATE TABLE t10 (a INT KEY, b BLOB, f DOUBLE DEFAULT '233',
-c CHAR(5), e INT DEFAULT '1')ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t10 () VALUES(1,@b1,DEFAULT,'Kyle',DEFAULT),
-(2,@b1,DEFAULT,'JOE',DEFAULT),
-(3,@b1,DEFAULT,'QA',DEFAULT);
-
-********************************************
-*** Expect slave to fail with Error 1523 ***
-********************************************
-
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1535
-Last_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 5, test.t10 has type 254
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1535
-Last_SQL_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 5, test.t10 has type 254
-SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
-START SLAVE;
-
-*** Drop t10 ***
-DROP TABLE t10;
-
-*********************************************
-* More columns in master at middle of table *
-* Expect: Proper error message *
-*********************************************
-
-*** Create t11 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t11 (a INT PRIMARY KEY, b BLOB, c VARCHAR(254)
-) ENGINE='MyISAM';
-
-*** Create t11 on Master ***
-CREATE TABLE t11 (a INT KEY, b BLOB, f TEXT,
-c CHAR(5) DEFAULT 'test', e INT DEFAULT '1')ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t11 () VALUES(1,@b1,'Testing is fun','Kyle',DEFAULT),
-(2,@b1,'Testing is cool','JOE',DEFAULT),
-(3,@b1,DEFAULT,'QA',DEFAULT);
-
-********************************************
-*** Expect slave to fail with Error 1523 ***
-********************************************
-
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1535
-Last_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 252, test.t11 has type 15
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1535
-Last_SQL_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 252, test.t11 has type 15
-SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
-START SLAVE;
-
-*** Drop t11 ***
-DROP TABLE t11;
-
-*********************************************
-* More columns in master at middle of table *
-* Expect: This one should pass blob-text *
-*********************************************
-
-*** Create t12 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t12 (a INT PRIMARY KEY, b BLOB, c BLOB
-) ENGINE='MyISAM';
-
-*** Create t12 on Master ***
-CREATE TABLE t12 (a INT KEY, b BLOB, f TEXT,
-c CHAR(5) DEFAULT 'test', e INT DEFAULT '1')ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t12 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT),
-(2,@b1,'JOE',DEFAULT,DEFAULT),
-(3,@b1,'QA',DEFAULT,DEFAULT);
-
-SELECT a,hex(b),f,c,e FROM t12 ORDER BY a;
-a hex(b) f c e
-1 62316231623162316231623162316231 Kyle test 1
-2 62316231623162316231623162316231 JOE test 1
-3 62316231623162316231623162316231 QA test 1
-
-*** Select on Slave ***
-SELECT a,hex(b),c FROM t12 ORDER BY a;
-a hex(b) c
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-3 62316231623162316231623162316231 QA
-
-*** Drop t12 ***
-DROP TABLE t12;
-
-****************************************************
-* - Alter Master adding columns at middle of table *
-* Expect: columns added *
-****************************************************
-
-
-*** Create t14 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t14 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='MyISAM';
-
-*** Create t14 on Master ***
-CREATE TABLE t14 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-ALTER TABLE t14 ADD COLUMN c2 DECIMAL(8,2) AFTER c1;
-ALTER TABLE t14 ADD COLUMN c3 TEXT AFTER c2;
-
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t14 () VALUES(1,1.00,'Replication Testing Extra Col',@b1,'Kyle',DEFAULT,DEFAULT),
-(2,2.00,'This Test Should work',@b1,'JOE',DEFAULT,DEFAULT),
-(3,3.00,'If is does not, I will open a bug',@b1,'QA',DEFAULT,DEFAULT);
-
-SELECT c1,c2,c3,hex(c4),c5,c6,c7 FROM t14 ORDER BY c1;
-c1 c2 c3 hex(c4) c5 c6 c7
-1 1.00 Replication Testing Extra Col 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 2.00 This Test Should work 62316231623162316231623162316231 JOE 1 CURRENT_TIMESTAMP
-3 3.00 If is does not, I will open a bug 62316231623162316231623162316231 QA 1 CURRENT_TIMESTAMP
-
-*** Select on Slave ****
-SELECT c1,c2,c3,hex(c4),c5 FROM t14 ORDER BY c1;
-c1 c2 c3 hex(c4) c5
-1 1.00 Replication Testing Extra Col 62316231623162316231623162316231 Kyle
-2 2.00 This Test Should work 62316231623162316231623162316231 JOE
-3 3.00 If is does not, I will open a bug 62316231623162316231623162316231 QA
-
-****************************************************
-* - Alter Master Dropping columns from the middle. *
-* Expect: columns dropped *
-****************************************************
-
-*** connect to master and drop columns ***
-ALTER TABLE t14 DROP COLUMN c2;
-ALTER TABLE t14 DROP COLUMN c7;
-
-*** Select from Master ***
-SELECT c1,c3,hex(c4),c5,c6 FROM t14 ORDER BY c1;
-c1 c3 hex(c4) c5 c6
-1 Replication Testing Extra Col 62316231623162316231623162316231 Kyle 1
-2 This Test Should work 62316231623162316231623162316231 JOE 1
-3 If is does not, I will open a bug 62316231623162316231623162316231 QA 1
-
-************
-* Bug30415 *
-************
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1091
-Last_Error Error 'Can't DROP 'c7'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t14 DROP COLUMN c7'
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1091
-Last_SQL_Error Error 'Can't DROP 'c7'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t14 DROP COLUMN c7'
-STOP SLAVE;
-RESET SLAVE;
-
-*** Drop t14 ***
-DROP TABLE t14;
-DROP TABLE t14;
-RESET MASTER;
-START SLAVE;
-
-*************************************************
-* - Alter Master adding columns at end of table *
-* Expect: Error 1054 *
-*************************************************
-
-*** Create t15 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t15 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='MyISAM';
-
-*** Create t15 on Master ***
-CREATE TABLE t15 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-ALTER TABLE t15 ADD COLUMN c2 DECIMAL(8,2) AFTER c7;
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t15 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT,3.00),
-(2,@b1,'JOE',DEFAULT,DEFAULT,3.00),
-(3,@b1,'QA',DEFAULT,DEFAULT,3.00);
-SELECT c1,hex(c4),c5,c6,c7,c2 FROM t15 ORDER BY c1;
-c1 hex(c4) c5 c6 c7 c2
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP 3.00
-2 62316231623162316231623162316231 JOE 1 CURRENT_TIMESTAMP 3.00
-3 62316231623162316231623162316231 QA 1 CURRENT_TIMESTAMP 3.00
-
-********************************************
-*** Expect slave to fail with Error 1054 ***
-********************************************
-
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1054
-Last_Error Error 'Unknown column 'c7' in 't15'' on query. Default database: 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c2 DECIMAL(8,2) AFTER c7'
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1054
-Last_SQL_Error Error 'Unknown column 'c7' in 't15'' on query. Default database: 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c2 DECIMAL(8,2) AFTER c7'
-STOP SLAVE;
-RESET SLAVE;
-
-*** Drop t15 ***
-DROP TABLE t15;
-DROP TABLE t15;
-RESET MASTER;
-START SLAVE;
-
-************************************************
-* - Create index on Master column not on slave *
-* Expect:Warning *
-************************************************
-
-*** Create t16 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t16 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='MyISAM';
-
-*** Create t16 on Master ***
-CREATE TABLE t16 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Create Index and Data Insert ***
-CREATE INDEX part_of_c6 ON t16 (c6);
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t16 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT),
-(2,@b1,'JOE',2,DEFAULT),
-(3,@b1,'QA',3,DEFAULT);
-SELECT c1,hex(c4),c5,c6,c7 FROM t16 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-3 62316231623162316231623162316231 QA 3 CURRENT_TIMESTAMP
-
-*****************
-*** BUG 30434 ***
-*****************
-
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1072
-Last_Error Error 'Key column 'c6' doesn't exist in table' on query. Default database: 'test'. Query: 'CREATE INDEX part_of_c6 ON t16 (c6)'
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1072
-Last_SQL_Error Error 'Key column 'c6' doesn't exist in table' on query. Default database: 'test'. Query: 'CREATE INDEX part_of_c6 ON t16 (c6)'
-STOP SLAVE;
-RESET SLAVE;
-
-*** Drop t16 ***
-DROP TABLE t16;
-DROP TABLE t16;
-RESET MASTER;
-START SLAVE;
-
-*****************************************************
-* - Delete rows using column on Master not on slave *
-* Expect: Rows Deleted *
-*****************************************************
-
-*** Create t17 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t17 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='MyISAM';
-
-*** Create t17 on Master ***
-CREATE TABLE t17 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t17 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT),
-(2,@b1,'JOE',2,DEFAULT),
-(3,@b1,'QA',3,DEFAULT);
-SELECT c1,hex(c4),c5,c6,c7 FROM t17 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-3 62316231623162316231623162316231 QA 3 CURRENT_TIMESTAMP
-
-** Select * from Slave **
-SELECT c1,hex(c4),c5 FROM t17 ORDER BY c1;
-c1 hex(c4) c5
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-3 62316231623162316231623162316231 QA
-
-** Delete from master **
-DELETE FROM t17 WHERE c6 = 3;
-SELECT c1,hex(c4),c5,c6,c7 FROM t17 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-
-** Check slave **
-SELECT c1,hex(c4),c5 FROM t17 ORDER BY c1;
-c1 hex(c4) c5
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-DROP TABLE t17;
-
-
-*****************************************************
-* - Update row using column on Master not on slave *
-* Expect: Rows updated *
-*****************************************************
-
-** Bug30674 **
-
-*** Create t18 on slave ***
-
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t18 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='MyISAM';
-
-*** Create t18 on Master ***
-CREATE TABLE t18 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t18 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT),
-(2,@b1,'JOE',2,DEFAULT),
-(3,@b1,'QA',3,DEFAULT);
-SELECT c1,hex(c4),c5,c6,c7 FROM t18 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-3 62316231623162316231623162316231 QA 3 CURRENT_TIMESTAMP
-
-** Select * from Slave **
-SELECT c1,hex(c4),c5 FROM t18 ORDER BY c1;
-c1 hex(c4) c5
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-3 62316231623162316231623162316231 QA
-
-** update from master **
-UPDATE t18 SET c5 = 'TEST' WHERE c6 = 3;
-SELECT c1,hex(c4),c5,c6,c7 FROM t18 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-3 62316231623162316231623162316231 TEST 3 CURRENT_TIMESTAMP
-
-** Check slave **
-SELECT c1,hex(c4),c5 FROM t18 ORDER BY c1;
-c1 hex(c4) c5
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-3 62316231623162316231623162316231 TEST
-DROP TABLE t18;
-
-
-*****************************************************
-* - Insert UUID column on Master not on slave *
-* Expect: Rows inserted *
-*****************************************************
-
-*** Create t5 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t5 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='MyISAM';
-
-*** Create t5 on Master ***
-CREATE TABLE t5 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 LONG,
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-INSERT INTO t5 () VALUES(1,@b1,'Kyle',UUID(),DEFAULT),
-(2,@b1,'JOE',UUID(),DEFAULT),
-(3,@b1,'QA',UUID(),DEFAULT);
-SELECT c1,hex(c4),c5,c6,c7 FROM t5 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 6231623162316231 Kyle UUID TIME
-2 6231623162316231 JOE UUID TIME
-3 6231623162316231 QA UUID TIME
-
-** Select * from Slave **
-SELECT c1,hex(c4),c5 FROM t5 ORDER BY c1;
-c1 hex(c4) c5
-1 6231623162316231 Kyle
-2 6231623162316231 JOE
-3 6231623162316231 QA
-DROP TABLE t5;
-
-set binlog_format=mixed;
-
-***********************************************************
-***********************************************************
-***************** Start of Testing ************************
-***********************************************************
-***********************************************************
-* This test format == binlog_format MIXED and engine == 'MyISAM'
-***********************************************************
-***********************************************************
-
-***** Testing more columns on the Master *****
-
-CREATE TABLE t1 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 FLOAT DEFAULT '2.00',
-f6 CHAR(4) DEFAULT 'TEST',
-f7 INT DEFAULT '0',
-f8 TEXT,
-f9 LONGBLOB,
-f10 BIT(63),
-f11 VARBINARY(64))ENGINE='MyISAM';
-
-* Alter Table on Slave and drop columns f5 through f11 *
-
-alter table t1 drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11;
-
-* Insert data in Master then update and delete some rows*
-
-* Select count and 20 rows from Master *
-
-SELECT COUNT(*) FROM t1;
-COUNT(*)
-40
-
-SELECT f1,f2,f3,f4,f5,f6,f7,f8,f9,
-hex(f10),hex(f11) FROM t1 ORDER BY f3 LIMIT 20;
-f1 f2 f3 f4 f5 f6 f7 f8 f9 hex(f10) hex(f11)
-2 2 2 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-3 3 3 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-5 5 5 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-6 6 6 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-8 8 8 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-9 9 9 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-11 11 11 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-12 12 12 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-14 14 14 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-15 15 15 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-17 17 17 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-18 18 18 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-20 20 20 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-21 21 21 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-23 23 23 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-24 24 24 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-26 26 26 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-27 27 27 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-29 29 29 second 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-30 30 30 next 2 kaks 2 got stolen from the paradise very fat blob 1555 123456
-
-* Select count and 20 rows from Slave *
-
-SELECT COUNT(*) FROM t1;
-COUNT(*)
-40
-
-SELECT * FROM t1 ORDER BY f3 LIMIT 20;
-f1 f2 f3 f4
-2 2 2 second
-3 3 3 next
-5 5 5 second
-6 6 6 next
-8 8 8 second
-9 9 9 next
-11 11 11 second
-12 12 12 next
-14 14 14 second
-15 15 15 next
-17 17 17 second
-18 18 18 next
-20 20 20 second
-21 21 21 next
-23 23 23 second
-24 24 24 next
-26 26 26 second
-27 27 27 next
-29 29 29 second
-30 30 30 next
-
-* Show Slave Status *
-
-show slave status;;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running Yes
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 0
-Last_Error
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 0
-Last_SQL_Error
-
-
-***** Testing Altering table def scenario *****
-
-CREATE TABLE t2 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 DOUBLE DEFAULT '2.00',
-f6 ENUM('a', 'b', 'c') default 'a',
-f7 DECIMAL(17,9) default '1000.00',
-f8 MEDIUMBLOB,
-f9 NUMERIC(6,4) default '2000.00',
-f10 VARCHAR(1024),
-f11 BINARY(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-f12 SET('a', 'b', 'c') default 'b')
-ENGINE='MyISAM';
-Warnings:
-Warning 1264 Out of range value for column 'f9' at row 1
-
-CREATE TABLE t3 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 DOUBLE DEFAULT '2.00',
-f6 ENUM('a', 'b', 'c') default 'a',
-f8 MEDIUMBLOB,
-f10 VARCHAR(1024),
-f11 BINARY(20) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-f12 SET('a', 'b', 'c') default 'b')
-ENGINE='MyISAM';
-
-CREATE TABLE t4 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 DOUBLE DEFAULT '2.00',
-f6 DECIMAL(17,9) default '1000.00',
-f7 MEDIUMBLOB,
-f8 NUMERIC(6,4) default '2000.00',
-f9 VARCHAR(1024),
-f10 BINARY(20) not null default '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-f11 CHAR(255))
-ENGINE='MyISAM';
-Warnings:
-Warning 1264 Out of range value for column 'f8' at row 1
-
-CREATE TABLE t31 (f1 INT, f2 INT, f3 INT PRIMARY KEY, f4 CHAR(20),
-/* extra */
-f5 BIGINT,
-f6 BLOB,
-f7 DATE,
-f8 DATETIME,
-f9 FLOAT,
-f10 INT,
-f11 LONGBLOB,
-f12 LONGTEXT,
-f13 MEDIUMBLOB,
-f14 MEDIUMINT,
-f15 MEDIUMTEXT,
-f16 REAL,
-f17 SMALLINT,
-f18 TEXT,
-f19 TIME,
-f20 TIMESTAMP,
-f21 TINYBLOB,
-f22 TINYINT,
-f23 TINYTEXT,
-f24 YEAR,
-f25 BINARY(255),
-f26 BIT(64),
-f27 CHAR(255),
-f28 DECIMAL(30,7),
-f29 DOUBLE,
-f30 ENUM ('a','b', 'c') default 'a',
-f31 FLOAT,
-f32 NUMERIC(17,9),
-f33 SET ('a', 'b', 'c') default 'b',
-f34 VARBINARY(1025),
-f35 VARCHAR(257)
-) ENGINE='MyISAM';
-
-** Alter tables on slave and drop columns **
-
-alter table t2 drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11, drop
-f12;
-alter table t3 drop f5, drop f6, drop f8, drop f10, drop f11, drop f12;
-alter table t4 drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11;
-alter table t31
-drop f5, drop f6, drop f7, drop f8, drop f9, drop f10, drop f11,
-drop f12, drop f13, drop f14, drop f15, drop f16, drop f17, drop f18,
-drop f19, drop f20, drop f21, drop f22, drop f23, drop f24, drop f25,
-drop f26, drop f27, drop f28, drop f29, drop f30, drop f31, drop f32,
-drop f33, drop f34, drop f35;
-
-** Insert Data into Master **
-INSERT into t2 set f1=1, f2=1, f3=1, f4='first', f8='f8: medium size blob', f10='f10:
-some var char';
-INSERT into t2 values (2, 2, 2, 'second',
-2.0, 'b', 2000.0002, 'f8: medium size blob', 2000, 'f10: some var char',
-'01234567', 'c'),
-(3, 3, 3, 'third',
-3.0, 'b', 3000.0003, 'f8: medium size blob', 3000, 'f10: some var char',
-'01234567', 'c');
-Warnings:
-Warning 1264 Out of range value for column 'f9' at row 1
-Warning 1264 Out of range value for column 'f9' at row 2
-INSERT into t3 set f1=1, f2=1, f3=1, f4='first', f10='f10: some var char';
-INSERT into t4 set f1=1, f2=1, f3=1, f4='first', f7='f7: medium size blob', f10='f10:
-binary data';
-INSERT into t31 set f1=1, f2=1, f3=1, f4='first';
-INSERT into t31 set f1=1, f2=1, f3=2, f4='second',
-f9=2.2, f10='seven samurai', f28=222.222, f35='222';
-Warnings:
-Warning 1366 Incorrect integer value: 'seven samurai' for column 'f10' at row 1
-INSERT into t31 values (1, 1, 3, 'third',
-/* f5 BIGINT, */ 333333333333333333333333,
-/* f6 BLOB, */ '3333333333333333333333',
-/* f7 DATE, */ '2007-07-18',
-/* f8 DATETIME, */ "2007-07-18",
-/* f9 FLOAT, */ 3.33333333,
-/* f10 INT, */ 333333333,
-/* f11 LONGBLOB, */ '3333333333333333333',
-/* f12 LONGTEXT, */ '3333333333333333333',
-/* f13 MEDIUMBLOB, */ '3333333333333333333',
-/* f14 MEDIUMINT, */ 33,
-/* f15 MEDIUMTEXT, */ 3.3,
-/* f16 REAL, */ 3.3,
-/* f17 SMALLINT, */ 3,
-/* f18 TEXT, */ '33',
-/* f19 TIME, */ '2:59:58.999',
-/* f20 TIMESTAMP, */ 20000303000000,
-/* f21 TINYBLOB, */ '3333',
-/* f22 TINYINT, */ 3,
-/* f23 TINYTEXT, */ '3',
-/* f24 YEAR, */ 3000,
-/* f25 BINARY(255), */ 'three_33333',
-/* f26 BIT(64), */ b'011',
-/* f27 CHAR(255), */ 'three',
-/* f28 DECIMAL(30,7), */ 3.333,
-/* f29 DOUBLE, */ 3.333333333333333333333333333,
-/* f30 ENUM ('a','b','c')*/ 'c',
-/* f31 FLOAT, */ 3.0,
-/* f32 NUMERIC(17,9), */ 3.3333,
-/* f33 SET ('a','b','c'),*/ 'c',
-/*f34 VARBINARY(1025),*/ '3333 minus 3',
-/*f35 VARCHAR(257),*/ 'three times three'
- );
-Warnings:
-Warning 1264 Out of range value for column 'f5' at row 1
-Warning 1264 Out of range value for column 'f24' at row 1
-INSERT into t31 values (1, 1, 4, 'fourth',
-/* f5 BIGINT, */ 333333333333333333333333,
-/* f6 BLOB, */ '3333333333333333333333',
-/* f7 DATE, */ '2007-07-18',
-/* f8 DATETIME, */ "2007-07-18",
-/* f9 FLOAT, */ 3.33333333,
-/* f10 INT, */ 333333333,
-/* f11 LONGBLOB, */ '3333333333333333333',
-/* f12 LONGTEXT, */ '3333333333333333333',
-/* f13 MEDIUMBLOB, */ '3333333333333333333',
-/* f14 MEDIUMINT, */ 33,
-/* f15 MEDIUMTEXT, */ 3.3,
-/* f16 REAL, */ 3.3,
-/* f17 SMALLINT, */ 3,
-/* f18 TEXT, */ '33',
-/* f19 TIME, */ '2:59:58.999',
-/* f20 TIMESTAMP, */ 20000303000000,
-/* f21 TINYBLOB, */ '3333',
-/* f22 TINYINT, */ 3,
-/* f23 TINYTEXT, */ '3',
-/* f24 YEAR, */ 3000,
-/* f25 BINARY(255), */ 'three_33333',
-/* f26 BIT(64), */ b'011',
-/* f27 CHAR(255), */ 'three',
-/* f28 DECIMAL(30,7), */ 3.333,
-/* f29 DOUBLE, */ 3.333333333333333333333333333,
-/* f30 ENUM ('a','b','c')*/ 'c',
-/* f31 FLOAT, */ 3.0,
-/* f32 NUMERIC(17,9), */ 3.3333,
-/* f33 SET ('a','b','c'),*/ 'c',
-/*f34 VARBINARY(1025),*/ '3333 minus 3',
-/*f35 VARCHAR(257),*/ 'three times three'
- ),
-(1, 1, 5, 'fifth',
-/* f5 BIGINT, */ 333333333333333333333333,
-/* f6 BLOB, */ '3333333333333333333333',
-/* f7 DATE, */ '2007-07-18',
-/* f8 DATETIME, */ "2007-07-18",
-/* f9 FLOAT, */ 3.33333333,
-/* f10 INT, */ 333333333,
-/* f11 LONGBLOB, */ '3333333333333333333',
-/* f12 LONGTEXT, */ '3333333333333333333',
-/* f13 MEDIUMBLOB, */ '3333333333333333333',
-/* f14 MEDIUMINT, */ 33,
-/* f15 MEDIUMTEXT, */ 3.3,
-/* f16 REAL, */ 3.3,
-/* f17 SMALLINT, */ 3,
-/* f18 TEXT, */ '33',
-/* f19 TIME, */ '2:59:58.999',
-/* f20 TIMESTAMP, */ 20000303000000,
-/* f21 TINYBLOB, */ '3333',
-/* f22 TINYINT, */ 3,
-/* f23 TINYTEXT, */ '3',
-/* f24 YEAR, */ 3000,
-/* f25 BINARY(255), */ 'three_33333',
-/* f26 BIT(64), */ b'011',
-/* f27 CHAR(255), */ 'three',
-/* f28 DECIMAL(30,7), */ 3.333,
-/* f29 DOUBLE, */ 3.333333333333333333333333333,
-/* f30 ENUM ('a','b','c')*/ 'c',
-/* f31 FLOAT, */ 3.0,
-/* f32 NUMERIC(17,9), */ 3.3333,
-/* f33 SET ('a','b','c'),*/ 'c',
-/*f34 VARBINARY(1025),*/ '3333 minus 3',
-/*f35 VARCHAR(257),*/ 'three times three'
- ),
-(1, 1, 6, 'sixth',
-/* f5 BIGINT, */ NULL,
-/* f6 BLOB, */ '3333333333333333333333',
-/* f7 DATE, */ '2007-07-18',
-/* f8 DATETIME, */ "2007-07-18",
-/* f9 FLOAT, */ 3.33333333,
-/* f10 INT, */ 333333333,
-/* f11 LONGBLOB, */ '3333333333333333333',
-/* f12 LONGTEXT, */ '3333333333333333333',
-/* f13 MEDIUMBLOB, */ '3333333333333333333',
-/* f14 MEDIUMINT, */ 33,
-/* f15 MEDIUMTEXT, */ 3.3,
-/* f16 REAL, */ 3.3,
-/* f17 SMALLINT, */ 3,
-/* f18 TEXT, */ '33',
-/* f19 TIME, */ '2:59:58.999',
-/* f20 TIMESTAMP, */ 20000303000000,
-/* f21 TINYBLOB, */ '3333',
-/* f22 TINYINT, */ 3,
-/* f23 TINYTEXT, */ '3',
-/* f24 YEAR, */ 3000,
-/* f25 BINARY(255), */ 'three_33333',
-/* f26 BIT(64), */ b'011',
-/* f27 CHAR(255), */ 'three',
-/* f28 DECIMAL(30,7), */ 3.333,
-/* f29 DOUBLE, */ 3.333333333333333333333333333,
-/* f30 ENUM ('a','b','c')*/ 'c',
-/* f31 FLOAT, */ 3.0,
-/* f32 NUMERIC(17,9), */ 3.3333,
-/* f33 SET ('a','b','c'),*/ 'c',
-/*f34 VARBINARY(1025),*/ '3333 minus 3',
-/*f35 VARCHAR(257),*/ NULL
-);
-Warnings:
-Warning 1264 Out of range value for column 'f5' at row 1
-Warning 1264 Out of range value for column 'f24' at row 1
-Warning 1264 Out of range value for column 'f5' at row 2
-Warning 1264 Out of range value for column 'f24' at row 2
-Warning 1264 Out of range value for column 'f24' at row 3
-
-** Sync slave with master **
-** Do selects from tables **
-
-select * from t1 order by f3;
-f1 f2 f3 f4
-2 2 2 second
-3 3 3 next
-5 5 5 second
-6 6 6 next
-8 8 8 second
-9 9 9 next
-11 11 11 second
-12 12 12 next
-14 14 14 second
-15 15 15 next
-17 17 17 second
-18 18 18 next
-20 20 20 second
-21 21 21 next
-23 23 23 second
-24 24 24 next
-26 26 26 second
-27 27 27 next
-29 29 29 second
-30 30 30 next
-31 31 31 second
-32 32 32 second
-33 33 33 second
-34 34 34 second
-35 35 35 second
-36 36 36 second
-37 37 37 second
-38 38 38 second
-39 39 39 second
-40 40 40 second
-41 41 41 second
-42 42 42 second
-43 43 43 second
-44 44 44 second
-45 45 45 second
-46 46 46 second
-47 47 47 second
-48 48 48 second
-49 49 49 second
-50 50 50 second
-select * from t2 order by f1;
-f1 f2 f3 f4
-1 1 1 first
-2 2 2 second
-3 3 3 third
-select * from t3 order by f1;
-f1 f2 f3 f4
-1 1 1 first
-select * from t4 order by f1;
-f1 f2 f3 f4
-1 1 1 first
-select * from t31 order by f3;
-f1 f2 f3 f4
-1 1 1 first
-1 1 2 second
-1 1 3 third
-1 1 4 fourth
-1 1 5 fifth
-1 1 6 sixth
-
-** Do updates master **
-
-update t31 set f5=555555555555555 where f3=6;
-update t31 set f2=2 where f3=2;
-update t31 set f1=NULL where f3=1;
-update t31 set f3=NULL, f27=NULL, f35='f35 new value' where f3=3;
-Warnings:
-Warning 1048 Column 'f3' cannot be null
-
-** Delete from Master **
-
-delete from t1;
-delete from t2;
-delete from t3;
-delete from t4;
-delete from t31;
-
-** Check slave status **
-
-select * from t31;
-f1 f2 f3 f4
-show slave status;;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running Yes
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 0
-Last_Error
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 0
-Last_SQL_Error
-
-****************************************
-* columns in master at middle of table *
-* Expect: Proper error message *
-****************************************
-
-** Stop and Reset Slave **
-
-STOP SLAVE;
-RESET SLAVE;
-
-** create table slave side **
-CREATE TABLE t10 (a INT PRIMARY KEY, b BLOB, c CHAR(5)
-) ENGINE='MyISAM';
-
-** Connect to master and create table **
-
-CREATE TABLE t10 (a INT KEY, b BLOB, f DOUBLE DEFAULT '233',
-c CHAR(5), e INT DEFAULT '1')ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t10 () VALUES(1,@b1,DEFAULT,'Kyle',DEFAULT),
-(2,@b1,DEFAULT,'JOE',DEFAULT),
-(3,@b1,DEFAULT,'QA',DEFAULT);
-
-********************************************
-*** Expect slave to fail with Error 1523 ***
-********************************************
-
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1535
-Last_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 5, test.t10 has type 254
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1535
-Last_SQL_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 5, test.t10 has type 254
-SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
-START SLAVE;
-
-*** Drop t10 ***
-DROP TABLE t10;
-
-*********************************************
-* More columns in master at middle of table *
-* Expect: Proper error message *
-*********************************************
-
-*** Create t11 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t11 (a INT PRIMARY KEY, b BLOB, c VARCHAR(254)
-) ENGINE='MyISAM';
-
-*** Create t11 on Master ***
-CREATE TABLE t11 (a INT KEY, b BLOB, f TEXT,
-c CHAR(5) DEFAULT 'test', e INT DEFAULT '1')ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t11 () VALUES(1,@b1,'Testing is fun','Kyle',DEFAULT),
-(2,@b1,'Testing is cool','JOE',DEFAULT),
-(3,@b1,DEFAULT,'QA',DEFAULT);
-
-********************************************
-*** Expect slave to fail with Error 1523 ***
-********************************************
-
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1535
-Last_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 252, test.t11 has type 15
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1535
-Last_SQL_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 252, test.t11 has type 15
-SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
-START SLAVE;
-
-*** Drop t11 ***
-DROP TABLE t11;
-
-*********************************************
-* More columns in master at middle of table *
-* Expect: This one should pass blob-text *
-*********************************************
-
-*** Create t12 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t12 (a INT PRIMARY KEY, b BLOB, c BLOB
-) ENGINE='MyISAM';
-
-*** Create t12 on Master ***
-CREATE TABLE t12 (a INT KEY, b BLOB, f TEXT,
-c CHAR(5) DEFAULT 'test', e INT DEFAULT '1')ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t12 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT),
-(2,@b1,'JOE',DEFAULT,DEFAULT),
-(3,@b1,'QA',DEFAULT,DEFAULT);
-
-SELECT a,hex(b),f,c,e FROM t12 ORDER BY a;
-a hex(b) f c e
-1 62316231623162316231623162316231 Kyle test 1
-2 62316231623162316231623162316231 JOE test 1
-3 62316231623162316231623162316231 QA test 1
-
-*** Select on Slave ***
-SELECT a,hex(b),c FROM t12 ORDER BY a;
-a hex(b) c
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-3 62316231623162316231623162316231 QA
-
-*** Drop t12 ***
-DROP TABLE t12;
-
-****************************************************
-* - Alter Master adding columns at middle of table *
-* Expect: columns added *
-****************************************************
-
-
-*** Create t14 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t14 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='MyISAM';
-
-*** Create t14 on Master ***
-CREATE TABLE t14 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-ALTER TABLE t14 ADD COLUMN c2 DECIMAL(8,2) AFTER c1;
-ALTER TABLE t14 ADD COLUMN c3 TEXT AFTER c2;
-
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t14 () VALUES(1,1.00,'Replication Testing Extra Col',@b1,'Kyle',DEFAULT,DEFAULT),
-(2,2.00,'This Test Should work',@b1,'JOE',DEFAULT,DEFAULT),
-(3,3.00,'If is does not, I will open a bug',@b1,'QA',DEFAULT,DEFAULT);
-
-SELECT c1,c2,c3,hex(c4),c5,c6,c7 FROM t14 ORDER BY c1;
-c1 c2 c3 hex(c4) c5 c6 c7
-1 1.00 Replication Testing Extra Col 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 2.00 This Test Should work 62316231623162316231623162316231 JOE 1 CURRENT_TIMESTAMP
-3 3.00 If is does not, I will open a bug 62316231623162316231623162316231 QA 1 CURRENT_TIMESTAMP
-
-*** Select on Slave ****
-SELECT c1,c2,c3,hex(c4),c5 FROM t14 ORDER BY c1;
-c1 c2 c3 hex(c4) c5
-1 1.00 Replication Testing Extra Col 62316231623162316231623162316231 Kyle
-2 2.00 This Test Should work 62316231623162316231623162316231 JOE
-3 3.00 If is does not, I will open a bug 62316231623162316231623162316231 QA
-
-****************************************************
-* - Alter Master Dropping columns from the middle. *
-* Expect: columns dropped *
-****************************************************
-
-*** connect to master and drop columns ***
-ALTER TABLE t14 DROP COLUMN c2;
-ALTER TABLE t14 DROP COLUMN c7;
-
-*** Select from Master ***
-SELECT c1,c3,hex(c4),c5,c6 FROM t14 ORDER BY c1;
-c1 c3 hex(c4) c5 c6
-1 Replication Testing Extra Col 62316231623162316231623162316231 Kyle 1
-2 This Test Should work 62316231623162316231623162316231 JOE 1
-3 If is does not, I will open a bug 62316231623162316231623162316231 QA 1
-
-************
-* Bug30415 *
-************
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1091
-Last_Error Error 'Can't DROP 'c7'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t14 DROP COLUMN c7'
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1091
-Last_SQL_Error Error 'Can't DROP 'c7'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t14 DROP COLUMN c7'
-STOP SLAVE;
-RESET SLAVE;
-
-*** Drop t14 ***
-DROP TABLE t14;
-DROP TABLE t14;
-RESET MASTER;
-START SLAVE;
-
-*************************************************
-* - Alter Master adding columns at end of table *
-* Expect: Error 1054 *
-*************************************************
-
-*** Create t15 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t15 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='MyISAM';
-
-*** Create t15 on Master ***
-CREATE TABLE t15 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-ALTER TABLE t15 ADD COLUMN c2 DECIMAL(8,2) AFTER c7;
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t15 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT,3.00),
-(2,@b1,'JOE',DEFAULT,DEFAULT,3.00),
-(3,@b1,'QA',DEFAULT,DEFAULT,3.00);
-SELECT c1,hex(c4),c5,c6,c7,c2 FROM t15 ORDER BY c1;
-c1 hex(c4) c5 c6 c7 c2
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP 3.00
-2 62316231623162316231623162316231 JOE 1 CURRENT_TIMESTAMP 3.00
-3 62316231623162316231623162316231 QA 1 CURRENT_TIMESTAMP 3.00
-
-********************************************
-*** Expect slave to fail with Error 1054 ***
-********************************************
-
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1054
-Last_Error Error 'Unknown column 'c7' in 't15'' on query. Default database: 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c2 DECIMAL(8,2) AFTER c7'
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1054
-Last_SQL_Error Error 'Unknown column 'c7' in 't15'' on query. Default database: 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c2 DECIMAL(8,2) AFTER c7'
-STOP SLAVE;
-RESET SLAVE;
-
-*** Drop t15 ***
-DROP TABLE t15;
-DROP TABLE t15;
-RESET MASTER;
-START SLAVE;
-
-************************************************
-* - Create index on Master column not on slave *
-* Expect:Warning *
-************************************************
-
-*** Create t16 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t16 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='MyISAM';
-
-*** Create t16 on Master ***
-CREATE TABLE t16 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Create Index and Data Insert ***
-CREATE INDEX part_of_c6 ON t16 (c6);
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t16 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT),
-(2,@b1,'JOE',2,DEFAULT),
-(3,@b1,'QA',3,DEFAULT);
-SELECT c1,hex(c4),c5,c6,c7 FROM t16 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-3 62316231623162316231623162316231 QA 3 CURRENT_TIMESTAMP
-
-*****************
-*** BUG 30434 ***
-*****************
-
-SHOW SLAVE STATUS;
-Slave_IO_State #
-Master_Host 127.0.0.1
-Master_User root
-Master_Port #
-Connect_Retry 1
-Master_Log_File master-bin.000001
-Read_Master_Log_Pos #
-Relay_Log_File #
-Relay_Log_Pos #
-Relay_Master_Log_File master-bin.000001
-Slave_IO_Running Yes
-Slave_SQL_Running No
-Replicate_Do_DB
-Replicate_Ignore_DB
-Replicate_Do_Table
-Replicate_Ignore_Table
-Replicate_Wild_Do_Table
-Replicate_Wild_Ignore_Table
-Last_Errno 1072
-Last_Error Error 'Key column 'c6' doesn't exist in table' on query. Default database: 'test'. Query: 'CREATE INDEX part_of_c6 ON t16 (c6)'
-Skip_Counter 0
-Exec_Master_Log_Pos #
-Relay_Log_Space #
-Until_Condition None
-Until_Log_File
-Until_Log_Pos 0
-Master_SSL_Allowed No
-Master_SSL_CA_File
-Master_SSL_CA_Path
-Master_SSL_Cert
-Master_SSL_Cipher
-Master_SSL_Key
-Seconds_Behind_Master #
-Master_SSL_Verify_Server_Cert No
-Last_IO_Errno #
-Last_IO_Error #
-Last_SQL_Errno 1072
-Last_SQL_Error Error 'Key column 'c6' doesn't exist in table' on query. Default database: 'test'. Query: 'CREATE INDEX part_of_c6 ON t16 (c6)'
-STOP SLAVE;
-RESET SLAVE;
-
-*** Drop t16 ***
-DROP TABLE t16;
-DROP TABLE t16;
-RESET MASTER;
-START SLAVE;
-
-*****************************************************
-* - Delete rows using column on Master not on slave *
-* Expect: Rows Deleted *
-*****************************************************
-
-*** Create t17 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t17 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='MyISAM';
-
-*** Create t17 on Master ***
-CREATE TABLE t17 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t17 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT),
-(2,@b1,'JOE',2,DEFAULT),
-(3,@b1,'QA',3,DEFAULT);
-SELECT c1,hex(c4),c5,c6,c7 FROM t17 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-3 62316231623162316231623162316231 QA 3 CURRENT_TIMESTAMP
-
-** Select * from Slave **
-SELECT c1,hex(c4),c5 FROM t17 ORDER BY c1;
-c1 hex(c4) c5
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-3 62316231623162316231623162316231 QA
-
-** Delete from master **
-DELETE FROM t17 WHERE c6 = 3;
-SELECT c1,hex(c4),c5,c6,c7 FROM t17 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-
-** Check slave **
-SELECT c1,hex(c4),c5 FROM t17 ORDER BY c1;
-c1 hex(c4) c5
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-DROP TABLE t17;
-
-
-*****************************************************
-* - Update row using column on Master not on slave *
-* Expect: Rows updated *
-*****************************************************
-
-** Bug30674 **
-
-*** Create t18 on slave ***
-
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t18 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='MyISAM';
-
-*** Create t18 on Master ***
-CREATE TABLE t18 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 INT DEFAULT '1',
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-set @b1 = concat(@b1,@b1);
-INSERT INTO t18 () VALUES(1,@b1,'Kyle',DEFAULT,DEFAULT),
-(2,@b1,'JOE',2,DEFAULT),
-(3,@b1,'QA',3,DEFAULT);
-SELECT c1,hex(c4),c5,c6,c7 FROM t18 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-3 62316231623162316231623162316231 QA 3 CURRENT_TIMESTAMP
-
-** Select * from Slave **
-SELECT c1,hex(c4),c5 FROM t18 ORDER BY c1;
-c1 hex(c4) c5
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-3 62316231623162316231623162316231 QA
-
-** update from master **
-UPDATE t18 SET c5 = 'TEST' WHERE c6 = 3;
-SELECT c1,hex(c4),c5,c6,c7 FROM t18 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 62316231623162316231623162316231 Kyle 1 CURRENT_TIMESTAMP
-2 62316231623162316231623162316231 JOE 2 CURRENT_TIMESTAMP
-3 62316231623162316231623162316231 TEST 3 CURRENT_TIMESTAMP
-
-** Check slave **
-SELECT c1,hex(c4),c5 FROM t18 ORDER BY c1;
-c1 hex(c4) c5
-1 62316231623162316231623162316231 Kyle
-2 62316231623162316231623162316231 JOE
-3 62316231623162316231623162316231 TEST
-DROP TABLE t18;
-
-
-*****************************************************
-* - Insert UUID column on Master not on slave *
-* Expect: Rows inserted *
-*****************************************************
-
-*** Create t5 on slave ***
-STOP SLAVE;
-RESET SLAVE;
-CREATE TABLE t5 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5)
-) ENGINE='MyISAM';
-
-*** Create t5 on Master ***
-CREATE TABLE t5 (c1 INT KEY, c4 BLOB, c5 CHAR(5),
-c6 LONG,
-c7 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
-)ENGINE='MyISAM';
-RESET MASTER;
-
-*** Start Slave ***
-START SLAVE;
-
-*** Master Data Insert ***
-set @b1 = 'b1b1b1b1';
-INSERT INTO t5 () VALUES(1,@b1,'Kyle',UUID(),DEFAULT),
-(2,@b1,'JOE',UUID(),DEFAULT),
-(3,@b1,'QA',UUID(),DEFAULT);
-SELECT c1,hex(c4),c5,c6,c7 FROM t5 ORDER BY c1;
-c1 hex(c4) c5 c6 c7
-1 6231623162316231 Kyle UUID TIME
-2 6231623162316231 JOE UUID TIME
-3 6231623162316231 QA UUID TIME
-
-** Select * from Slave **
-SELECT c1,hex(c4),c5 FROM t5 ORDER BY c1;
-c1 hex(c4) c5
-1 6231623162316231 Kyle
-2 6231623162316231 JOE
-3 6231623162316231 QA
-DROP TABLE t5;
-
diff --git a/mysql-test/suite/rpl/r/rpl_foreign_key_innodb.result b/mysql-test/suite/rpl/r/rpl_foreign_key_innodb.result
index e7a912b75fa..960833b85d8 100644
--- a/mysql-test/suite/rpl/r/rpl_foreign_key_innodb.result
+++ b/mysql-test/suite/rpl/r/rpl_foreign_key_innodb.result
@@ -46,7 +46,6 @@ engine = INNODB;
insert into t1 set b=1;
insert into t2 set a=1, b=1;
set foreign_key_checks=0;
-set @@session.binlog_format=row;
delete from t1;
must sync w/o a problem (could not with the buggy code)
select count(*) from t1 /* must be zero */;
diff --git a/mysql-test/suite/rpl/r/rpl_idempotency.result b/mysql-test/suite/rpl/r/rpl_idempotency.result
index 3341c03db0f..fb827fd347b 100644
--- a/mysql-test/suite/rpl/r/rpl_idempotency.result
+++ b/mysql-test/suite/rpl/r/rpl_idempotency.result
@@ -6,11 +6,12 @@ drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
call mtr.add_suppression("Slave: Can\'t find record in \'t1\' Error_code: 1032");
call mtr.add_suppression("Slave: Cannot add or update a child row: a foreign key constraint fails .* Error_code: 1452");
-SET @old_slave_exec_mode= @@global.slave_exec_mode;
CREATE TABLE t1 (a INT PRIMARY KEY);
CREATE TABLE t2 (a INT);
INSERT INTO t1 VALUES (-1),(-2),(-3);
INSERT INTO t2 VALUES (-1),(-2),(-3);
+SET @old_slave_exec_mode= @@global.slave_exec_mode;
+SET @@global.slave_exec_mode= IDEMPOTENT;
DELETE FROM t1 WHERE a = -2;
DELETE FROM t2 WHERE a = -2;
DELETE FROM t1 WHERE a = -2;
@@ -72,158 +73,4 @@ a
Last_SQL_Error
0
DROP TABLE t1, t2;
-select @@global.slave_exec_mode /* must be IDEMPOTENT */;
-@@global.slave_exec_mode
-IDEMPOTENT
-create table ti1 (b int primary key) engine = innodb;
-create table ti2 (a int primary key, b int, foreign key (b) references ti1(b))
-engine = innodb;
-set foreign_key_checks=1 /* ensure the check */;
-insert into ti1 values (1),(2),(3);
-insert into ti2 set a=2, b=2;
-select * from ti1 order by b /* must be (1),(2),(3) */;
-b
-1
-2
-3
-insert into ti2 set a=1, b=1;
-select * from ti2 order by b /* must be (1,1) (2,2) */;
-a b
-1 1
-2 2
-set @save_binlog_format= @@session.binlog_format;
-set @@session.binlog_format= row;
-delete from ti1 where b=1;
-select * from ti1 order by b /* must be (2),(3) */;
-b
-2
-3
-select * from ti1 order by b /* must stays as were on master (1),(2),(3) */;
-b
-1
-2
-3
-delete from ti1 where b=3;
-insert into ti2 set a=3, b=3;
-select * from ti2 order by b /* must be (1,1),(2,2) - not inserted */;
-a b
-1 1
-2 2
-set global slave_exec_mode='IDEMPOTENT';
-set global slave_exec_mode='STRICT';
-set global slave_exec_mode='IDEMPOTENT,STRICT';
-ERROR HY000: Ambiguous slave modes combination.
-select @@global.slave_exec_mode /* must be STRICT */;
-@@global.slave_exec_mode
-STRICT
-*** foreign keys errors as above now forces to stop
-set foreign_key_checks=0;
-drop table ti2, ti1;
-create table ti1 (b int primary key) engine = innodb;
-create table ti2 (a int primary key, b int, foreign key (b) references ti1(b))
-engine = innodb;
-set foreign_key_checks=1 /* ensure the check */;
-insert into ti1 values (1),(2),(3);
-insert into ti2 set a=2, b=2;
-select * from ti1 order by b /* must be (1),(2),(3) */;
-b
-1
-2
-3
-*** conspire future problem
-insert into ti2 set a=1, b=1;
-select * from ti2 order by b /* must be (1,1) (2,2) */;
-a b
-1 1
-2 2
-delete from ti1 where b=1 /* offending delete event */;
-select * from ti1 order by b /* must be (2),(3) */;
-b
-2
-3
-*** slave must stop (Trying to delete a referenced foreing key)
-Last_SQL_Error
-1451
-select * from ti1 order by b /* must be (1),(2),(3) - not deleted */;
-b
-1
-2
-3
-set foreign_key_checks= 0;
-delete from ti2 where b=1;
-set foreign_key_checks= 1;
-set global slave_exec_mode='IDEMPOTENT';
-start slave sql_thread;
-set global slave_exec_mode='STRICT';
-*** conspire the following insert failure
-*** conspire future problem
-delete from ti1 where b=3;
-insert into ti2 set a=3, b=3 /* offending write event */;
-*** slave must stop (Trying to insert an invalid foreign key)
-Last_SQL_Error
-1452
-select * from ti2 order by b /* must be (2,2) */;
-a b
-2 2
-set foreign_key_checks= 0;
-insert into ti1 set b=3;
-set foreign_key_checks= 1;
-set global slave_exec_mode='IDEMPOTENT';
-start slave sql_thread;
-set global slave_exec_mode='STRICT';
-select * from ti2 order by b /* must be (2,2),(3,3) */;
-a b
-2 2
-3 3
-*** other errors
-*** conspiring query
-insert into ti1 set b=1;
-insert into ti1 set b=1 /* offending write event */;
-*** slave must stop (Trying to insert a dupliacte key)
-Last_SQL_Error
-1062
-set foreign_key_checks= 0;
-delete from ti1 where b=1;
-set foreign_key_checks= 1;
-set global slave_exec_mode='IDEMPOTENT';
-start slave sql_thread;
-set global slave_exec_mode='STRICT';
-CREATE TABLE t1 (a INT PRIMARY KEY);
-CREATE TABLE t2 (a INT);
-INSERT INTO t1 VALUES (-1),(-2),(-3);
-INSERT INTO t2 VALUES (-1),(-2),(-3);
-DELETE FROM t1 WHERE a = -2;
-DELETE FROM t2 WHERE a = -2;
-DELETE FROM t1 WHERE a = -2;
-*** slave must stop (Key was not found)
-Last_SQL_Error
-1032
-set global slave_exec_mode='IDEMPOTENT';
-start slave sql_thread;
-set global slave_exec_mode='STRICT';
-DELETE FROM t2 WHERE a = -2;
-*** slave must stop (Key was not found)
-Last_SQL_Error
-1032
-set global slave_exec_mode='IDEMPOTENT';
-start slave sql_thread;
-set global slave_exec_mode='STRICT';
-UPDATE t1 SET a = 1 WHERE a = -1;
-UPDATE t2 SET a = 1 WHERE a = -1;
-UPDATE t1 SET a = 1 WHERE a = -1;
-*** slave must stop (Key was not found)
-Last_SQL_Error
-1032
-set global slave_exec_mode='IDEMPOTENT';
-start slave sql_thread;
-set global slave_exec_mode='STRICT';
-UPDATE t2 SET a = 1 WHERE a = -1;
-*** slave must stop (Key was not found)
-Last_SQL_Error
-1032
-set global slave_exec_mode='IDEMPOTENT';
-start slave sql_thread;
SET @@global.slave_exec_mode= @old_slave_exec_mode;
-set @@session.binlog_format= @save_binlog_format;
-drop table t1,t2,ti2,ti1;
-*** end of tests
diff --git a/mysql-test/suite/rpl/r/rpl_found_rows.result b/mysql-test/suite/rpl/r/rpl_mix_found_rows.result
index 45a931872cf..a3bc1934a70 100644
--- a/mysql-test/suite/rpl/r/rpl_found_rows.result
+++ b/mysql-test/suite/rpl/r/rpl_mix_found_rows.result
@@ -4,8 +4,7 @@ reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
-==== 0. Setting it all up ====
-SET BINLOG_FORMAT=STATEMENT;
+==== Initialize ====
**** On Master ****
CREATE TABLE t1 (a INT);
CREATE TABLE logtbl (sect INT, test INT, count INT);
@@ -16,106 +15,12 @@ INSERT INTO t1 SELECT 2*a+3 FROM t1;
INSERT INTO t1 SELECT 2*a+3 FROM t1;
INSERT INTO t1 SELECT 2*a+3 FROM t1;
INSERT INTO t1 SELECT 2*a+3 FROM t1;
-#### 1. Using statement mode ####
-==== 1.1. Simple test ====
-SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
-a
-7
-SELECT FOUND_ROWS() INTO @a;
-INSERT INTO logtbl VALUES(1,1,@a);
-SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
-a
-1
-SELECT FOUND_ROWS() INTO @a;
-INSERT INTO logtbl VALUES(1,2,@a);
-SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
-sect test count
-1 1 183
-1 2 3
-**** On Slave ****
-SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
-sect test count
-1 1 183
-1 2 3
-==== 1.2. Stored procedure ====
-**** On Master ****
-CREATE PROCEDURE calc_and_log(sect INT, test INT) BEGIN
-DECLARE cnt INT;
-SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
-SELECT FOUND_ROWS() INTO cnt;
-INSERT INTO logtbl VALUES(sect,test,cnt);
-SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
-SELECT FOUND_ROWS() INTO cnt;
-INSERT INTO logtbl VALUES(sect,test+1,cnt);
-END $$
-CALL calc_and_log(2,1);
-a
-1
-a
-7
-CREATE PROCEDURE just_log(sect INT, test INT, found_rows INT) BEGIN
-INSERT INTO logtbl VALUES (sect,test,found_rows);
-END $$
-SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
-a
-7
-SELECT FOUND_ROWS() INTO @found_rows;
-CALL just_log(2,3,@found_rows);
-SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test;
-sect test count
-2 1 3
-2 2 183
-2 3 183
-**** On Slave ****
-SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test;
-sect test count
-2 1 3
-2 2 183
-2 3 183
-==== 1.3. Stored functions ====
-**** On Master ****
-CREATE FUNCTION log_rows(sect INT, test INT, found_rows INT)
-RETURNS INT
-BEGIN
-INSERT INTO logtbl VALUES(sect,test,found_rows);
-RETURN found_rows;
-END $$
-SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
-a
-7
-SELECT FOUND_ROWS() INTO @found_rows;
-SELECT log_rows(3,1,@found_rows), log_rows(3,2,@found_rows);
-log_rows(3,1,@found_rows) log_rows(3,2,@found_rows)
-183 183
-SELECT * FROM logtbl WHERE sect = 3 ORDER BY sect,test;
-sect test count
-3 1 183
-3 2 183
-**** On Slave ****
-SELECT * FROM logtbl WHERE sect = 3 ORDER BY sect,test;
-sect test count
-3 1 183
-3 2 183
-==== 1.9. Cleanup ====
-**** On Master ****
-DELETE FROM logtbl;
-DROP PROCEDURE just_log;
-DROP PROCEDURE calc_and_log;
-DROP FUNCTION log_rows;
-**** Resetting master and slave ****
-include/stop_slave.inc
-RESET SLAVE;
-RESET MASTER;
-include/start_slave.inc
-#### 2. Using mixed mode ####
-==== 2.1. Checking a procedure ====
+==== Checking a procedure ====
**** On Master ****
-SET BINLOG_FORMAT=MIXED;
CREATE PROCEDURE just_log(sect INT, test INT) BEGIN
INSERT INTO logtbl VALUES (sect,test,FOUND_ROWS());
END $$
**** On Master 1 ****
-SET BINLOG_FORMAT=MIXED;
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
a
7
@@ -148,7 +53,7 @@ sect test count
1 2 183
1 3 3
1 4 183
-==== 2.1. Checking a stored function ====
+==== Checking a stored function ====
**** On Master ****
CREATE FUNCTION log_rows(sect INT, test INT)
RETURNS INT
diff --git a/mysql-test/suite/rpl/r/rpl_mix_insert_delayed.result b/mysql-test/suite/rpl/r/rpl_mix_insert_delayed.result
new file mode 100644
index 00000000000..fb48172ed93
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_mix_insert_delayed.result
@@ -0,0 +1,71 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+CREATE SCHEMA IF NOT EXISTS mysqlslap;
+USE mysqlslap;
+select @@global.binlog_format;
+@@global.binlog_format
+MIXED
+CREATE TABLE t1 (id INT primary key auto_increment, name VARCHAR(64));
+FLUSH TABLE t1;
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+5000
+use mysqlslap;
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+5000
+truncate table t1;
+insert delayed into t1 values(10, "my name");
+insert delayed into t1 values(10, "is Bond"), (20, "James Bond");
+flush table t1;
+select * from t1;
+id name
+10 my name
+20 James Bond
+select * from t1;
+id name
+10 my name
+20 James Bond
+delete from t1 where id!=10;
+insert delayed into t1 values(20, "is Bond"), (10, "James Bond");
+flush table t1;
+select * from t1;
+id name
+10 my name
+20 is Bond
+select * from t1;
+id name
+10 my name
+20 is Bond
+USE test;
+DROP SCHEMA mysqlslap;
+use test;
+FLUSH LOGS;
+FLUSH LOGS;
+CREATE TABLE t1(a int, UNIQUE(a));
+INSERT DELAYED IGNORE INTO t1 VALUES(1);
+INSERT DELAYED IGNORE INTO t1 VALUES(1);
+flush table t1;
+show binlog events in 'master-bin.000002' LIMIT 2,2;
+Log_name Pos Event_type Server_id End_log_pos Info
+x x x x x BEGIN
+x x x x x table_id: # (test.t1)
+select * from t1;
+a
+1
+On slave
+show binlog events in 'slave-bin.000002' LIMIT 2,2;
+Log_name Pos Event_type Server_id End_log_pos Info
+x x x x x BEGIN
+x x x x x table_id: # (test.t1)
+select * from t1;
+a
+1
+drop table t1;
+FLUSH LOGS;
+FLUSH LOGS;
+End of 5.0 tests
diff --git a/mysql-test/suite/rpl/r/rpl_rbr_to_sbr.result b/mysql-test/suite/rpl/r/rpl_rbr_to_sbr.result
index 2e707fb62c1..75d50ed756c 100644
--- a/mysql-test/suite/rpl/r/rpl_rbr_to_sbr.result
+++ b/mysql-test/suite/rpl/r/rpl_rbr_to_sbr.result
@@ -4,12 +4,6 @@ reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
-SET @old_binlog_format= @@global.binlog_format;
-SET BINLOG_FORMAT=MIXED;
-SET GLOBAL BINLOG_FORMAT=MIXED;
-SELECT @@GLOBAL.BINLOG_FORMAT, @@SESSION.BINLOG_FORMAT;
-@@GLOBAL.BINLOG_FORMAT @@SESSION.BINLOG_FORMAT
-MIXED MIXED
**** On Master ****
CREATE TABLE t1 (a INT, b LONG);
INSERT INTO t1 VALUES (1,1), (2,2);
@@ -73,4 +67,3 @@ slave-bin.000001 # Table_map 1 # table_id: # (test.t1)
slave-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
slave-bin.000001 # Query 1 # COMMIT
DROP TABLE IF EXISTS t1;
-SET @@global.binlog_format= @old_binlog_format;
diff --git a/mysql-test/suite/rpl/r/rpl_row_idempotency.result b/mysql-test/suite/rpl/r/rpl_row_idempotency.result
new file mode 100644
index 00000000000..c2d1f3ffdd3
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_row_idempotency.result
@@ -0,0 +1,160 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+set @old_slave_exec_mode= @@global.slave_exec_mode;
+set @@global.slave_exec_mode= IDEMPOTENT;
+create table ti1 (b int primary key) engine = innodb;
+create table ti2 (a int primary key, b int, foreign key (b) references ti1(b))
+engine = innodb;
+set foreign_key_checks=1 /* ensure the check */;
+insert into ti1 values (1),(2),(3);
+insert into ti2 set a=2, b=2;
+select * from ti1 order by b /* must be (1),(2),(3) */;
+b
+1
+2
+3
+insert into ti2 set a=1, b=1;
+select * from ti2 order by b /* must be (1,1) (2,2) */;
+a b
+1 1
+2 2
+set @save_binlog_format= @@session.binlog_format;
+set @@session.binlog_format= row;
+delete from ti1 where b=1;
+select * from ti1 order by b /* must be (2),(3) */;
+b
+2
+3
+select * from ti1 order by b /* must stays as were on master (1),(2),(3) */;
+b
+1
+2
+3
+delete from ti1 where b=3;
+insert into ti2 set a=3, b=3;
+select * from ti2 order by b /* must be (1,1),(2,2) - not inserted */;
+a b
+1 1
+2 2
+set global slave_exec_mode='IDEMPOTENT';
+set global slave_exec_mode='STRICT';
+set global slave_exec_mode='IDEMPOTENT,STRICT';
+ERROR HY000: Ambiguous slave modes combination.
+select @@global.slave_exec_mode /* must be STRICT */;
+@@global.slave_exec_mode
+STRICT
+*** foreign keys errors as above now forces to stop
+set foreign_key_checks=0;
+drop table ti2, ti1;
+create table ti1 (b int primary key) engine = innodb;
+create table ti2 (a int primary key, b int, foreign key (b) references ti1(b))
+engine = innodb;
+set foreign_key_checks=1 /* ensure the check */;
+insert into ti1 values (1),(2),(3);
+insert into ti2 set a=2, b=2;
+select * from ti1 order by b /* must be (1),(2),(3) */;
+b
+1
+2
+3
+*** conspire future problem
+insert into ti2 set a=1, b=1;
+select * from ti2 order by b /* must be (1,1) (2,2) */;
+a b
+1 1
+2 2
+delete from ti1 where b=1 /* offending delete event */;
+select * from ti1 order by b /* must be (2),(3) */;
+b
+2
+3
+*** slave must stop (Trying to delete a referenced foreing key)
+Last_SQL_Error
+1451
+select * from ti1 order by b /* must be (1),(2),(3) - not deleted */;
+b
+1
+2
+3
+set foreign_key_checks= 0;
+delete from ti2 where b=1;
+set foreign_key_checks= 1;
+set global slave_exec_mode='IDEMPOTENT';
+start slave sql_thread;
+set global slave_exec_mode='STRICT';
+*** conspire the following insert failure
+*** conspire future problem
+delete from ti1 where b=3;
+insert into ti2 set a=3, b=3 /* offending write event */;
+*** slave must stop (Trying to insert an invalid foreign key)
+Last_SQL_Error
+1452
+select * from ti2 order by b /* must be (2,2) */;
+a b
+2 2
+set foreign_key_checks= 0;
+insert into ti1 set b=3;
+set foreign_key_checks= 1;
+set global slave_exec_mode='IDEMPOTENT';
+start slave sql_thread;
+set global slave_exec_mode='STRICT';
+select * from ti2 order by b /* must be (2,2),(3,3) */;
+a b
+2 2
+3 3
+*** other errors
+*** conspiring query
+insert into ti1 set b=1;
+insert into ti1 set b=1 /* offending write event */;
+*** slave must stop (Trying to insert a dupliacte key)
+Last_SQL_Error
+1062
+set foreign_key_checks= 0;
+delete from ti1 where b=1;
+set foreign_key_checks= 1;
+set global slave_exec_mode='IDEMPOTENT';
+start slave sql_thread;
+set global slave_exec_mode='STRICT';
+CREATE TABLE t1 (a INT PRIMARY KEY);
+CREATE TABLE t2 (a INT);
+INSERT INTO t1 VALUES (-1),(-2),(-3);
+INSERT INTO t2 VALUES (-1),(-2),(-3);
+DELETE FROM t1 WHERE a = -2;
+DELETE FROM t2 WHERE a = -2;
+DELETE FROM t1 WHERE a = -2;
+*** slave must stop (Key was not found)
+Last_SQL_Error
+1032
+set global slave_exec_mode='IDEMPOTENT';
+start slave sql_thread;
+set global slave_exec_mode='STRICT';
+DELETE FROM t2 WHERE a = -2;
+*** slave must stop (Key was not found)
+Last_SQL_Error
+1032
+set global slave_exec_mode='IDEMPOTENT';
+start slave sql_thread;
+set global slave_exec_mode='STRICT';
+UPDATE t1 SET a = 1 WHERE a = -1;
+UPDATE t2 SET a = 1 WHERE a = -1;
+UPDATE t1 SET a = 1 WHERE a = -1;
+*** slave must stop (Key was not found)
+Last_SQL_Error
+1032
+set global slave_exec_mode='IDEMPOTENT';
+start slave sql_thread;
+set global slave_exec_mode='STRICT';
+UPDATE t2 SET a = 1 WHERE a = -1;
+*** slave must stop (Key was not found)
+Last_SQL_Error
+1032
+set global slave_exec_mode='IDEMPOTENT';
+start slave sql_thread;
+SET @@global.slave_exec_mode= @old_slave_exec_mode;
+drop table t1,t2,ti2,ti1;
+set @@global.slave_exec_mode= @old_slave_exec_mode;
+*** end of tests
diff --git a/mysql-test/suite/rpl/r/rpl_row_insert_delayed.result b/mysql-test/suite/rpl/r/rpl_row_insert_delayed.result
index 1551d83266d..c9cb2268da7 100644
--- a/mysql-test/suite/rpl/r/rpl_row_insert_delayed.result
+++ b/mysql-test/suite/rpl/r/rpl_row_insert_delayed.result
@@ -4,8 +4,6 @@ reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
-set @old_global_binlog_format = @@global.binlog_format;
-set @@global.binlog_format = row;
CREATE SCHEMA IF NOT EXISTS mysqlslap;
USE mysqlslap;
select @@global.binlog_format;
@@ -59,4 +57,3 @@ a
1
drop table t1;
End of 5.0 tests
-set @@global.binlog_format = @old_global_binlog_format;
diff --git a/mysql-test/suite/rpl/r/rpl_stm_found_rows.result b/mysql-test/suite/rpl/r/rpl_stm_found_rows.result
new file mode 100644
index 00000000000..5252562acef
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_stm_found_rows.result
@@ -0,0 +1,110 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+==== Initialize ====
+**** On Master ****
+CREATE TABLE t1 (a INT);
+CREATE TABLE logtbl (sect INT, test INT, count INT);
+INSERT INTO t1 VALUES (1),(2),(3);
+INSERT INTO t1 SELECT 2*a+3 FROM t1;
+INSERT INTO t1 SELECT 2*a+3 FROM t1;
+INSERT INTO t1 SELECT 2*a+3 FROM t1;
+INSERT INTO t1 SELECT 2*a+3 FROM t1;
+INSERT INTO t1 SELECT 2*a+3 FROM t1;
+INSERT INTO t1 SELECT 2*a+3 FROM t1;
+==== Simple test ====
+SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
+a
+7
+SELECT FOUND_ROWS() INTO @a;
+INSERT INTO logtbl VALUES(1,1,@a);
+SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
+a
+1
+SELECT FOUND_ROWS() INTO @a;
+INSERT INTO logtbl VALUES(1,2,@a);
+SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
+sect test count
+1 1 183
+1 2 3
+**** On Slave ****
+SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
+sect test count
+1 1 183
+1 2 3
+==== Stored procedure ====
+**** On Master ****
+CREATE PROCEDURE calc_and_log(sect INT, test INT) BEGIN
+DECLARE cnt INT;
+SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
+SELECT FOUND_ROWS() INTO cnt;
+INSERT INTO logtbl VALUES(sect,test,cnt);
+SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
+SELECT FOUND_ROWS() INTO cnt;
+INSERT INTO logtbl VALUES(sect,test+1,cnt);
+END $$
+CALL calc_and_log(2,1);
+a
+1
+a
+7
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO logtbl VALUES( NAME_CONST('sect',2), NAME_CONST('test',1), NAME_CONST('cnt',3))
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO logtbl VALUES( NAME_CONST('sect',2), NAME_CONST('test',1)+1, NAME_CONST('cnt',183))
+CREATE PROCEDURE just_log(sect INT, test INT, found_rows INT) BEGIN
+INSERT INTO logtbl VALUES (sect,test,found_rows);
+END $$
+SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
+a
+7
+SELECT FOUND_ROWS() INTO @found_rows;
+CALL just_log(2,3,@found_rows);
+SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test;
+sect test count
+2 1 3
+2 2 183
+2 3 183
+**** On Slave ****
+SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test;
+sect test count
+2 1 3
+2 2 183
+2 3 183
+==== Stored functions ====
+**** On Master ****
+CREATE FUNCTION log_rows(sect INT, test INT, found_rows INT)
+RETURNS INT
+BEGIN
+INSERT INTO logtbl VALUES(sect,test,found_rows);
+RETURN found_rows;
+END $$
+SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
+a
+7
+SELECT FOUND_ROWS() INTO @found_rows;
+SELECT log_rows(3,1,@found_rows), log_rows(3,2,@found_rows);
+log_rows(3,1,@found_rows) log_rows(3,2,@found_rows)
+183 183
+SELECT * FROM logtbl WHERE sect = 3 ORDER BY sect,test;
+sect test count
+3 1 183
+3 2 183
+**** On Slave ****
+SELECT * FROM logtbl WHERE sect = 3 ORDER BY sect,test;
+sect test count
+3 1 183
+3 2 183
+==== Cleanup ====
+**** On Master ****
+DROP TABLE t1, logtbl;
+DROP PROCEDURE just_log;
+DROP PROCEDURE calc_and_log;
+DROP FUNCTION log_rows;
+**** Resetting master and slave ****
+include/stop_slave.inc
+RESET SLAVE;
+RESET MASTER;
+include/start_slave.inc
diff --git a/mysql-test/suite/rpl/r/rpl_stm_insert_delayed.result b/mysql-test/suite/rpl/r/rpl_stm_insert_delayed.result
index 5ca0ea2b780..3ed132dad61 100644
--- a/mysql-test/suite/rpl/r/rpl_stm_insert_delayed.result
+++ b/mysql-test/suite/rpl/r/rpl_stm_insert_delayed.result
@@ -4,8 +4,6 @@ reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
-set @old_global_binlog_format = @@global.binlog_format;
-set @@global.binlog_format = statement;
CREATE SCHEMA IF NOT EXISTS mysqlslap;
USE mysqlslap;
select @@global.binlog_format;
@@ -71,70 +69,3 @@ drop table t1;
FLUSH LOGS;
FLUSH LOGS;
End of 5.0 tests
-set @@global.binlog_format = mixed;
-CREATE SCHEMA IF NOT EXISTS mysqlslap;
-USE mysqlslap;
-select @@global.binlog_format;
-@@global.binlog_format
-MIXED
-CREATE TABLE t1 (id INT primary key auto_increment, name VARCHAR(64));
-FLUSH TABLE t1;
-SELECT COUNT(*) FROM t1;
-COUNT(*)
-5000
-use mysqlslap;
-SELECT COUNT(*) FROM t1;
-COUNT(*)
-5000
-truncate table t1;
-insert delayed into t1 values(10, "my name");
-insert delayed into t1 values(10, "is Bond"), (20, "James Bond");
-flush table t1;
-select * from t1;
-id name
-10 my name
-20 James Bond
-select * from t1;
-id name
-10 my name
-20 James Bond
-delete from t1 where id!=10;
-insert delayed into t1 values(20, "is Bond"), (10, "James Bond");
-flush table t1;
-select * from t1;
-id name
-10 my name
-20 is Bond
-select * from t1;
-id name
-10 my name
-20 is Bond
-USE test;
-DROP SCHEMA mysqlslap;
-use test;
-FLUSH LOGS;
-FLUSH LOGS;
-CREATE TABLE t1(a int, UNIQUE(a));
-INSERT DELAYED IGNORE INTO t1 VALUES(1);
-INSERT DELAYED IGNORE INTO t1 VALUES(1);
-flush table t1;
-show binlog events in 'master-bin.000002' LIMIT 2,2;
-Log_name Pos Event_type Server_id End_log_pos Info
-x x x x x use `test`; INSERT DELAYED IGNORE INTO t1 VALUES(1)
-x x x x x use `test`; INSERT DELAYED IGNORE INTO t1 VALUES(1)
-select * from t1;
-a
-1
-On slave
-show binlog events in 'slave-bin.000002' LIMIT 2,2;
-Log_name Pos Event_type Server_id End_log_pos Info
-x x x x x use `test`; INSERT DELAYED IGNORE INTO t1 VALUES(1)
-x x x x x use `test`; INSERT DELAYED IGNORE INTO t1 VALUES(1)
-select * from t1;
-a
-1
-drop table t1;
-FLUSH LOGS;
-FLUSH LOGS;
-End of 5.0 tests
-set @@global.binlog_format = @old_global_binlog_format;
diff --git a/mysql-test/suite/rpl/r/rpl_stm_loadfile.result b/mysql-test/suite/rpl/r/rpl_stm_loadfile.result
index ca76695f4d4..a2fc22d9951 100644
--- a/mysql-test/suite/rpl/r/rpl_stm_loadfile.result
+++ b/mysql-test/suite/rpl/r/rpl_stm_loadfile.result
@@ -10,7 +10,7 @@ CREATE TABLE test.t1 (a INT, blob_column LONGBLOB, PRIMARY KEY(a));
INSERT INTO test.t1 VALUES(1,'test');
UPDATE test.t1 SET blob_column=LOAD_FILE('../../std_data/words2.dat') WHERE a=1;
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: UPDATE test.t1 SET blob_column=LOAD_FILE('../../std_data/words2.dat') WHERE a=1
create procedure test.p1()
begin
INSERT INTO test.t1 VALUES(2,'test');
@@ -18,7 +18,8 @@ UPDATE test.t1 SET blob_column=LOAD_FILE('../../std_data/words2.dat') WHERE a=2;
end|
CALL test.p1();
Warnings:
-Note 1592 Statement may not be safe to log in statement format.
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO test.t1 VALUES(2,'test')
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: UPDATE test.t1 SET blob_column=LOAD_FILE('../../std_data/words2.dat') WHERE a=2
SELECT * FROM test.t1 ORDER BY blob_column;
a blob_column
1 abase
diff --git a/mysql-test/suite/rpl/r/rpl_temporary_errors.result b/mysql-test/suite/rpl/r/rpl_temporary_errors.result
index d14380a6369..8f4868ea125 100644
--- a/mysql-test/suite/rpl/r/rpl_temporary_errors.result
+++ b/mysql-test/suite/rpl/r/rpl_temporary_errors.result
@@ -6,7 +6,6 @@ drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
call mtr.add_suppression("Deadlock found");
**** On Master ****
-SET SESSION BINLOG_FORMAT=ROW;
CREATE TABLE t1 (a INT PRIMARY KEY, b INT);
INSERT INTO t1 VALUES (1,1), (2,2), (3,3), (4,4);
**** On Slave ****
diff --git a/mysql-test/suite/rpl/r/rpl_udf.result b/mysql-test/suite/rpl/r/rpl_udf.result
index ccf16271d01..92ffb9cffc7 100644
--- a/mysql-test/suite/rpl/r/rpl_udf.result
+++ b/mysql-test/suite/rpl/r/rpl_udf.result
@@ -4,7 +4,6 @@ reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
-set binlog_format=row;
drop table if exists t1;
"*** Test 1) Test UDFs via loadable libraries ***
"Running on the master"
@@ -156,163 +155,3 @@ affected rows: 0
"Running on the master"
DROP TABLE t1;
affected rows: 0
-set binlog_format=statement;
-drop table if exists t1;
-"*** Test 1) Test UDFs via loadable libraries ***
-"Running on the master"
-CREATE FUNCTION myfunc_double RETURNS REAL SONAME "UDF_EXAMPLE_LIB";
-affected rows: 0
-CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "UDF_EXAMPLE_LIB";
-affected rows: 0
-CREATE FUNCTION myfunc_nonexist RETURNS INTEGER SONAME "UDF_EXAMPLE_LIB";
-ERROR HY000: Can't find symbol 'myfunc_nonexist' in library
-SELECT * FROM mysql.func ORDER BY name;
-name ret dl type
-myfunc_double 1 UDF_LIB function
-myfunc_int 2 UDF_LIB function
-affected rows: 2
-"Running on the slave"
-SELECT * FROM mysql.func ORDER BY name;
-name ret dl type
-myfunc_double 1 UDF_LIB function
-myfunc_int 2 UDF_LIB function
-affected rows: 2
-"Running on the master"
-CREATE TABLE t1(sum INT, price FLOAT(24)) ENGINE=MyISAM;
-affected rows: 0
-INSERT INTO t1 VALUES(myfunc_int(100), myfunc_double(50.00));
-Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-affected rows: 1
-INSERT INTO t1 VALUES(myfunc_int(10), myfunc_double(5.00));
-Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-affected rows: 1
-INSERT INTO t1 VALUES(myfunc_int(200), myfunc_double(25.00));
-Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-affected rows: 1
-INSERT INTO t1 VALUES(myfunc_int(1), myfunc_double(500.00));
-Warnings:
-Note 1592 Statement may not be safe to log in statement format.
-affected rows: 1
-SELECT * FROM t1 ORDER BY sum;
-sum price
-1 48.5
-10 48.75
-100 48.6
-200 49
-affected rows: 4
-"Running on the slave"
-SELECT * FROM t1 ORDER BY sum;
-sum price
-1 48.5
-10 48.75
-100 48.6
-200 49
-affected rows: 4
-SELECT myfunc_int(25);
-myfunc_int(25)
-25
-affected rows: 1
-SELECT myfunc_double(75.00);
-myfunc_double(75.00)
-50.00
-affected rows: 1
-"Running on the master"
-DROP FUNCTION myfunc_double;
-affected rows: 0
-DROP FUNCTION myfunc_int;
-affected rows: 0
-SELECT * FROM mysql.func ORDER BY name;
-name ret dl type
-affected rows: 0
-"Running on the slave"
-SELECT * FROM mysql.func ORDER BY name;
-name ret dl type
-affected rows: 0
-"Running on the master"
-DROP TABLE t1;
-affected rows: 0
-"*** Test 2) Test UDFs with SQL body ***
-"Running on the master"
-CREATE FUNCTION myfuncsql_int(i INT) RETURNS INTEGER DETERMINISTIC RETURN i;
-affected rows: 0
-CREATE FUNCTION myfuncsql_double(d DOUBLE) RETURNS INTEGER DETERMINISTIC RETURN d * 2.00;
-affected rows: 0
-SELECT db, name, type, param_list, body, comment FROM mysql.proc WHERE db = 'test' AND name LIKE 'myfuncsql%' ORDER BY name;
-db name type param_list body comment
-test myfuncsql_double FUNCTION d DOUBLE RETURN d * 2.00
-test myfuncsql_int FUNCTION i INT RETURN i
-affected rows: 2
-"Running on the slave"
-SELECT db, name, type, param_list, body, comment FROM mysql.proc WHERE db = 'test' AND name LIKE 'myfuncsql%' ORDER BY name;
-db name type param_list body comment
-test myfuncsql_double FUNCTION d DOUBLE RETURN d * 2.00
-test myfuncsql_int FUNCTION i INT RETURN i
-affected rows: 2
-"Running on the master"
-CREATE TABLE t1(sum INT, price FLOAT(24)) ENGINE=MyISAM;
-affected rows: 0
-INSERT INTO t1 VALUES(myfuncsql_int(100), myfuncsql_double(50.00));
-affected rows: 1
-INSERT INTO t1 VALUES(myfuncsql_int(10), myfuncsql_double(5.00));
-affected rows: 1
-INSERT INTO t1 VALUES(myfuncsql_int(200), myfuncsql_double(25.00));
-affected rows: 1
-INSERT INTO t1 VALUES(myfuncsql_int(1), myfuncsql_double(500.00));
-affected rows: 1
-SELECT * FROM t1 ORDER BY sum;
-sum price
-1 1000
-10 10
-100 100
-200 50
-affected rows: 4
-"Running on the slave"
-SELECT * FROM t1 ORDER BY sum;
-sum price
-1 1000
-10 10
-100 100
-200 50
-affected rows: 4
-"Running on the master"
-ALTER FUNCTION myfuncsql_int COMMENT "This was altered.";
-affected rows: 0
-ALTER FUNCTION myfuncsql_double COMMENT "This was altered.";
-affected rows: 0
-SELECT db, name, type, param_list, body, comment FROM mysql.proc WHERE db = 'test' AND name LIKE 'myfuncsql%' ORDER BY name;
-db name type param_list body comment
-test myfuncsql_double FUNCTION d DOUBLE RETURN d * 2.00 This was altered.
-test myfuncsql_int FUNCTION i INT RETURN i This was altered.
-affected rows: 2
-"Running on the slave"
-SELECT db, name, type, param_list, body, comment FROM mysql.proc WHERE db = 'test' AND name LIKE 'myfuncsql%' ORDER BY name;
-db name type param_list body comment
-test myfuncsql_double FUNCTION d DOUBLE RETURN d * 2.00 This was altered.
-test myfuncsql_int FUNCTION i INT RETURN i This was altered.
-affected rows: 2
-SELECT myfuncsql_int(25);
-myfuncsql_int(25)
-25
-affected rows: 1
-SELECT myfuncsql_double(75.00);
-myfuncsql_double(75.00)
-150
-affected rows: 1
-"Running on the master"
-DROP FUNCTION myfuncsql_double;
-affected rows: 0
-DROP FUNCTION myfuncsql_int;
-affected rows: 0
-SELECT db, name, type, param_list, body, comment FROM mysql.proc WHERE db = 'test' AND name LIKE 'myfuncsql%' ORDER BY name;
-db name type param_list body comment
-affected rows: 0
-"Running on the slave"
-SELECT db, name, type, param_list, body, comment FROM mysql.proc WHERE db = 'test' AND name LIKE 'myfuncsql%' ORDER BY name;
-db name type param_list body comment
-affected rows: 0
-"Running on the master"
-DROP TABLE t1;
-affected rows: 0
diff --git a/mysql-test/suite/rpl/t/rpl_bug31076.test b/mysql-test/suite/rpl/t/rpl_bug31076.test
index 9176bafe022..8675f68c687 100644
--- a/mysql-test/suite/rpl/t/rpl_bug31076.test
+++ b/mysql-test/suite/rpl/t/rpl_bug31076.test
@@ -1,3 +1,4 @@
+source include/have_binlog_format_mixed_or_row.inc;
source include/master-slave.inc;
CREATE DATABASE track;
diff --git a/mysql-test/suite/rpl/t/rpl_events.test b/mysql-test/suite/rpl/t/rpl_events.test
index d06a3118389..19f07a7cbe7 100644
--- a/mysql-test/suite/rpl/t/rpl_events.test
+++ b/mysql-test/suite/rpl/t/rpl_events.test
@@ -1,11 +1,9 @@
##################################################################
# Author: Giuseppe #
# Date: 2006-12-20 #
-# Purpose: To test that event effects are replicated #
-# in both row based and statement based format #
+# Purpose: To test that event effects are replicated. #
##################################################################
---source include/not_embedded.inc
--source include/master-slave.inc
SET @old_event_scheduler = @@global.event_scheduler;
@@ -13,14 +11,6 @@ set global event_scheduler=1;
let $engine_type= MyISAM;
-set binlog_format=row;
-
-# Embedded server doesn't support binlogging
---source include/rpl_events.inc
-
-set binlog_format=statement;
-
-# Embedded server doesn't support binlogging
--source include/rpl_events.inc
#
diff --git a/mysql-test/suite/rpl/t/rpl_extraColmaster_innodb.test b/mysql-test/suite/rpl/t/rpl_extraColmaster_innodb.test
index 5255a9cfbad..29758366577 100644
--- a/mysql-test/suite/rpl/t/rpl_extraColmaster_innodb.test
+++ b/mysql-test/suite/rpl/t/rpl_extraColmaster_innodb.test
@@ -1,16 +1,9 @@
#############################################################
# Purpose: To test having extra columns on the master WL#3915
#############################################################
+-- source include/have_binlog_format_row.inc
-- source include/master-slave.inc
-- source include/have_innodb.inc
let $engine_type = 'InnoDB';
-
-set binlog_format=row;
--- source extra/rpl_tests/rpl_extraMaster_Col.test
-
-set binlog_format=statement;
--- source extra/rpl_tests/rpl_extraMaster_Col.test
-
-set binlog_format=mixed;
--- source extra/rpl_tests/rpl_extraMaster_Col.test
+--source extra/rpl_tests/rpl_extraMaster_Col.test
diff --git a/mysql-test/suite/rpl/t/rpl_extraColmaster_myisam.test b/mysql-test/suite/rpl/t/rpl_extraColmaster_myisam.test
index e6b41eabd0d..31529a19cfc 100644
--- a/mysql-test/suite/rpl/t/rpl_extraColmaster_myisam.test
+++ b/mysql-test/suite/rpl/t/rpl_extraColmaster_myisam.test
@@ -1,15 +1,8 @@
#############################################################
# Purpose: To test having extra columns on the master WL#3915
#############################################################
+-- source include/have_binlog_format_row.inc
-- source include/master-slave.inc
let $engine_type = 'MyISAM';
-
-set binlog_format=row;
--- source extra/rpl_tests/rpl_extraMaster_Col.test
-
-set binlog_format=statement;
--- source extra/rpl_tests/rpl_extraMaster_Col.test
-
-set binlog_format=mixed;
--- source extra/rpl_tests/rpl_extraMaster_Col.test
+--source extra/rpl_tests/rpl_extraMaster_Col.test
diff --git a/mysql-test/suite/rpl/t/rpl_idempotency-slave.opt b/mysql-test/suite/rpl/t/rpl_idempotency-slave.opt
deleted file mode 100644
index 03fc19ca6ae..00000000000
--- a/mysql-test/suite/rpl/t/rpl_idempotency-slave.opt
+++ /dev/null
@@ -1 +0,0 @@
---slave-exec-mode=IDEMPOTENT
diff --git a/mysql-test/suite/rpl/t/rpl_idempotency.test b/mysql-test/suite/rpl/t/rpl_idempotency.test
index bfd1860759e..a837d366f71 100644
--- a/mysql-test/suite/rpl/t/rpl_idempotency.test
+++ b/mysql-test/suite/rpl/t/rpl_idempotency.test
@@ -2,17 +2,11 @@
# work the same way under statement based as under row based.
source include/master-slave.inc;
-connection master;
-source include/have_innodb.inc;
-connection slave;
-source include/have_innodb.inc;
# Add suppression for expected warning(s) in slaves error log
call mtr.add_suppression("Slave: Can\'t find record in \'t1\' Error_code: 1032");
call mtr.add_suppression("Slave: Cannot add or update a child row: a foreign key constraint fails .* Error_code: 1452");
-SET @old_slave_exec_mode= @@global.slave_exec_mode;
-
connection master;
CREATE TABLE t1 (a INT PRIMARY KEY);
CREATE TABLE t2 (a INT);
@@ -20,6 +14,9 @@ INSERT INTO t1 VALUES (-1),(-2),(-3);
INSERT INTO t2 VALUES (-1),(-2),(-3);
sync_slave_with_master;
+SET @old_slave_exec_mode= @@global.slave_exec_mode;
+SET @@global.slave_exec_mode= IDEMPOTENT;
+
# A delete for a row that does not exist, the statement is
# deliberately written to be idempotent for statement-based
# replication as well. We test this towards both a table with a
@@ -57,6 +54,7 @@ disable_query_log;
eval SELECT "$last_error" AS Last_SQL_Error;
enable_query_log;
+
# BUG#19958: RBR idempotency issue for UPDATE and DELETE
# Statement-based and row-based replication have different behaviour
@@ -88,316 +86,4 @@ connection master;
DROP TABLE t1, t2;
sync_slave_with_master;
-# bug#31609 Not all RBR slave errors reported as errors
-# bug#31552 Replication breaks when deleting rows from out-of-sync table
-# without PK
-
-#
-# Idempotent applying is not default any longer.
-# The default for slave-exec-mode option and server
-# variable slave_exec_mode is 'STRICT'.
-# When 'STRICT' mode is set, the slave SQL thread will stop whenever
-# the row to change is not found. In 'IDEMPOTENT' mode, the SQL thread
-# will continue running and apply the row - replace if it's Write_rows event -
-# or skip to the next event.
-
-# the previous part of the tests was with IDEMPOTENT slave's mode.
-
-
-#
-# Other than above idempotent errors dealing with foreign keys constraint
-#
-
-select @@global.slave_exec_mode /* must be IDEMPOTENT */;
-
-connection master;
-
-create table ti1 (b int primary key) engine = innodb;
-create table ti2 (a int primary key, b int, foreign key (b) references ti1(b))
- engine = innodb;
-set foreign_key_checks=1 /* ensure the check */;
-
-insert into ti1 values (1),(2),(3);
-insert into ti2 set a=2, b=2;
-
-sync_slave_with_master;
-
-#connection slave;
-select * from ti1 order by b /* must be (1),(2),(3) */;
-insert into ti2 set a=1, b=1;
-select * from ti2 order by b /* must be (1,1) (2,2) */;
-
-connection master;
-
-# from now on checking rbr specific idempotent errors
-set @save_binlog_format= @@session.binlog_format;
-set @@session.binlog_format= row;
-delete from ti1 where b=1;
-
-select * from ti1 order by b /* must be (2),(3) */;
-
-# slave must catch up (expect some warnings in error.log)
-sync_slave_with_master;
-
-#connection slave;
-select * from ti1 order by b /* must stays as were on master (1),(2),(3) */;
-
-delete from ti1 where b=3;
-
-connection master;
-insert into ti2 set a=3, b=3;
-
-# slave must catch up (expect some warnings in error.log)
-sync_slave_with_master;
-
-#connection slave;
-select * from ti2 order by b /* must be (1,1),(2,2) - not inserted */;
-
-
-#
-# Checking the new global sys variable
-#
-
-connection slave;
-
-set global slave_exec_mode='IDEMPOTENT';
-set global slave_exec_mode='STRICT';
-
-# checking mutual exclusion for the options
---error ER_SLAVE_AMBIGOUS_EXEC_MODE
-set global slave_exec_mode='IDEMPOTENT,STRICT';
-
-select @@global.slave_exec_mode /* must be STRICT */;
-
-#
-# Checking stops.
-# In the following sections strict slave sql thread is going to
-# stop when faces an idempotent error. In order to proceed
-# the mode is temporarily switched to indempotent.
-#
-
-#
---echo *** foreign keys errors as above now forces to stop
-#
-
-connection master;
-
-set foreign_key_checks=0;
-drop table ti2, ti1;
-
-create table ti1 (b int primary key) engine = innodb;
-create table ti2 (a int primary key, b int, foreign key (b) references ti1(b))
- engine = innodb;
-set foreign_key_checks=1 /* ensure the check */;
-
-insert into ti1 values (1),(2),(3);
-insert into ti2 set a=2, b=2;
-
-sync_slave_with_master;
-
-#connection slave;
-select * from ti1 order by b /* must be (1),(2),(3) */;
---echo *** conspire future problem
-insert into ti2 set a=1, b=1;
-select * from ti2 order by b /* must be (1,1) (2,2) */;
-
-connection master;
-
-delete from ti1 where b=1 /* offending delete event */;
-select * from ti1 order by b /* must be (2),(3) */;
-
-# foreign key: row is referenced
-
---echo *** slave must stop (Trying to delete a referenced foreing key)
-connection slave;
-source include/wait_for_slave_sql_to_stop.inc;
-
-let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
-disable_query_log;
-eval SELECT "$last_error" AS Last_SQL_Error;
-enable_query_log;
-
-select * from ti1 order by b /* must be (1),(2),(3) - not deleted */;
-set foreign_key_checks= 0;
-delete from ti2 where b=1;
-set foreign_key_checks= 1;
-set global slave_exec_mode='IDEMPOTENT';
-start slave sql_thread;
-connection master;
-sync_slave_with_master;
-#connection slave;
-set global slave_exec_mode='STRICT';
-
-connection master;
-
-sync_slave_with_master;
-
-#connection slave;
---echo *** conspire the following insert failure
-# foreign key: no referenced row
-
---echo *** conspire future problem
-delete from ti1 where b=3;
-
-connection master;
-insert into ti2 set a=3, b=3 /* offending write event */;
-
---echo *** slave must stop (Trying to insert an invalid foreign key)
-connection slave;
-source include/wait_for_slave_sql_to_stop.inc;
-
-let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
-disable_query_log;
-eval SELECT "$last_error" AS Last_SQL_Error;
-enable_query_log;
-
-select * from ti2 order by b /* must be (2,2) */;
-set foreign_key_checks= 0;
-insert into ti1 set b=3;
-set foreign_key_checks= 1;
-set global slave_exec_mode='IDEMPOTENT';
-start slave sql_thread;
-connection master;
-sync_slave_with_master;
-#connection slave;
-set global slave_exec_mode='STRICT';
-
-connection master;
-
-sync_slave_with_master;
-
-select * from ti2 order by b /* must be (2,2),(3,3) */;
-
-#
---echo *** other errors
-#
-
-# dup key insert
-
-#connection slave;
---echo *** conspiring query
-insert into ti1 set b=1;
-
-connection master;
-insert into ti1 set b=1 /* offending write event */;
-
---echo *** slave must stop (Trying to insert a dupliacte key)
-connection slave;
-source include/wait_for_slave_sql_to_stop.inc;
-
-let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
-disable_query_log;
-eval SELECT "$last_error" AS Last_SQL_Error;
-enable_query_log;
-
-set foreign_key_checks= 0;
-delete from ti1 where b=1;
-set foreign_key_checks= 1;
-set global slave_exec_mode='IDEMPOTENT';
-start slave sql_thread;
-connection master;
-sync_slave_with_master;
-#connection slave;
-set global slave_exec_mode='STRICT';
-
-# key not found
-
-connection master;
-
-CREATE TABLE t1 (a INT PRIMARY KEY);
-CREATE TABLE t2 (a INT);
-INSERT INTO t1 VALUES (-1),(-2),(-3);
-INSERT INTO t2 VALUES (-1),(-2),(-3);
-sync_slave_with_master;
-
-#connection slave;
-DELETE FROM t1 WHERE a = -2;
-DELETE FROM t2 WHERE a = -2;
-connection master;
-DELETE FROM t1 WHERE a = -2;
-
---echo *** slave must stop (Key was not found)
-connection slave;
-source include/wait_for_slave_sql_to_stop.inc;
-
-let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
-disable_query_log;
-eval SELECT "$last_error" AS Last_SQL_Error;
-enable_query_log;
-
-set global slave_exec_mode='IDEMPOTENT';
-start slave sql_thread;
-connection master;
-sync_slave_with_master;
-#connection slave;
-set global slave_exec_mode='STRICT';
-
-connection master;
-DELETE FROM t2 WHERE a = -2;
---echo *** slave must stop (Key was not found)
-connection slave;
-source include/wait_for_slave_sql_to_stop.inc;
-
-let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
-disable_query_log;
-eval SELECT "$last_error" AS Last_SQL_Error;
-enable_query_log;
-
-set global slave_exec_mode='IDEMPOTENT';
-start slave sql_thread;
-connection master;
-sync_slave_with_master;
-#connection slave;
-set global slave_exec_mode='STRICT';
-
-UPDATE t1 SET a = 1 WHERE a = -1;
-UPDATE t2 SET a = 1 WHERE a = -1;
-
-connection master;
-UPDATE t1 SET a = 1 WHERE a = -1;
-
---echo *** slave must stop (Key was not found)
-connection slave;
-source include/wait_for_slave_sql_to_stop.inc;
-
-let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
-disable_query_log;
-eval SELECT "$last_error" AS Last_SQL_Error;
-enable_query_log;
-
-set global slave_exec_mode='IDEMPOTENT';
-start slave sql_thread;
-connection master;
-sync_slave_with_master;
-#connection slave;
-set global slave_exec_mode='STRICT';
-
-
-connection master;
-UPDATE t2 SET a = 1 WHERE a = -1;
-
---echo *** slave must stop (Key was not found)
-connection slave;
-source include/wait_for_slave_sql_to_stop.inc;
-
-let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
-disable_query_log;
-eval SELECT "$last_error" AS Last_SQL_Error;
-enable_query_log;
-
-set global slave_exec_mode='IDEMPOTENT';
-start slave sql_thread;
-connection master;
-sync_slave_with_master;
-#connection slave;
SET @@global.slave_exec_mode= @old_slave_exec_mode;
-
-# cleanup for bug#31609 tests
-
-connection master;
-set @@session.binlog_format= @save_binlog_format;
-drop table t1,t2,ti2,ti1;
-
---source include/master-slave-end.inc
-
---echo *** end of tests
diff --git a/mysql-test/suite/rpl/t/rpl_found_rows.test b/mysql-test/suite/rpl/t/rpl_mix_found_rows.test
index ff8d2c3107a..30342126d24 100644
--- a/mysql-test/suite/rpl/t/rpl_found_rows.test
+++ b/mysql-test/suite/rpl/t/rpl_mix_found_rows.test
@@ -1,16 +1,7 @@
source include/master-slave.inc;
+source include/have_binlog_format_mixed.inc;
-# It is not possible to replicate FOUND_ROWS() using statement-based
-# replication, but there is a workaround that stores the result of
-# FOUND_ROWS() into a user variable and then replicates this instead.
-
-# The purpose of this test case is to test that the workaround
-# function properly even when inside stored programs (i.e., stored
-# routines and triggers).
-
---echo ==== 0. Setting it all up ====
-
-SET BINLOG_FORMAT=STATEMENT;
+--echo ==== Initialize ====
--echo **** On Master ****
connection master;
@@ -25,106 +16,10 @@ INSERT INTO t1 SELECT 2*a+3 FROM t1;
INSERT INTO t1 SELECT 2*a+3 FROM t1;
INSERT INTO t1 SELECT 2*a+3 FROM t1;
---echo #### 1. Using statement mode ####
-
---echo ==== 1.1. Simple test ====
-
-SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
-
-# Instead of
-# INSERT INTO logtbl VALUES(1, 1, FOUND_ROWS());
-# we write
-SELECT FOUND_ROWS() INTO @a;
-INSERT INTO logtbl VALUES(1,1,@a);
-
-SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
-# Instead of
-# INSERT INTO logtbl VALUES(1, 2, FOUND_ROWS());
-# we write
-SELECT FOUND_ROWS() INTO @a;
-INSERT INTO logtbl VALUES(1,2,@a);
-
-SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
---echo **** On Slave ****
-sync_slave_with_master;
-SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
-
---echo ==== 1.2. Stored procedure ====
-
-# Here we do both the calculation and the logging. We also do it twice
-# to make sure that there are no limitations on how many times it can
-# be used.
-
---echo **** On Master ****
-connection master;
---delimiter $$
-CREATE PROCEDURE calc_and_log(sect INT, test INT) BEGIN
- DECLARE cnt INT;
- SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
- SELECT FOUND_ROWS() INTO cnt;
- INSERT INTO logtbl VALUES(sect,test,cnt);
- SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
- SELECT FOUND_ROWS() INTO cnt;
- INSERT INTO logtbl VALUES(sect,test+1,cnt);
-END $$
---delimiter ;
-
-CALL calc_and_log(2,1);
-
---delimiter $$
-CREATE PROCEDURE just_log(sect INT, test INT, found_rows INT) BEGIN
- INSERT INTO logtbl VALUES (sect,test,found_rows);
-END $$
---delimiter ;
-
-SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
-SELECT FOUND_ROWS() INTO @found_rows;
-CALL just_log(2,3,@found_rows);
-
-SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test;
---echo **** On Slave ****
-sync_slave_with_master;
-SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test;
-
---echo ==== 1.3. Stored functions ====
---echo **** On Master ****
-connection master;
---delimiter $$
-CREATE FUNCTION log_rows(sect INT, test INT, found_rows INT)
- RETURNS INT
-BEGIN
- INSERT INTO logtbl VALUES(sect,test,found_rows);
- RETURN found_rows;
-END $$
---delimiter ;
-
-SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
-SELECT FOUND_ROWS() INTO @found_rows;
-SELECT log_rows(3,1,@found_rows), log_rows(3,2,@found_rows);
-
-SELECT * FROM logtbl WHERE sect = 3 ORDER BY sect,test;
---echo **** On Slave ****
-sync_slave_with_master;
-SELECT * FROM logtbl WHERE sect = 3 ORDER BY sect,test;
-
---echo ==== 1.9. Cleanup ====
---echo **** On Master ****
-connection master;
-DELETE FROM logtbl;
-DROP PROCEDURE just_log;
-DROP PROCEDURE calc_and_log;
-DROP FUNCTION log_rows;
-sync_slave_with_master;
-
-source include/reset_master_and_slave.inc;
-
---echo #### 2. Using mixed mode ####
-
---echo ==== 2.1. Checking a procedure ====
+--echo ==== Checking a procedure ====
--echo **** On Master ****
connection master;
-SET BINLOG_FORMAT=MIXED;
# We will now check some stuff that will not work in statement-based
# replication, but which should cause the binary log to switch to
@@ -139,7 +34,6 @@ sync_slave_with_master;
--echo **** On Master 1 ****
connection master1;
-SET BINLOG_FORMAT=MIXED;
SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
CALL just_log(1,1);
@@ -167,7 +61,7 @@ SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
sync_slave_with_master;
SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
---echo ==== 2.1. Checking a stored function ====
+--echo ==== Checking a stored function ====
--echo **** On Master ****
connection master;
--delimiter $$
diff --git a/mysql-test/suite/rpl/t/rpl_mix_insert_delayed.test b/mysql-test/suite/rpl/t/rpl_mix_insert_delayed.test
new file mode 100644
index 00000000000..2c44829a649
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_mix_insert_delayed.test
@@ -0,0 +1,5 @@
+--source include/have_binlog_format_mixed.inc
+--source include/master-slave.inc
+--source include/not_embedded.inc
+--source include/not_windows.inc
+--source extra/rpl_tests/rpl_insert_delayed.test
diff --git a/mysql-test/suite/rpl/t/rpl_rbr_to_sbr.test b/mysql-test/suite/rpl/t/rpl_rbr_to_sbr.test
index 8863c9d4ac7..1c489894c0f 100644
--- a/mysql-test/suite/rpl/t/rpl_rbr_to_sbr.test
+++ b/mysql-test/suite/rpl/t/rpl_rbr_to_sbr.test
@@ -1,15 +1,9 @@
--- source include/have_binlog_format_mixed_or_statement.inc
+-- source include/have_binlog_format_mixed.inc
-- source include/not_ndb_default.inc
-- source include/master-slave.inc
-# Test that the slave temporarily switches to ROW when seeing binrow
-# events when it is in STATEMENT or MIXED mode
-
-SET @old_binlog_format= @@global.binlog_format;
-
-SET BINLOG_FORMAT=MIXED;
-SET GLOBAL BINLOG_FORMAT=MIXED;
-SELECT @@GLOBAL.BINLOG_FORMAT, @@SESSION.BINLOG_FORMAT;
+# Test that the slave temporarily switches to ROW when seeing row
+# events when it is in MIXED mode
--echo **** On Master ****
CREATE TABLE t1 (a INT, b LONG);
@@ -35,7 +29,6 @@ SHOW BINLOG EVENTS;
connection master;
DROP TABLE IF EXISTS t1;
-SET @@global.binlog_format= @old_binlog_format;
# Let's compare. Note: If they match test will pass, if they do not match
# the test will show that the diff statement failed and not reject file
diff --git a/mysql-test/suite/rpl/t/rpl_row_idempotency.test b/mysql-test/suite/rpl/t/rpl_row_idempotency.test
new file mode 100644
index 00000000000..35e74b80e92
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_row_idempotency.test
@@ -0,0 +1,325 @@
+# Testing various forms of idempotency for replication. This file is
+# for tests that should only be executed in row mode.
+
+source include/have_binlog_format_row.inc;
+source include/master-slave.inc;
+connection master;
+source include/have_innodb.inc;
+connection slave;
+source include/have_innodb.inc;
+
+# bug#31609 Not all RBR slave errors reported as errors
+# bug#31552 Replication breaks when deleting rows from out-of-sync table
+# without PK
+
+# The default for slave-exec-mode option and server
+# variable slave_exec_mode is 'STRICT'.
+# When 'STRICT' mode is set, the slave SQL thread will stop whenever
+# the row to change is not found. In 'IDEMPOTENT' mode, the SQL thread
+# will continue running and apply the row - replace if it's Write_rows event -
+# or skip to the next event.
+
+# the previous part of the tests was with IDEMPOTENT slave's mode.
+
+
+#
+# Other than above idempotent errors dealing with foreign keys constraint
+#
+connection slave;
+
+set @old_slave_exec_mode= @@global.slave_exec_mode;
+set @@global.slave_exec_mode= IDEMPOTENT;
+
+connection master;
+
+create table ti1 (b int primary key) engine = innodb;
+create table ti2 (a int primary key, b int, foreign key (b) references ti1(b))
+ engine = innodb;
+set foreign_key_checks=1 /* ensure the check */;
+
+insert into ti1 values (1),(2),(3);
+insert into ti2 set a=2, b=2;
+
+sync_slave_with_master;
+
+#connection slave;
+select * from ti1 order by b /* must be (1),(2),(3) */;
+insert into ti2 set a=1, b=1;
+select * from ti2 order by b /* must be (1,1) (2,2) */;
+
+connection master;
+
+# from now on checking rbr specific idempotent errors
+set @save_binlog_format= @@session.binlog_format;
+set @@session.binlog_format= row;
+delete from ti1 where b=1;
+
+select * from ti1 order by b /* must be (2),(3) */;
+
+# slave must catch up (expect some warnings in error.log)
+sync_slave_with_master;
+
+#connection slave;
+select * from ti1 order by b /* must stays as were on master (1),(2),(3) */;
+
+delete from ti1 where b=3;
+
+connection master;
+insert into ti2 set a=3, b=3;
+
+# slave must catch up (expect some warnings in error.log)
+sync_slave_with_master;
+
+#connection slave;
+select * from ti2 order by b /* must be (1,1),(2,2) - not inserted */;
+
+
+#
+# Checking the new global sys variable
+#
+
+connection slave;
+
+set global slave_exec_mode='IDEMPOTENT';
+set global slave_exec_mode='STRICT';
+
+# checking mutual exclusion for the options
+--error ER_SLAVE_AMBIGOUS_EXEC_MODE
+set global slave_exec_mode='IDEMPOTENT,STRICT';
+
+select @@global.slave_exec_mode /* must be STRICT */;
+
+#
+# Checking stops.
+# In the following sections strict slave sql thread is going to
+# stop when faces an idempotent error. In order to proceed
+# the mode is temporarily switched to indempotent.
+#
+
+#
+--echo *** foreign keys errors as above now forces to stop
+#
+
+connection master;
+
+set foreign_key_checks=0;
+drop table ti2, ti1;
+
+create table ti1 (b int primary key) engine = innodb;
+create table ti2 (a int primary key, b int, foreign key (b) references ti1(b))
+ engine = innodb;
+set foreign_key_checks=1 /* ensure the check */;
+
+insert into ti1 values (1),(2),(3);
+insert into ti2 set a=2, b=2;
+
+sync_slave_with_master;
+
+#connection slave;
+select * from ti1 order by b /* must be (1),(2),(3) */;
+--echo *** conspire future problem
+insert into ti2 set a=1, b=1;
+select * from ti2 order by b /* must be (1,1) (2,2) */;
+
+connection master;
+
+delete from ti1 where b=1 /* offending delete event */;
+select * from ti1 order by b /* must be (2),(3) */;
+
+# foreign key: row is referenced
+
+--echo *** slave must stop (Trying to delete a referenced foreing key)
+connection slave;
+source include/wait_for_slave_sql_to_stop.inc;
+
+let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
+disable_query_log;
+eval SELECT "$last_error" AS Last_SQL_Error;
+enable_query_log;
+
+select * from ti1 order by b /* must be (1),(2),(3) - not deleted */;
+set foreign_key_checks= 0;
+delete from ti2 where b=1;
+set foreign_key_checks= 1;
+set global slave_exec_mode='IDEMPOTENT';
+start slave sql_thread;
+connection master;
+sync_slave_with_master;
+#connection slave;
+set global slave_exec_mode='STRICT';
+
+connection master;
+
+sync_slave_with_master;
+
+#connection slave;
+--echo *** conspire the following insert failure
+# foreign key: no referenced row
+
+--echo *** conspire future problem
+delete from ti1 where b=3;
+
+connection master;
+insert into ti2 set a=3, b=3 /* offending write event */;
+
+--echo *** slave must stop (Trying to insert an invalid foreign key)
+connection slave;
+source include/wait_for_slave_sql_to_stop.inc;
+
+let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
+disable_query_log;
+eval SELECT "$last_error" AS Last_SQL_Error;
+enable_query_log;
+
+select * from ti2 order by b /* must be (2,2) */;
+set foreign_key_checks= 0;
+insert into ti1 set b=3;
+set foreign_key_checks= 1;
+set global slave_exec_mode='IDEMPOTENT';
+start slave sql_thread;
+connection master;
+sync_slave_with_master;
+#connection slave;
+set global slave_exec_mode='STRICT';
+
+connection master;
+
+sync_slave_with_master;
+
+select * from ti2 order by b /* must be (2,2),(3,3) */;
+
+#
+--echo *** other errors
+#
+
+# dup key insert
+
+#connection slave;
+--echo *** conspiring query
+insert into ti1 set b=1;
+
+connection master;
+insert into ti1 set b=1 /* offending write event */;
+
+--echo *** slave must stop (Trying to insert a dupliacte key)
+connection slave;
+source include/wait_for_slave_sql_to_stop.inc;
+
+let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
+disable_query_log;
+eval SELECT "$last_error" AS Last_SQL_Error;
+enable_query_log;
+
+set foreign_key_checks= 0;
+delete from ti1 where b=1;
+set foreign_key_checks= 1;
+set global slave_exec_mode='IDEMPOTENT';
+start slave sql_thread;
+connection master;
+sync_slave_with_master;
+#connection slave;
+set global slave_exec_mode='STRICT';
+
+# key not found
+
+connection master;
+
+CREATE TABLE t1 (a INT PRIMARY KEY);
+CREATE TABLE t2 (a INT);
+INSERT INTO t1 VALUES (-1),(-2),(-3);
+INSERT INTO t2 VALUES (-1),(-2),(-3);
+sync_slave_with_master;
+
+#connection slave;
+DELETE FROM t1 WHERE a = -2;
+DELETE FROM t2 WHERE a = -2;
+connection master;
+DELETE FROM t1 WHERE a = -2;
+
+--echo *** slave must stop (Key was not found)
+connection slave;
+source include/wait_for_slave_sql_to_stop.inc;
+
+let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
+disable_query_log;
+eval SELECT "$last_error" AS Last_SQL_Error;
+enable_query_log;
+
+set global slave_exec_mode='IDEMPOTENT';
+start slave sql_thread;
+connection master;
+sync_slave_with_master;
+#connection slave;
+set global slave_exec_mode='STRICT';
+
+connection master;
+DELETE FROM t2 WHERE a = -2;
+--echo *** slave must stop (Key was not found)
+connection slave;
+source include/wait_for_slave_sql_to_stop.inc;
+
+let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
+disable_query_log;
+eval SELECT "$last_error" AS Last_SQL_Error;
+enable_query_log;
+
+set global slave_exec_mode='IDEMPOTENT';
+start slave sql_thread;
+connection master;
+sync_slave_with_master;
+#connection slave;
+set global slave_exec_mode='STRICT';
+
+UPDATE t1 SET a = 1 WHERE a = -1;
+UPDATE t2 SET a = 1 WHERE a = -1;
+
+connection master;
+UPDATE t1 SET a = 1 WHERE a = -1;
+
+--echo *** slave must stop (Key was not found)
+connection slave;
+source include/wait_for_slave_sql_to_stop.inc;
+
+let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
+disable_query_log;
+eval SELECT "$last_error" AS Last_SQL_Error;
+enable_query_log;
+
+set global slave_exec_mode='IDEMPOTENT';
+start slave sql_thread;
+connection master;
+sync_slave_with_master;
+#connection slave;
+set global slave_exec_mode='STRICT';
+
+
+connection master;
+UPDATE t2 SET a = 1 WHERE a = -1;
+
+--echo *** slave must stop (Key was not found)
+connection slave;
+source include/wait_for_slave_sql_to_stop.inc;
+
+let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
+disable_query_log;
+eval SELECT "$last_error" AS Last_SQL_Error;
+enable_query_log;
+
+set global slave_exec_mode='IDEMPOTENT';
+start slave sql_thread;
+connection master;
+sync_slave_with_master;
+#connection slave;
+SET @@global.slave_exec_mode= @old_slave_exec_mode;
+
+# cleanup for bug#31609 tests
+
+connection master;
+
+drop table t1,t2,ti2,ti1;
+sync_slave_with_master;
+set @@global.slave_exec_mode= @old_slave_exec_mode;
+
+--source include/master-slave-end.inc
+
+--echo *** end of tests
diff --git a/mysql-test/suite/rpl/t/rpl_row_insert_delayed.test b/mysql-test/suite/rpl/t/rpl_row_insert_delayed.test
index 9aeb57c4fa2..436c0a9f517 100644
--- a/mysql-test/suite/rpl/t/rpl_row_insert_delayed.test
+++ b/mysql-test/suite/rpl/t/rpl_row_insert_delayed.test
@@ -2,13 +2,4 @@
--source include/master-slave.inc
--source include/not_embedded.inc
--source include/not_windows.inc
-
-connection master;
-set @old_global_binlog_format = @@global.binlog_format;
-
-let $binlog_format_statement=0;
-set @@global.binlog_format = row;
--source extra/rpl_tests/rpl_insert_delayed.test
-
-connection master;
-set @@global.binlog_format = @old_global_binlog_format;
diff --git a/mysql-test/suite/rpl/t/rpl_slave_skip.test b/mysql-test/suite/rpl/t/rpl_slave_skip.test
index f4cb0f69e93..7416cc48c73 100644
--- a/mysql-test/suite/rpl/t/rpl_slave_skip.test
+++ b/mysql-test/suite/rpl/t/rpl_slave_skip.test
@@ -1,3 +1,9 @@
+# Every statement in this test is either executing under ROW or
+# STATEMENT format, which requires the slave thread to be able to apply
+# both statement and row events. Hence, we only need to execute this
+# test for MIXED mode.
+source include/have_binlog_format_mixed.inc;
+
source include/master-slave.inc;
source include/have_innodb.inc;
diff --git a/mysql-test/suite/rpl/t/rpl_stm_found_rows.test b/mysql-test/suite/rpl/t/rpl_stm_found_rows.test
new file mode 100644
index 00000000000..940d9f73d13
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_stm_found_rows.test
@@ -0,0 +1,121 @@
+source include/have_binlog_format_statement.inc;
+source include/master-slave.inc;
+
+# It is not possible to replicate FOUND_ROWS() using statement-based
+# replication, but there is a workaround that stores the result of
+# FOUND_ROWS() into a user variable and then replicates this instead.
+
+# The purpose of this test case is to test that the workaround
+# function properly even when inside stored programs (i.e., stored
+# routines and triggers).
+
+--echo ==== Initialize ====
+
+--echo **** On Master ****
+connection master;
+CREATE TABLE t1 (a INT);
+CREATE TABLE logtbl (sect INT, test INT, count INT);
+
+INSERT INTO t1 VALUES (1),(2),(3);
+INSERT INTO t1 SELECT 2*a+3 FROM t1;
+INSERT INTO t1 SELECT 2*a+3 FROM t1;
+INSERT INTO t1 SELECT 2*a+3 FROM t1;
+INSERT INTO t1 SELECT 2*a+3 FROM t1;
+INSERT INTO t1 SELECT 2*a+3 FROM t1;
+INSERT INTO t1 SELECT 2*a+3 FROM t1;
+
+
+--echo ==== Simple test ====
+
+SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
+
+# Instead of
+# INSERT INTO logtbl VALUES(1, 1, FOUND_ROWS());
+# we write
+SELECT FOUND_ROWS() INTO @a;
+INSERT INTO logtbl VALUES(1,1,@a);
+
+SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
+# Instead of
+# INSERT INTO logtbl VALUES(1, 2, FOUND_ROWS());
+# we write
+SELECT FOUND_ROWS() INTO @a;
+INSERT INTO logtbl VALUES(1,2,@a);
+
+SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
+--echo **** On Slave ****
+sync_slave_with_master;
+SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test;
+
+
+--echo ==== Stored procedure ====
+
+# Here we do both the calculation and the logging. We also do it twice
+# to make sure that there are no limitations on how many times it can
+# be used.
+
+--echo **** On Master ****
+connection master;
+--delimiter $$
+CREATE PROCEDURE calc_and_log(sect INT, test INT) BEGIN
+ DECLARE cnt INT;
+ SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1;
+ SELECT FOUND_ROWS() INTO cnt;
+ INSERT INTO logtbl VALUES(sect,test,cnt);
+ SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
+ SELECT FOUND_ROWS() INTO cnt;
+ INSERT INTO logtbl VALUES(sect,test+1,cnt);
+END $$
+--delimiter ;
+
+CALL calc_and_log(2,1);
+
+--delimiter $$
+CREATE PROCEDURE just_log(sect INT, test INT, found_rows INT) BEGIN
+ INSERT INTO logtbl VALUES (sect,test,found_rows);
+END $$
+--delimiter ;
+
+SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
+SELECT FOUND_ROWS() INTO @found_rows;
+CALL just_log(2,3,@found_rows);
+
+SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test;
+--echo **** On Slave ****
+sync_slave_with_master;
+SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test;
+
+
+--echo ==== Stored functions ====
+--echo **** On Master ****
+connection master;
+--delimiter $$
+CREATE FUNCTION log_rows(sect INT, test INT, found_rows INT)
+ RETURNS INT
+BEGIN
+ INSERT INTO logtbl VALUES(sect,test,found_rows);
+ RETURN found_rows;
+END $$
+--delimiter ;
+
+SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1;
+SELECT FOUND_ROWS() INTO @found_rows;
+SELECT log_rows(3,1,@found_rows), log_rows(3,2,@found_rows);
+
+SELECT * FROM logtbl WHERE sect = 3 ORDER BY sect,test;
+--echo **** On Slave ****
+sync_slave_with_master;
+SELECT * FROM logtbl WHERE sect = 3 ORDER BY sect,test;
+
+
+--echo ==== Cleanup ====
+--echo **** On Master ****
+connection master;
+DROP TABLE t1, logtbl;
+DROP PROCEDURE just_log;
+DROP PROCEDURE calc_and_log;
+DROP FUNCTION log_rows;
+sync_slave_with_master;
+
+source include/reset_master_and_slave.inc;
+
diff --git a/mysql-test/suite/rpl/t/rpl_stm_insert_delayed.test b/mysql-test/suite/rpl/t/rpl_stm_insert_delayed.test
index d55e3a4da2c..150b41ad020 100644
--- a/mysql-test/suite/rpl/t/rpl_stm_insert_delayed.test
+++ b/mysql-test/suite/rpl/t/rpl_stm_insert_delayed.test
@@ -1,20 +1,5 @@
-# we run first in statement-based then in mixed binlogging
-
---source include/have_binlog_format_mixed_or_statement.inc
+--source include/have_binlog_format_statement.inc
--source include/master-slave.inc
--source include/not_embedded.inc
--source include/not_windows.inc
-
-connection master;
-set @old_global_binlog_format = @@global.binlog_format;
-
-let $binlog_format_statement=1;
-set @@global.binlog_format = statement;
--source extra/rpl_tests/rpl_insert_delayed.test
-
-let $binlog_format_statement=0;
-set @@global.binlog_format = mixed;
---source extra/rpl_tests/rpl_insert_delayed.test
-
-connection master;
-set @@global.binlog_format = @old_global_binlog_format;
diff --git a/mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test b/mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test
index e6c1d5256a0..5795c697d71 100644
--- a/mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test
+++ b/mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test
@@ -1,17 +1,25 @@
#
# rpl_switch_stm_row_mixed tests covers
#
-# - switching explicitly between STATEMENT, ROW, and MIXED binlog format
-# showing when it is possible and when not.
-# - switching from MIXED to RBR implicitly listing all use cases,
-# e.g a query invokes UUID(), thereafter to serve as the definition
-# of MIXED binlog format
+# - Master is switching explicitly between STATEMENT, ROW, and MIXED
+# binlog format showing when it is possible and when not.
+# - Master switching from MIXED to RBR implicitly listing all use
+# cases, e.g a query invokes UUID(), thereafter to serve as the
+# definition of MIXED binlog format
# - correctness of execution
-- source include/not_ndb_default.inc
-- source include/master-slave.inc
+# Since this test generates row-based events in the binary log, the
+# slave SQL thread cannot be in STATEMENT mode to execute this test,
+# so we only execute it for MIXED and ROW as default value of
+# BINLOG_FORMAT.
+
+connection slave;
+-- source include/have_binlog_format_mixed_or_row.inc
+
connection master;
--disable_warnings
drop database if exists mysqltest1;
diff --git a/mysql-test/suite/rpl/t/rpl_temporary_errors.test b/mysql-test/suite/rpl/t/rpl_temporary_errors.test
index 3b373e00a62..30fe54d0e72 100644
--- a/mysql-test/suite/rpl/t/rpl_temporary_errors.test
+++ b/mysql-test/suite/rpl/t/rpl_temporary_errors.test
@@ -1,10 +1,10 @@
+source include/have_binlog_format_row.inc;
source include/master-slave.inc;
call mtr.add_suppression("Deadlock found");
--echo **** On Master ****
connection master;
-SET SESSION BINLOG_FORMAT=ROW;
CREATE TABLE t1 (a INT PRIMARY KEY, b INT);
INSERT INTO t1 VALUES (1,1), (2,2), (3,3), (4,4);
--echo **** On Slave ****
diff --git a/mysql-test/suite/rpl/t/rpl_udf.test b/mysql-test/suite/rpl/t/rpl_udf.test
index 262ad04630c..d982d53b600 100644
--- a/mysql-test/suite/rpl/t/rpl_udf.test
+++ b/mysql-test/suite/rpl/t/rpl_udf.test
@@ -5,18 +5,7 @@
# statement based format. This tests work completed in WL#3629. #
###################################################################
---source include/not_embedded.inc
--source include/master-slave.inc
let $engine_type= MyISAM;
-
-set binlog_format=row;
-
-# Embedded server doesn't support binlogging
---source include/rpl_udf.inc
-
-set binlog_format=statement;
-
-# Embedded server doesn't support binlogging
--source include/rpl_udf.inc
-
diff --git a/mysql-test/suite/rpl_ndb/combinations b/mysql-test/suite/rpl_ndb/combinations
new file mode 100644
index 00000000000..07042c2cbec
--- /dev/null
+++ b/mysql-test/suite/rpl_ndb/combinations
@@ -0,0 +1,8 @@
+[row]
+binlog-format=row
+
+[stmt]
+binlog-format=statement
+
+[mix]
+binlog-format=mixed
diff --git a/mysql-test/suite/rpl_ndb/r/rpl_ndb_binlog_format_errors.result b/mysql-test/suite/rpl_ndb/r/rpl_ndb_binlog_format_errors.result
new file mode 100644
index 00000000000..3a31ecd77ba
--- /dev/null
+++ b/mysql-test/suite/rpl_ndb/r/rpl_ndb_binlog_format_errors.result
@@ -0,0 +1,116 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+==== Initialize ====
+[on slave]
+SET @old_binlog_format= @@global.binlog_format;
+INSTALL PLUGIN example SONAME 'ha_example.so';
+[on master]
+SET @old_binlog_format= @@global.binlog_format;
+INSTALL PLUGIN example SONAME 'ha_example.so';
+CREATE TABLE t (a VARCHAR(100)) ENGINE = MYISAM;
+CREATE TABLE t_self_logging (a VARCHAR(100)) ENGINE = NDB;
+CREATE TABLE t_row (a VARCHAR(100)) ENGINE = INNODB;
+CREATE TABLE t_stmt (a VARCHAR(100)) ENGINE = EXAMPLE;
+CREATE TABLE t_slave_stmt (a VARCHAR(100)) ENGINE = MYISAM;
+SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
+[on slave]
+DROP TABLE t_slave_stmt;
+CREATE TABLE t_slave_stmt (a INT) ENGINE = EXAMPLE;
+[on master]
+==== Test ====
+---- binlog_format=row ----
+* Modify tables of more than one engine, one of which is self-logging
+CREATE TRIGGER trig_1 AFTER INSERT ON t_self_logging FOR EACH ROW BEGIN INSERT INTO t VALUES (1); END;
+INSERT INTO t_self_logging VALUES (1);
+ERROR HY000: Cannot execute statement: binlogging impossible since more than one engine is involved and at least one engine is self-logging.
+DROP trigger trig_1;
+* Modify both row-only and stmt-only table
+CREATE TRIGGER trig_2 AFTER INSERT ON t_stmt FOR EACH ROW BEGIN INSERT INTO t_row VALUES(1); END;
+INSERT INTO t_stmt VALUES (1);
+ERROR HY000: Cannot execute statement: binlogging impossible since both row-incapable engines and statement-incapable engines are involved.
+DROP TRIGGER trig_2;
+* Stmt-only table and binlog_format=row
+INSERT INTO t_stmt VALUES (1);
+ERROR HY000: Cannot execute statement: binlogging impossible since BINLOG_FORMAT = ROW and at least one table uses a storage engine limited to statement-logging.
+* Row injection and stmt-only table: in slave sql thread
+INSERT INTO t_slave_stmt VALUES (1);
+[on slave]
+--source include/wait_for_slave_sql_error_and_skip.inc
+Last_SQL_Error = Error 'Cannot execute row injection: binlogging impossible since at least one table uses a storage engine limited to statement-logging.' on opening tables
+set global sql_slave_skip_counter=1;
+include/start_slave.inc
+* Row injection and stmt-only table: use BINLOG statement
+BINLOG '
+1gRVSg8BAAAAZgAAAGoAAAABAAQANS4xLjM2LWRlYnVnLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAADWBFVKEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
+';
+BINLOG '
+1gRVShMBAAAALwAAAEABAAAAABcAAAAAAAAABHRlc3QABnRfc3RtdAABDwJkAAE=
+1gRVShcBAAAAIAAAAGABAAAQABcAAAAAAAEAAf/+ATE=
+';
+ERROR HY000: Cannot execute row injection: binlogging impossible since at least one table uses a storage engine limited to statement-logging.
+---- binlog_format=mixed ----
+[on slave]
+include/stop_slave.inc
+SET @@global.binlog_format = MIXED;
+include/start_slave.inc
+[on master]
+SET @@global.binlog_format = MIXED;
+SET @@session.binlog_format = MIXED;
+* Unsafe statement and stmt-only engine
+INSERT INTO t_stmt VALUES (UUID());
+Warnings:
+Note 1639 Unsafe statement binlogged as statement since storage engine is limited to statement-logging. Statement: INSERT INTO t_stmt VALUES (UUID())
+---- binlog_format=statement ----
+[on slave]
+include/stop_slave.inc
+SET @@global.binlog_format = STATEMENT;
+include/start_slave.inc
+[on master]
+SET @@global.binlog_format = STATEMENT;
+SET @@session.binlog_format = STATEMENT;
+* Row-only engine and binlog_format=statement: innodb-specific message
+INSERT INTO t_row VALUES (1);
+ERROR HY000: Cannot execute statement: binlogging impossible since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.
+* Row-only engine and binlog_format=statement: generic message
+SET @@session.debug= "+d,no_innodb_binlog_errors";
+INSERT INTO t_row VALUES (1);
+ERROR HY000: Cannot execute statement: binlogging impossible since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-logging.
+* Row injection and binlog_format=statement: BINLOG statement
+BINLOG '
+b9pVSg8BAAAAZgAAAGoAAAABAAQANS4xLjM2LWRlYnVnLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAABv2lVKEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
+';
+BINLOG '
+cNpVShMBAAAAKgAAADYBAAAAABcAAAAAAAAABHRlc3QAAXQAAQ8CZAAB
+cNpVShcBAAAAIAAAAFYBAAAQABcAAAAAAAEAAf/+ATE=
+';
+ERROR HY000: Cannot execute row injection: binlogging impossible since BINLOG_FORMAT = STATEMENT.
+* Unsafe statement and binlog_format=statement
+INSERT INTO t VALUES (UUID());
+Warnings:
+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Statement: INSERT INTO t VALUES (UUID())
+---- master: binlog_format=mixed, slave: binlog_format=statement ----
+SET @@global.binlog_format = MIXED;
+SET @@session.binlog_format = MIXED;
+* Row injection and binlog_format=statement: in slave sql thread
+INSERT INTO t VALUES (UUID());
+[on slave]
+--source include/wait_for_slave_sql_error_and_skip.inc
+Last_SQL_Error = Error 'Cannot execute row injection: binlogging impossible since BINLOG_FORMAT = STATEMENT.' on opening tables
+set global sql_slave_skip_counter=1;
+include/start_slave.inc
+[on master]
+==== Clean up ====
+DROP TABLE t, t_self_logging, t_row, t_stmt, t_slave_stmt;
+SET @@global.binlog_format = @old_binlog_format;
+SET @@session.binlog_format = @old_binlog_format;
+UNINSTALL PLUGIN example;
+[on slave]
+SET @@global.binlog_format = @old_binlog_format;
+SET @@session.binlog_format = @old_binlog_format;
+UNINSTALL PLUGIN example;
diff --git a/mysql-test/suite/rpl_ndb/r/rpl_ndb_circular_simplex.result b/mysql-test/suite/rpl_ndb/r/rpl_ndb_circular_simplex.result
index 01f8d94da48..b6f32668c42 100644
--- a/mysql-test/suite/rpl_ndb/r/rpl_ndb_circular_simplex.result
+++ b/mysql-test/suite/rpl_ndb/r/rpl_ndb_circular_simplex.result
@@ -102,3 +102,4 @@ Last_IO_Errno #
Last_IO_Error #
Last_SQL_Errno 0
Last_SQL_Error
+DROP TABLE t1;
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_2innodb.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_2innodb.test
index 3b075808481..63534cf6613 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_2innodb.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_2innodb.test
@@ -8,6 +8,9 @@
# test and to have control over the tests.
##############################################################
-- source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+-- source include/have_binlog_format_mixed_or_row.inc
-- source include/master-slave.inc
-- connection slave
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_2myisam.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_2myisam.test
index 560efec255b..9ff4ca9eb73 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_2myisam.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_2myisam.test
@@ -8,6 +8,9 @@
# test and to have control over the tests.
##############################################################
-- source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+-- source include/have_binlog_format_mixed_or_row.inc
-- source include/master-slave.inc
-- connection slave
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_basic.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_basic.test
index 5903cd223ad..04ef7f31b7c 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_basic.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_basic.test
@@ -1,4 +1,7 @@
--source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+--source include/have_binlog_format_mixed_or_row.inc
--source include/ndb_master-slave.inc
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors-master.opt b/mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors-master.opt
new file mode 100644
index 00000000000..ffa981152ea
--- /dev/null
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors-master.opt
@@ -0,0 +1 @@
+--innodb $EXAMPLE_PLUGIN_OPT
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors-slave.opt b/mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors-slave.opt
new file mode 100644
index 00000000000..ffa981152ea
--- /dev/null
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors-slave.opt
@@ -0,0 +1 @@
+--innodb $EXAMPLE_PLUGIN_OPT
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors.test
new file mode 100644
index 00000000000..1b157192b4f
--- /dev/null
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_binlog_format_errors.test
@@ -0,0 +1,193 @@
+# ==== Purpose ====
+#
+# Verify that errors or warnings are issued for all error conditions
+# related to deciding the binlog format of a statement. The possible
+# errors are listed in a comment above decide_logging_format() in
+# sql_base.cc.
+#
+# ==== Method ====
+#
+# Each error condition is executed; we verify that there is an error.
+#
+# ==== Related bugs ====
+#
+# BUG#39934: Slave stops for engine that only support row-based logging
+# BUG#42829: binlogging enabled for all schemas regardless of binlog-db-db / binlog-ignore-db
+#
+# ==== Related test cases ====
+#
+# binlog.binlog_unsafe verifies more thoroughly that a warning is
+# given for the case when an unsafe statement is executed and
+# binlog_format = STATEMENT.
+
+--source include/have_debug.inc
+# The test changes binlog_format, so there is no reason to run it
+# under more than one binlog format.
+--source include/have_binlog_format_row.inc
+--source include/have_ndb.inc
+--source include/have_innodb.inc
+--source include/ndb_master-slave.inc
+
+
+--echo ==== Initialize ====
+
+--echo [on slave]
+--connection slave
+
+SET @old_binlog_format= @@global.binlog_format;
+INSTALL PLUGIN example SONAME 'ha_example.so';
+
+--echo [on master]
+--connection master
+
+SET @old_binlog_format= @@global.binlog_format;
+INSTALL PLUGIN example SONAME 'ha_example.so';
+
+CREATE TABLE t (a VARCHAR(100)) ENGINE = MYISAM;
+CREATE TABLE t_self_logging (a VARCHAR(100)) ENGINE = NDB;
+CREATE TABLE t_row (a VARCHAR(100)) ENGINE = INNODB;
+CREATE TABLE t_stmt (a VARCHAR(100)) ENGINE = EXAMPLE;
+CREATE TABLE t_slave_stmt (a VARCHAR(100)) ENGINE = MYISAM;
+# This makes the innodb table row-only
+SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
+
+--echo [on slave]
+--sync_slave_with_master
+
+DROP TABLE t_slave_stmt;
+CREATE TABLE t_slave_stmt (a INT) ENGINE = EXAMPLE;
+
+--echo [on master]
+--connection master
+
+
+--echo ==== Test ====
+
+--echo ---- binlog_format=row ----
+
+--echo * Modify tables of more than one engine, one of which is self-logging
+--eval CREATE TRIGGER trig_1 AFTER INSERT ON t_self_logging FOR EACH ROW BEGIN INSERT INTO t VALUES (1); END
+--error ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE
+INSERT INTO t_self_logging VALUES (1);
+DROP trigger trig_1;
+
+--echo * Modify both row-only and stmt-only table
+--eval CREATE TRIGGER trig_2 AFTER INSERT ON t_stmt FOR EACH ROW BEGIN INSERT INTO t_row VALUES(1); END
+--error ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE
+INSERT INTO t_stmt VALUES (1);
+DROP TRIGGER trig_2;
+
+--echo * Stmt-only table and binlog_format=row
+--error ER_BINLOG_ROW_MODE_AND_STMT_ENGINE
+INSERT INTO t_stmt VALUES (1);
+
+--echo * Row injection and stmt-only table: in slave sql thread
+INSERT INTO t_slave_stmt VALUES (1);
+--echo [on slave]
+--connection slave
+# 1640 = ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE
+--let $slave_sql_errno= 1640
+--let $show_sql_error= 1
+--source include/wait_for_slave_sql_error_and_skip.inc
+
+--echo * Row injection and stmt-only table: use BINLOG statement
+# This is a format description event
+BINLOG '
+1gRVSg8BAAAAZgAAAGoAAAABAAQANS4xLjM2LWRlYnVnLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAADWBFVKEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
+';
+# This is a Table_map_event and a Write_rows_event. Together, they are
+# equivalent to 'INSERT INTO t_stmt VALUES (1)'
+--error ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE
+BINLOG '
+1gRVShMBAAAALwAAAEABAAAAABcAAAAAAAAABHRlc3QABnRfc3RtdAABDwJkAAE=
+1gRVShcBAAAAIAAAAGABAAAQABcAAAAAAAEAAf/+ATE=
+';
+
+
+--echo ---- binlog_format=mixed ----
+
+--echo [on slave]
+--sync_slave_with_master
+--source include/stop_slave.inc
+SET @@global.binlog_format = MIXED;
+--source include/start_slave.inc
+--echo [on master]
+--connection master
+SET @@global.binlog_format = MIXED;
+SET @@session.binlog_format = MIXED;
+
+--echo * Unsafe statement and stmt-only engine
+# This will give a warning.
+INSERT INTO t_stmt VALUES (UUID());
+
+
+--echo ---- binlog_format=statement ----
+
+--echo [on slave]
+--sync_slave_with_master
+--source include/stop_slave.inc
+SET @@global.binlog_format = STATEMENT;
+--source include/start_slave.inc
+--echo [on master]
+--connection master
+SET @@global.binlog_format = STATEMENT;
+SET @@session.binlog_format = STATEMENT;
+
+--echo * Row-only engine and binlog_format=statement: innodb-specific message
+--error ER_BINLOG_STMT_MODE_AND_ROW_ENGINE
+INSERT INTO t_row VALUES (1);
+
+--echo * Row-only engine and binlog_format=statement: generic message
+SET @@session.debug= "+d,no_innodb_binlog_errors";
+--error ER_BINLOG_STMT_MODE_AND_ROW_ENGINE
+INSERT INTO t_row VALUES (1);
+
+--echo * Row injection and binlog_format=statement: BINLOG statement
+# This is a format description event
+BINLOG '
+b9pVSg8BAAAAZgAAAGoAAAABAAQANS4xLjM2LWRlYnVnLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAABv2lVKEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
+';
+# This is a Table_map_event and a Write_rows_event. Together, they are
+# equivalent to 'INSERT INTO t VALUES (1)'.
+--error ER_BINLOG_ROW_INJECTION_AND_STMT_MODE
+BINLOG '
+cNpVShMBAAAAKgAAADYBAAAAABcAAAAAAAAABHRlc3QAAXQAAQ8CZAAB
+cNpVShcBAAAAIAAAAFYBAAAQABcAAAAAAAEAAf/+ATE=
+';
+
+--echo * Unsafe statement and binlog_format=statement
+# This will give a warning.
+INSERT INTO t VALUES (UUID());
+
+
+--echo ---- master: binlog_format=mixed, slave: binlog_format=statement ----
+
+SET @@global.binlog_format = MIXED;
+SET @@session.binlog_format = MIXED;
+
+--echo * Row injection and binlog_format=statement: in slave sql thread
+INSERT INTO t VALUES (UUID());
+--echo [on slave]
+--connection slave
+# 1642 = ER_BINLOG_ROW_INJECTION_AND_STMT_MODE
+--let $slave_sql_errno= 1642
+--let $show_sql_error= 1
+--source include/wait_for_slave_sql_error_and_skip.inc
+
+--echo [on master]
+--connection master
+
+
+--echo ==== Clean up ====
+
+DROP TABLE t, t_self_logging, t_row, t_stmt, t_slave_stmt;
+SET @@global.binlog_format = @old_binlog_format;
+SET @@session.binlog_format = @old_binlog_format;
+UNINSTALL PLUGIN example;
+--echo [on slave]
+--sync_slave_with_master
+SET @@global.binlog_format = @old_binlog_format;
+SET @@session.binlog_format = @old_binlog_format;
+UNINSTALL PLUGIN example;
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_blob.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_blob.test
index 822f1f224cd..a79c62e2a10 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_blob.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_blob.test
@@ -1,4 +1,7 @@
--source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+--source include/have_binlog_format_mixed_or_row.inc
--source include/ndb_master-slave.inc
#
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_blob2.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_blob2.test
index e29f24998fe..26946450e07 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_blob2.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_blob2.test
@@ -3,6 +3,11 @@
# Using wrapper to share test #
# code between engine tests #
#################################
+#
+# Since the master generates row-based events, the slave may not be in
+# STATEMENT mode to accept the events.
+#
+-- source include/have_binlog_format_mixed_or_row.inc
-- source include/have_ndb.inc
-- source include/ndb_master-slave.inc
let $engine_type=NDBCLUSTER;
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular.test
index 2cc46e2420e..d7456745b53 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular.test
@@ -1,4 +1,7 @@
--source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+--source include/have_binlog_format_mixed_or_row.inc
--source include/ndb_master-slave.inc
# set up circular replication
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_simplex.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_simplex.test
index d5ddfc2b739..c133c668887 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_simplex.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_simplex.test
@@ -1,4 +1,7 @@
--source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+--source include/have_binlog_format_mixed_or_row.inc
--source include/ndb_master-slave.inc
connection master;
@@ -78,3 +81,7 @@ SELECT * FROM t1 ORDER BY a;
--replace_result $MASTER_MYPORT MASTER_PORT
--replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 # 35 # 36 #
query_vertical SHOW SLAVE STATUS;
+
+connection master;
+DROP TABLE t1;
+sync_slave_with_master;
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_commit_afterflush.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_commit_afterflush.test
index 8c45ac5dbdd..cf3eb9589d2 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_commit_afterflush.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_commit_afterflush.test
@@ -4,6 +4,10 @@
# Different engines #
# By JBM 2004-02-15 #
#####################################
+
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+-- source include/have_binlog_format_mixed_or_row.inc
-- source include/have_ndb.inc
-- source include/ndb_master-slave.inc
let $engine_type=NDB;
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_ctype_ucs2_def.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_ctype_ucs2_def.test
index 8d5ad334766..cb99d049266 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_ctype_ucs2_def.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_ctype_ucs2_def.test
@@ -1,5 +1,8 @@
--source include/have_ucs2.inc
--source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+--source include/have_binlog_format_mixed_or_row.inc
--source include/ndb_master-slave.inc
#
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_delete_nowhere.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_delete_nowhere.test
index 6b1d932f9a6..c06d1a62fef 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_delete_nowhere.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_delete_nowhere.test
@@ -3,6 +3,9 @@
# Share test code between engine tests #
#########################################
--source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+--source include/have_binlog_format_mixed_or_row.inc
-- source include/ndb_master-slave.inc
let $engine_type=NDB;
-- source extra/rpl_tests/rpl_delete_no_where.test
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_do_db.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_do_db.test
index ffe8551d00f..750ae377350 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_do_db.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_do_db.test
@@ -6,6 +6,9 @@
##########################################################
--source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+--source include/have_binlog_format_mixed_or_row.inc
--source include/ndb_master-slave.inc
--disable_warnings
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_do_table.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_do_table.test
index ee6abd580f5..4598795cead 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_do_table.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_do_table.test
@@ -6,6 +6,9 @@
##########################################################
--source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+--source include/have_binlog_format_mixed_or_row.inc
--source include/ndb_master-slave.inc
--disable_warnings
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_func003.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_func003.test
index c02d82e2dc9..5f0fd3dfe49 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_func003.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_func003.test
@@ -7,6 +7,9 @@
# reduce test case code #
###################################
-- source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+-- source include/have_binlog_format_mixed_or_row.inc
-- source include/ndb_master-slave.inc
let $engine_type=NDB;
-- source extra/rpl_tests/rpl_row_func003.test
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_innodb_trans.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_innodb_trans.test
index fcc2928c5e2..66531172894 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_innodb_trans.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_innodb_trans.test
@@ -2,6 +2,9 @@
-- source include/have_ndb.inc
-- source include/have_innodb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+-- source include/have_binlog_format_mixed_or_row.inc
-- source include/ndb_master-slave.inc
create table t1 (a int, unique(a)) engine=ndbcluster;
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_insert_ignore.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_insert_ignore.test
index e6c66011fb7..be6f71eb5b5 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_insert_ignore.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_insert_ignore.test
@@ -2,6 +2,9 @@
# Wrapper for rpl_insert_ignore.test#
#####################################
-- source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+-- source include/have_binlog_format_mixed_or_row.inc
-- source include/ndb_master-slave.inc
let $engine_type=NDB;
let $engine_type2=myisam;
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_mixed_engines_transactions.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_mixed_engines_transactions.test
index 14b76722fa6..13c2fbce2b4 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_mixed_engines_transactions.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_mixed_engines_transactions.test
@@ -23,6 +23,9 @@
source include/have_ndb.inc;
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+source include/have_binlog_format_mixed_or_row.inc;
source include/ndb_master-slave.inc;
source include/have_innodb.inc;
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_multi_update3.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_multi_update3.test
index f144965e9b0..0375fd7fe6d 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_multi_update3.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_multi_update3.test
@@ -3,6 +3,9 @@
# to reuse test code between engine runs #
############################################################
-- source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+-- source include/have_binlog_format_mixed_or_row.inc
-- source include/ndb_master-slave.inc
let $engine_type=NDB;
-- source extra/rpl_tests/rpl_multi_update3.test
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_rep_ignore.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_rep_ignore.test
index 1f305d20c92..2d0c87927a5 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_rep_ignore.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_rep_ignore.test
@@ -7,6 +7,9 @@
##########################################################
--source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+--source include/have_binlog_format_mixed_or_row.inc
--source include/ndb_master-slave.inc
--disable_warnings
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_row_001.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_row_001.test
index f5b05080131..c711e6ddfa3 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_row_001.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_row_001.test
@@ -2,6 +2,9 @@
# By JBM 2005-02-15 Wrapped to allow reuse of test code#
########################################################
--source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+--source include/have_binlog_format_mixed_or_row.inc
-- source include/ndb_master-slave.inc
let $engine_type=NDB;
-- source extra/rpl_tests/rpl_row_001.test
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_sp003.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_sp003.test
index 6453f45aa75..a8dab098df5 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_sp003.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_sp003.test
@@ -5,6 +5,9 @@
# For different engines #
#################################
-- source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+-- source include/have_binlog_format_mixed_or_row.inc
-- source include/ndb_master-slave.inc
let $engine_type=NDBCLUSTER;
-- source extra/rpl_tests/rpl_row_sp003.test
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_sp006.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_sp006.test
index c2c7be6112c..f005d9cd67a 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_sp006.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_sp006.test
@@ -5,6 +5,9 @@
# For different engines #
#################################
-- source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+-- source include/have_binlog_format_mixed_or_row.inc
-- source include/ndb_master-slave.inc
let $engine_type=NDBCLUSTER;
-- source extra/rpl_tests/rpl_row_sp006.test
diff --git a/mysql-test/suite/rpl_ndb/t/rpl_ndb_trig004.test b/mysql-test/suite/rpl_ndb/t/rpl_ndb_trig004.test
index 7f7e08685bf..1fef32b7a65 100644
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_trig004.test
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_trig004.test
@@ -8,6 +8,9 @@
# Includes
-- source include/have_ndb.inc
+# Since the master generates row-based events, the slave must be in
+# ROW or MIXED mode to accept the events.
+-- source include/have_binlog_format_mixed_or_row.inc
-- source include/ndb_master-slave.inc
let $engine_type=NDB;
-- source extra/rpl_tests/rpl_trig004.test
diff --git a/mysql-test/t/partition_innodb_stmt.test b/mysql-test/t/partition_innodb_stmt.test
index d6181ce068e..c6f30f41969 100644
--- a/mysql-test/t/partition_innodb_stmt.test
+++ b/mysql-test/t/partition_innodb_stmt.test
@@ -50,7 +50,7 @@ connection con1;
--echo # connection con1
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
---error ER_BINLOG_LOGGING_IMPOSSIBLE
+--error ER_BINLOG_STMT_MODE_AND_ROW_ENGINE
INSERT INTO t1 VALUES(9);
COMMIT;
diff --git a/sql/event_db_repository.cc b/sql/event_db_repository.cc
index 9a253d74546..a8d634d76e1 100644
--- a/sql/event_db_repository.cc
+++ b/sql/event_db_repository.cc
@@ -1034,7 +1034,7 @@ update_timing_fields_for_event(THD *thd,
Turn off row binlogging of event timing updates. These are not used
for RBR of events replicated to the slave.
*/
- if (thd->current_stmt_binlog_row_based)
+ if (thd->is_current_stmt_binlog_format_row())
thd->clear_current_stmt_binlog_row_based();
DBUG_ASSERT(thd->security_ctx->master_access & SUPER_ACL);
diff --git a/sql/events.cc b/sql/events.cc
index ea935e67bd3..b8c3972d1c3 100644
--- a/sql/events.cc
+++ b/sql/events.cc
@@ -403,7 +403,7 @@ Events::create_event(THD *thd, Event_parse_data *parse_data,
Turn off row binlogging of this statement and use statement-based
so that all supporting tables are updated for CREATE EVENT command.
*/
- if (thd->current_stmt_binlog_row_based)
+ if (thd->is_current_stmt_binlog_format_row())
thd->clear_current_stmt_binlog_row_based();
pthread_mutex_lock(&LOCK_event_metadata);
@@ -527,7 +527,7 @@ Events::update_event(THD *thd, Event_parse_data *parse_data,
Turn off row binlogging of this statement and use statement-based
so that all supporting tables are updated for UPDATE EVENT command.
*/
- if (thd->current_stmt_binlog_row_based)
+ if (thd->is_current_stmt_binlog_format_row())
thd->clear_current_stmt_binlog_row_based();
pthread_mutex_lock(&LOCK_event_metadata);
@@ -624,7 +624,7 @@ Events::drop_event(THD *thd, LEX_STRING dbname, LEX_STRING name, bool if_exists)
Turn off row binlogging of this statement and use statement-based so
that all supporting tables are updated for DROP EVENT command.
*/
- if (thd->current_stmt_binlog_row_based)
+ if (thd->is_current_stmt_binlog_format_row())
thd->clear_current_stmt_binlog_row_based();
pthread_mutex_lock(&LOCK_event_metadata);
diff --git a/sql/ha_ndbcluster_binlog.cc b/sql/ha_ndbcluster_binlog.cc
index a0c74b60f84..5346ef1d626 100644
--- a/sql/ha_ndbcluster_binlog.cc
+++ b/sql/ha_ndbcluster_binlog.cc
@@ -304,6 +304,7 @@ static void run_query(THD *thd, char *buf, char *end,
thd->transaction.all= save_thd_transaction_all;
thd->transaction.stmt= save_thd_transaction_stmt;
thd->net= save_thd_net;
+ thd->set_current_stmt_binlog_row_based();
if (thd == injector_thd)
{
@@ -3649,6 +3650,7 @@ pthread_handler_t ndb_binlog_thread_func(void *arg)
thd= new THD; /* note that contructor of THD uses DBUG_ */
THD_CHECK_SENTRY(thd);
+ thd->set_current_stmt_binlog_row_based();
/* We need to set thd->thread_id before thd->store_globals, or it will
set an invalid value for thd->variables.pseudo_thread_id.
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc
index 67bc3156260..97a8dd99201 100644
--- a/sql/ha_partition.cc
+++ b/sql/ha_partition.cc
@@ -6188,7 +6188,7 @@ void ha_partition::get_auto_increment(ulonglong offset, ulonglong increment,
if (!auto_increment_safe_stmt_log_lock &&
thd->lex->sql_command != SQLCOM_INSERT &&
mysql_bin_log.is_open() &&
- !thd->current_stmt_binlog_row_based &&
+ !thd->is_current_stmt_binlog_format_row() &&
(thd->options & OPTION_BIN_LOG))
{
DBUG_PRINT("info", ("locking auto_increment_safe_stmt_log_lock"));
diff --git a/sql/handler.cc b/sql/handler.cc
index 058a43eed8d..c61d012e552 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -2412,7 +2412,7 @@ int handler::update_auto_increment()
variables->auto_increment_increment);
auto_inc_intervals_count++;
/* Row-based replication does not need to store intervals in binlog */
- if (mysql_bin_log.is_open() && !thd->current_stmt_binlog_row_based)
+ if (mysql_bin_log.is_open() && !thd->is_current_stmt_binlog_format_row())
thd->auto_inc_intervals_in_cur_stmt_for_binlog.append(auto_inc_interval_for_cur_row.minimum(),
auto_inc_interval_for_cur_row.values(),
variables->auto_increment_increment);
@@ -4423,7 +4423,7 @@ static bool check_table_binlog_row_based(THD *thd, TABLE *table)
DBUG_ASSERT(table->s->cached_row_logging_check == 0 ||
table->s->cached_row_logging_check == 1);
- return (thd->current_stmt_binlog_row_based &&
+ return (thd->is_current_stmt_binlog_format_row() &&
table->s->cached_row_logging_check &&
(thd->options & OPTION_BIN_LOG) &&
mysql_bin_log.is_open());
diff --git a/sql/item_create.cc b/sql/item_create.cc
index bf359b10caa..23a921be91c 100644
--- a/sql/item_create.cc
+++ b/sql/item_create.cc
@@ -2375,6 +2375,7 @@ Create_udf_func::create(THD *thd, udf_func *udf, List<Item> *item_list)
Item *func= NULL;
int arg_count= 0;
+ DBUG_ENTER("Create_udf_func::create");
if (item_list != NULL)
arg_count= item_list->elements;
@@ -2462,7 +2463,7 @@ Create_udf_func::create(THD *thd, udf_func *udf, List<Item> *item_list)
}
}
thd->lex->safe_to_cache_query= 0;
- return func;
+ DBUG_RETURN(func);
}
#endif
@@ -3363,9 +3364,10 @@ Create_func_found_rows Create_func_found_rows::s_singleton;
Item*
Create_func_found_rows::create(THD *thd)
{
+ DBUG_ENTER("Create_func_found_rows::create");
thd->lex->set_stmt_unsafe();
thd->lex->safe_to_cache_query= 0;
- return new (thd->mem_root) Item_func_found_rows();
+ DBUG_RETURN(new (thd->mem_root) Item_func_found_rows());
}
@@ -3791,9 +3793,10 @@ Create_func_load_file Create_func_load_file::s_singleton;
Item*
Create_func_load_file::create(THD *thd, Item *arg1)
{
+ DBUG_ENTER("Create_func_load_file::create");
thd->lex->set_stmt_unsafe();
thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT);
- return new (thd->mem_root) Item_load_file(arg1);
+ DBUG_RETURN(new (thd->mem_root) Item_load_file(arg1));
}
@@ -4260,9 +4263,10 @@ Create_func_row_count Create_func_row_count::s_singleton;
Item*
Create_func_row_count::create(THD *thd)
{
+ DBUG_ENTER("Create_func_row_count::create");
thd->lex->set_stmt_unsafe();
thd->lex->safe_to_cache_query= 0;
- return new (thd->mem_root) Item_func_row_count();
+ DBUG_RETURN(new (thd->mem_root) Item_func_row_count());
}
@@ -4569,9 +4573,10 @@ Create_func_uuid Create_func_uuid::s_singleton;
Item*
Create_func_uuid::create(THD *thd)
{
+ DBUG_ENTER("Create_func_uuid::create");
thd->lex->set_stmt_unsafe();
thd->lex->safe_to_cache_query= 0;
- return new (thd->mem_root) Item_func_uuid();
+ DBUG_RETURN(new (thd->mem_root) Item_func_uuid());
}
@@ -4580,9 +4585,10 @@ Create_func_uuid_short Create_func_uuid_short::s_singleton;
Item*
Create_func_uuid_short::create(THD *thd)
{
+ DBUG_ENTER("Create_func_uuid_short::create");
thd->lex->set_stmt_unsafe();
thd->lex->safe_to_cache_query= 0;
- return new (thd->mem_root) Item_func_uuid_short();
+ DBUG_RETURN(new (thd->mem_root) Item_func_uuid_short());
}
diff --git a/sql/log.cc b/sql/log.cc
index ee7ee48b42c..ef7d5c75f84 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -3734,7 +3734,7 @@ int THD::binlog_write_table_map(TABLE *table, bool is_trans)
table->s->table_map_id));
/* Pre-conditions */
- DBUG_ASSERT(current_stmt_binlog_row_based && mysql_bin_log.is_open());
+ DBUG_ASSERT(is_current_stmt_binlog_format_row() && mysql_bin_log.is_open());
DBUG_ASSERT(table->s->table_map_id != ULONG_MAX);
Table_map_log_event::flag_set const
@@ -4009,7 +4009,7 @@ bool MYSQL_BIN_LOG::write(Log_event *event_info)
*/
if (thd)
{
- if (!thd->current_stmt_binlog_row_based)
+ if (!thd->is_current_stmt_binlog_format_row())
{
if (thd->stmt_depends_on_first_successful_insert_id_in_prev_stmt)
{
diff --git a/sql/log_event.cc b/sql/log_event.cc
index 7dd05c3f703..1c33fb86290 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -7187,16 +7187,12 @@ int Rows_log_event::do_apply_event(Relay_log_info const *rli)
*/
thd->transaction.stmt.modified_non_trans_table= FALSE;
/*
- Check if the slave is set to use SBR. If so, it should switch
- to using RBR until the end of the "statement", i.e., next
- STMT_END_F or next error.
+ This is a row injection, so we flag the "statement" as
+ such. Note that this code is called both when the slave does row
+ injections and when the BINLOG statement is used to do row
+ injections.
*/
- if (!thd->current_stmt_binlog_row_based &&
- mysql_bin_log.is_open() && (thd->options & OPTION_BIN_LOG))
- {
- thd->set_current_stmt_binlog_row_based();
- }
-
+ thd->lex->set_stmt_row_injection();
/*
There are a few flags that are replicated with each row event.
@@ -7444,6 +7440,13 @@ int Rows_log_event::do_apply_event(Relay_log_info const *rli)
slave_rows_error_report(ERROR_LEVEL, error, rli, thd, table,
get_type_str(),
RPL_LOG_NAME, (ulong) log_pos);
+ /*
+ @todo We should probably not call
+ reset_current_stmt_binlog_row_based() from here.
+
+ Note: this applies to log_event_old.cc too.
+ /Sven
+ */
thd->reset_current_stmt_binlog_row_based();
const_cast<Relay_log_info*>(rli)->cleanup_context(thd, error);
thd->is_slave_error= 1;
@@ -7545,6 +7548,16 @@ static int rows_event_stmt_cleanup(Relay_log_info const *rli, THD * thd)
event flushed.
*/
+ /*
+ @todo We should probably not call
+ reset_current_stmt_binlog_row_based() from here.
+
+ Note: this applies to log_event_old.cc too
+
+ Btw, the previous comment about transactional engines does not
+ seem related to anything that happens here.
+ /Sven
+ */
thd->reset_current_stmt_binlog_row_based();
const_cast<Relay_log_info*>(rli)->cleanup_context(thd, 0);
diff --git a/sql/log_event_old.cc b/sql/log_event_old.cc
index 68cd2bf4673..e76dbd257a7 100644
--- a/sql/log_event_old.cc
+++ b/sql/log_event_old.cc
@@ -66,15 +66,12 @@ Old_rows_log_event::do_apply_event(Old_rows_log_event *ev, const Relay_log_info
mysql_reset_thd_for_next_command(thd);
/*
- Check if the slave is set to use SBR. If so, it should switch
- to using RBR until the end of the "statement", i.e., next
- STMT_END_F or next error.
+ This is a row injection, so we flag the "statement" as
+ such. Note that this code is called both when the slave does row
+ injections and when the BINLOG statement is used to do row
+ injections.
*/
- if (!thd->current_stmt_binlog_row_based &&
- mysql_bin_log.is_open() && (thd->options & OPTION_BIN_LOG))
- {
- thd->set_current_stmt_binlog_row_based();
- }
+ thd->lex->set_stmt_row_injection();
if (simple_open_n_lock_tables(thd, rli->tables_to_lock))
{
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index de02abc48e3..71fa55ff7a4 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -1559,7 +1559,6 @@ TABLE *open_n_lock_single_table(THD *thd, TABLE_LIST *table_l,
thr_lock_type lock_type);
bool open_normal_and_derived_tables(THD *thd, TABLE_LIST *tables, uint flags);
int lock_tables(THD *thd, TABLE_LIST *tables, uint counter, bool *need_reopen);
-int decide_logging_format(THD *thd, TABLE_LIST *tables);
TABLE *open_temporary_table(THD *thd, const char *path, const char *db,
const char *table_name, bool link_in_list);
bool rm_temporary_table(handlerton *base, char *path);
diff --git a/sql/rpl_injector.cc b/sql/rpl_injector.cc
index 684655d1c3b..8cdee89e164 100644
--- a/sql/rpl_injector.cc
+++ b/sql/rpl_injector.cc
@@ -36,8 +36,6 @@ injector::transaction::transaction(MYSQL_BIN_LOG *log, THD *thd)
m_start_pos.m_file_pos= log_info.pos;
begin_trans(m_thd);
-
- thd->set_current_stmt_binlog_row_based();
}
injector::transaction::~transaction()
diff --git a/sql/set_var.cc b/sql/set_var.cc
index 0b89333ce03..846aabbab57 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -1292,6 +1292,11 @@ bool sys_var_thd_binlog_format::is_readonly() const
void fix_binlog_format_after_update(THD *thd, enum_var_type type)
{
+ /*
+ @todo This function should be eliminated. We should not set the
+ current binlog format anywhere else than in decide_logging_format.
+ /Sven
+ */
thd->reset_current_stmt_binlog_row_based();
}
diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt
index 42bca02984d..1f466dd3db6 100644
--- a/sql/share/errmsg.txt
+++ b/sql/share/errmsg.txt
@@ -6076,8 +6076,7 @@ ER_SLAVE_INCIDENT
ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT
eng "Table has no partition for some existing values"
ER_BINLOG_UNSAFE_STATEMENT
- eng "Statement may not be safe to log in statement format."
- swe "Detta är inte säkert att logga i statement-format."
+ eng "Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT."
ER_SLAVE_FATAL_ERROR
eng "Fatal error: %s"
ER_SLAVE_RELAY_LOG_READ_FAILURE
@@ -6201,3 +6200,18 @@ ER_TEMPORARY_NAME
ER_RENAMED_NAME
eng "Renamed"
swe "Namnändrad"
+
+ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE
+ eng "Cannot execute statement: binlogging impossible since both row-incapable engines and statement-incapable engines are involved."
+ER_BINLOG_ROW_MODE_AND_STMT_ENGINE
+ eng "Cannot execute statement: binlogging impossible since BINLOG_FORMAT = ROW and at least one table uses a storage engine limited to statement-logging."
+ER_BINLOG_UNSAFE_AND_STMT_ENGINE
+ eng "Unsafe statement binlogged as statement since storage engine is limited to statement-logging."
+ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE
+ eng "Cannot execute row injection: binlogging impossible since at least one table uses a storage engine limited to statement-logging."
+ER_BINLOG_STMT_MODE_AND_ROW_ENGINE
+ eng "Cannot execute statement: binlogging impossible since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-logging.%s"
+ER_BINLOG_ROW_INJECTION_AND_STMT_MODE
+ eng "Cannot execute row injection: binlogging impossible since BINLOG_FORMAT = STATEMENT."
+ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE
+ eng "Cannot execute statement: binlogging impossible since more than one engine is involved and at least one engine is self-logging."
diff --git a/sql/sp.cc b/sql/sp.cc
index 29e228f5e45..a0c34e2bc1b 100644
--- a/sql/sp.cc
+++ b/sql/sp.cc
@@ -939,7 +939,7 @@ sp_create_routine(THD *thd, int type, sp_head *sp)
/* restore sql_mode when binloging */
thd->variables.sql_mode= saved_mode;
/* Such a statement can always go directly to binlog, no trans cache */
- thd->binlog_query(THD::MYSQL_QUERY_TYPE,
+ thd->binlog_query(THD::STMT_QUERY_TYPE,
log_query.c_ptr(), log_query.length(),
FALSE, FALSE, 0);
thd->variables.sql_mode= 0;
@@ -1830,6 +1830,8 @@ sp_cache_routines_and_add_tables_for_triggers(THD *thd, LEX *lex,
{
int ret= 0;
+ DBUG_ENTER("sp_cache_routines_and_add_tables_for_triggers");
+
Sroutine_hash_entry **last_cached_routine_ptr=
(Sroutine_hash_entry **)lex->sroutines_list.next;
@@ -1863,7 +1865,7 @@ sp_cache_routines_and_add_tables_for_triggers(THD *thd, LEX *lex,
ret= sp_cache_routines_and_add_tables_aux(thd, lex,
*last_cached_routine_ptr,
FALSE);
- return ret;
+ DBUG_RETURN(ret);
}
diff --git a/sql/sp_head.cc b/sql/sp_head.cc
index 8a8a5b06cc1..629a24585b3 100644
--- a/sql/sp_head.cc
+++ b/sql/sp_head.cc
@@ -1692,7 +1692,7 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount,
each substatement be binlogged its way.
*/
need_binlog_call= mysql_bin_log.is_open() &&
- (thd->options & OPTION_BIN_LOG) && !thd->current_stmt_binlog_row_based;
+ (thd->options & OPTION_BIN_LOG) && !thd->is_current_stmt_binlog_format_row();
/*
Remember the original arguments for unrolled replication of functions
diff --git a/sql/sp_head.h b/sql/sp_head.h
index dd11f8693ac..7faccb7afbb 100644
--- a/sql/sp_head.h
+++ b/sql/sp_head.h
@@ -459,6 +459,7 @@ public:
*/
void propagate_attributes(LEX *lex)
{
+ DBUG_ENTER("sp_head::propagate_attributes");
/*
If this routine needs row-based binary logging, the entire top statement
too (we cannot switch from statement-based to row-based only for this
@@ -467,6 +468,7 @@ public:
*/
if (m_flags & BINLOG_ROW_BASED_IF_MIXED)
lex->set_stmt_unsafe();
+ DBUG_VOID_RETURN;
}
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 79fc5d816fd..e614df4efcd 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -1654,7 +1654,7 @@ bool change_password(THD *thd, const char *host, const char *user,
acl_user->host.hostname ? acl_user->host.hostname : "",
new_password));
thd->clear_error();
- thd->binlog_query(THD::MYSQL_QUERY_TYPE, buff, query_length,
+ thd->binlog_query(THD::STMT_QUERY_TYPE, buff, query_length,
FALSE, FALSE, 0);
}
end:
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index de93c6609f7..a884a982011 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -1441,7 +1441,7 @@ void close_temporary_tables(THD *thd)
return;
if (!mysql_bin_log.is_open() ||
- (thd->current_stmt_binlog_row_based && thd->variables.binlog_format == BINLOG_FORMAT_ROW))
+ (thd->is_current_stmt_binlog_format_row() && thd->variables.binlog_format == BINLOG_FORMAT_ROW))
{
TABLE *tmp_next;
for (table= thd->temporary_tables; table; table= tmp_next)
@@ -4831,7 +4831,7 @@ static bool check_lock_and_start_stmt(THD *thd, TABLE *table,
There may be more differences between open_n_lock_single_table() and
open_ltable(). One known difference is that open_ltable() does
- neither call decide_logging_format() nor handle some other logging
+ neither call thd->decide_logging_format() nor handle some other logging
and locking issues because it does not call lock_tables().
*/
@@ -5052,63 +5052,142 @@ static void mark_real_tables_as_free_for_reuse(TABLE_LIST *table)
/**
- Decide on logging format to use for the statement.
+ Decide on logging format to use for the statement and issue errors
+ or warnings as needed. The decision depends on the following
+ parameters:
- Compute the capabilities vector for the involved storage engines
- and mask out the flags for the binary log. Right now, the binlog
- flags only include the capabilities of the storage engines, so this
- is safe.
+ - The logging mode, i.e., the value of binlog_format. Can be
+ statement, mixed, or row.
- We now have three alternatives that prevent the statement from
- being loggable:
+ - The type of statement. There are three types of statements:
+ "normal" safe statements; unsafe statements; and row injections.
+ An unsafe statement is one that, if logged in statement format,
+ might produce different results when replayed on the slave (e.g.,
+ INSERT DELAYED). A row injection is either a BINLOG statement, or
+ a row event executed by the slave's SQL thread.
- 1. If there are no capabilities left (all flags are clear) it is
- not possible to log the statement at all, so we roll back the
- statement and report an error.
+ - The capabilities of tables modified by the statement. The
+ *capabilities vector* for a table is a set of flags associated
+ with the table. Currently, it only includes two flags: *row
+ capability flag* and *statement capability flag*.
- 2. Statement mode is set, but the capabilities indicate that
- statement format is not possible.
+ The row capability flag is set if and only if the engine can
+ handle row-based logging. The statement capability flag is set if
+ and only if the table can handle statement-based logging.
- 3. Row mode is set, but the capabilities indicate that row
- format is not possible.
+ Decision table for logging format
+ ---------------------------------
- 4. Statement is unsafe, but the capabilities indicate that row
- format is not possible.
+ The following table summarizes how the format and generated
+ warning/error depends on the tables' capabilities, the statement
+ type, and the current binlog_format.
- If we are in MIXED mode, we then decide what logging format to use:
+ Row capable N NNNNNNNNN YYYYYYYYY YYYYYYYYY
+ Statement capable N YYYYYYYYY NNNNNNNNN YYYYYYYYY
- 1. If the statement is unsafe, row-based logging is used.
+ Statement type * SSSUUUIII SSSUUUIII SSSUUUIII
- 2. If statement-based logging is not possible, row-based logging is
- used.
+ binlog_format * SMRSMRSMR SMRSMRSMR SMRSMRSMR
- 3. Otherwise, statement-based logging is used.
+ Logged format - SS-SS---- -RR-RR-RR SRRSRR-RR
+ Warning/Error 1 --2332444 5--5--6-- ---7--6--
- @param thd Client thread
- @param tables Tables involved in the query
- */
+ Legend
+ ------
+
+ Row capable: N - Some table not row-capable, Y - All tables row-capable
+ Stmt capable: N - Some table not stmt-capable, Y - All tables stmt-capable
+ Statement type: (S)afe, (U)nsafe, or Row (I)njection
+ binlog_format: (S)TATEMENT, (M)IXED, or (R)OW
+ Logged format: (S)tatement or (R)ow
+ Warning/Error: Warnings and error messages are as follows:
+
+ 1. Error: Cannot execute statement: binlogging impossible since both
+ row-incapable engines and statement-incapable engines are
+ involved.
+
+ 2. Error: Cannot execute statement: binlogging impossible since
+ BINLOG_FORMAT = ROW and at least one table uses a storage engine
+ limited to statement-logging.
+
+ 3. Warning: Unsafe statement binlogged as statement since storage
+ engine is limited to statement-logging.
+
+ 4. Error: Cannot execute row injection: binlogging impossible since
+ at least one table uses a storage engine limited to
+ statement-logging.
+
+ 5. Error: Cannot execute statement: binlogging impossible since
+ BINLOG_FORMAT = STATEMENT and at least one table uses a storage
+ engine limited to row-logging.
+
+ 6. Error: Cannot execute row injection: binlogging impossible since
+ BINLOG_FORMAT = STATEMENT.
+
+ 7. Warning: Unsafe statement binlogged in statement format since
+ BINLOG_FORMAT = STATEMENT.
+
+ In addition, we can produce the following error (not depending on
+ the variables of the decision diagram):
+
+ 8. Error: Cannot execute statement: binlogging impossible since more
+ than one engine is involved and at least one engine is
+ self-logging.
-int decide_logging_format(THD *thd, TABLE_LIST *tables)
+ For each error case above, the statement is prevented from being
+ logged, we report an error, and roll back the statement. For
+ warnings, we set the thd->binlog_flags variable: the warning will be
+ printed only if the statement is successfully logged.
+
+ @see THD::binlog_query
+
+ @param[in] thd Client thread
+ @param[in] tables Tables involved in the query
+
+ @retval 0 No error; statement can be logged.
+ @retval -1 One of the error conditions above applies (1, 2, 4, 5, or 6).
+*/
+
+int THD::decide_logging_format(TABLE_LIST *tables)
{
- if (mysql_bin_log.is_open() && (thd->options & OPTION_BIN_LOG))
+ DBUG_ENTER("THD::decide_logging_format");
+ if (mysql_bin_log.is_open() && (options & OPTION_BIN_LOG))
{
/*
Compute the starting vectors for the computations by creating a
set with all the capabilities bits set and one with no
capabilities bits set.
- */
+ */
handler::Table_flags flags_some_set= 0;
handler::Table_flags flags_all_set=
HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE;
my_bool multi_engine= FALSE;
void* prev_ht= NULL;
+
+#ifndef DBUG_OFF
+ {
+ static const char *prelocked_mode_name[] = {
+ "NON_PRELOCKED",
+ "PRELOCKED",
+ "PRELOCKED_UNDER_LOCK_TABLES",
+ };
+ DBUG_PRINT("debug", ("prelocked_mode: %s",
+ prelocked_mode_name[prelocked_mode]));
+ }
+#endif
+
+ /*
+ Get the capabilities vector for all involved storage engines and
+ mask out the flags for the binary log. (Currently, the binlog
+ flags only include the capabilities of the storage engines.)
+ */
for (TABLE_LIST *table= tables; table; table= table->next_global)
{
if (table->placeholder())
continue;
if (table->table->s->table_category == TABLE_CATEGORY_PERFORMANCE)
- thd->lex->set_stmt_unsafe();
+ lex->set_stmt_unsafe();
if (table->lock_type >= TL_WRITE_ALLOW_WRITE)
{
ulonglong const flags= table->table->file->ha_table_flags();
@@ -5130,75 +5209,116 @@ int decide_logging_format(THD *thd, TABLE_LIST *tables)
DBUG_PRINT("info", ("flags_some_set: %s%s",
FLAGSTR(flags_some_set, HA_BINLOG_STMT_CAPABLE),
FLAGSTR(flags_some_set, HA_BINLOG_ROW_CAPABLE)));
- DBUG_PRINT("info", ("thd->variables.binlog_format: %ld",
- thd->variables.binlog_format));
+ DBUG_PRINT("info", ("variables.binlog_format: %ld",
+ variables.binlog_format));
DBUG_PRINT("info", ("multi_engine: %s",
multi_engine ? "TRUE" : "FALSE"));
int error= 0;
- if (flags_all_set == 0)
- {
- my_error((error= ER_BINLOG_LOGGING_IMPOSSIBLE), MYF(0),
- "Statement cannot be logged to the binary log in"
- " row-based nor statement-based format");
- }
- else if (thd->variables.binlog_format == BINLOG_FORMAT_STMT &&
- (flags_all_set & HA_BINLOG_STMT_CAPABLE) == 0)
- {
- my_error((error= ER_BINLOG_LOGGING_IMPOSSIBLE), MYF(0),
- "Statement-based format required for this statement,"
- " but not allowed by this combination of engines");
- }
- else if ((thd->variables.binlog_format == BINLOG_FORMAT_ROW ||
- thd->lex->is_stmt_unsafe()) &&
- (flags_all_set & HA_BINLOG_ROW_CAPABLE) == 0)
- {
- my_error((error= ER_BINLOG_LOGGING_IMPOSSIBLE), MYF(0),
- "Row-based format required for this statement,"
- " but not allowed by this combination of engines");
- }
/*
If more than one engine is involved in the statement and at
least one is doing it's own logging (is *self-logging*), the
statement cannot be logged atomically, so we generate an error
rather than allowing the binlog to become corrupt.
- */
+ */
if (multi_engine &&
(flags_some_set & HA_HAS_OWN_BINLOGGING))
{
- error= ER_BINLOG_LOGGING_IMPOSSIBLE;
- my_error(error, MYF(0),
- "Statement cannot be written atomically since more"
- " than one engine involved and at least one engine"
- " is self-logging");
+ my_error((error= ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE),
+ MYF(0));
}
- DBUG_PRINT("info", ("error: %d", error));
-
- if (error)
- return -1;
-
- /*
- We switch to row-based format if we are in mixed mode and one of
- the following are true:
-
- 1. If the statement is unsafe
- 2. If statement format cannot be used
-
- Observe that point to cannot be decided before the tables
- involved in a statement has been checked, i.e., we cannot put
- this code in reset_current_stmt_binlog_row_based(), it has to be
- here.
- */
- if (thd->lex->is_stmt_unsafe() ||
- (flags_all_set & HA_BINLOG_STMT_CAPABLE) == 0)
+ /* both statement-only and row-only engines involved */
+ if ((flags_all_set & (HA_BINLOG_STMT_CAPABLE | HA_BINLOG_ROW_CAPABLE)) == 0)
{
- thd->set_current_stmt_binlog_row_based_if_mixed();
+ /*
+ 1. Error: Binary logging impossible since both row-incapable
+ engines and statement-incapable engines are involved
+ */
+ my_error((error= ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE), MYF(0));
+ }
+ /* statement-only engines involved */
+ else if ((flags_all_set & HA_BINLOG_ROW_CAPABLE) == 0)
+ {
+ if (lex->is_stmt_row_injection())
+ {
+ /*
+ 4. Error: Cannot execute row injection since table uses
+ storage engine limited to statement-logging
+ */
+ my_error((error= ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE), MYF(0));
+ }
+ else if (variables.binlog_format == BINLOG_FORMAT_ROW)
+ {
+ /*
+ 2. Error: Cannot modify table that uses a storage engine
+ limited to statement-logging when BINLOG_FORMAT = ROW
+ */
+ my_error((error= ER_BINLOG_ROW_MODE_AND_STMT_ENGINE), MYF(0));
+ }
+ else if (lex->is_stmt_unsafe())
+ {
+ /*
+ 3. Warning: Unsafe statement binlogged as statement since
+ storage engine is limited to statement-logging.
+ */
+ binlog_warning_flags|=
+ (1 << BINLOG_WARNING_FLAG_UNSAFE_AND_STMT_ENGINE);
+ }
+ /* log in statement format! */
+ }
+ /* no statement-only engines */
+ else
+ {
+ /* binlog_format = STATEMENT */
+ if (variables.binlog_format == BINLOG_FORMAT_STMT)
+ {
+ if (lex->is_stmt_row_injection())
+ {
+ /*
+ 6. Error: Cannot execute row injection since
+ BINLOG_FORMAT = STATEMENT
+ */
+ my_error((error= ER_BINLOG_ROW_INJECTION_AND_STMT_MODE), MYF(0));
+ }
+ else if ((flags_all_set & HA_BINLOG_STMT_CAPABLE) == 0)
+ {
+ /*
+ 5. Error: Cannot modify table that uses a storage engine
+ limited to row-logging when binlog_format = STATEMENT
+ */
+ my_error((error= ER_BINLOG_STMT_MODE_AND_ROW_ENGINE), MYF(0), "");
+ }
+ else if (lex->is_stmt_unsafe())
+ {
+ /*
+ 7. Warning: Unsafe statement logged as statement due to
+ binlog_format = STATEMENT
+ */
+ binlog_warning_flags|=
+ (1 << BINLOG_WARNING_FLAG_UNSAFE_AND_STMT_MODE);
+ }
+ /* log in statement format! */
+ }
+ /* No statement-only engines and binlog_format != STATEMENT.
+ I.e., nothing prevents us from row logging if needed. */
+ else
+ {
+ if (lex->is_stmt_unsafe() || lex->is_stmt_row_injection()
+ || (flags_all_set & HA_BINLOG_STMT_CAPABLE) == 0)
+ {
+ /* log in row format! */
+ set_current_stmt_binlog_row_based_if_mixed();
+ }
+ }
}
+
+ if (error)
+ DBUG_RETURN(-1);
}
- return 0;
+ DBUG_RETURN(0);
}
/*
@@ -5242,7 +5362,7 @@ int lock_tables(THD *thd, TABLE_LIST *tables, uint count, bool *need_reopen)
*need_reopen= FALSE;
if (!tables && !thd->lex->requires_prelocking())
- DBUG_RETURN(decide_logging_format(thd, tables));
+ DBUG_RETURN(thd->decide_logging_format(tables));
/*
We need this extra check for thd->prelocked_mode because we want to avoid
@@ -5402,7 +5522,7 @@ int lock_tables(THD *thd, TABLE_LIST *tables, uint count, bool *need_reopen)
}
}
- DBUG_RETURN(decide_logging_format(thd, tables));
+ DBUG_RETURN(thd->decide_logging_format(tables));
}
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index f1ad410b877..145fb8b60d7 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -539,7 +539,7 @@ THD::THD()
lock_id(&main_lock_id),
user_time(0), in_sub_stmt(0),
sql_log_bin_toplevel(false),
- binlog_table_maps(0), binlog_flags(0UL),
+ binlog_warning_flags(0UL), binlog_table_maps(0),
table_map_for_update(0),
arg_of_last_insert_id_function(FALSE),
first_successful_insert_id_in_prev_stmt(0),
@@ -2973,13 +2973,13 @@ void THD::reset_sub_statement_state(Sub_statement_state *backup,
first_successful_insert_id_in_cur_stmt;
if ((!lex->requires_prelocking() || is_update_query(lex->sql_command)) &&
- !current_stmt_binlog_row_based)
+ !is_current_stmt_binlog_format_row())
{
options&= ~OPTION_BIN_LOG;
}
if ((backup->options & OPTION_BIN_LOG) && is_update_query(lex->sql_command)&&
- !current_stmt_binlog_row_based)
+ !is_current_stmt_binlog_format_row())
mysql_bin_log.start_union_events(this, this->query_id);
/* Disable result sets */
@@ -3041,7 +3041,7 @@ void THD::restore_sub_statement_state(Sub_statement_state *backup)
is_fatal_sub_stmt_error= FALSE;
if ((options & OPTION_BIN_LOG) && is_update_query(lex->sql_command) &&
- !current_stmt_binlog_row_based)
+ !is_current_stmt_binlog_format_row())
mysql_bin_log.stop_union_events(this);
/*
@@ -3463,7 +3463,7 @@ int THD::binlog_write_row(TABLE* table, bool is_trans,
MY_BITMAP const* cols, size_t colcnt,
uchar const *record)
{
- DBUG_ASSERT(current_stmt_binlog_row_based && mysql_bin_log.is_open());
+ DBUG_ASSERT(is_current_stmt_binlog_format_row() && mysql_bin_log.is_open());
/*
Pack records into format for transfer. We are allocating more
@@ -3493,7 +3493,7 @@ int THD::binlog_update_row(TABLE* table, bool is_trans,
const uchar *before_record,
const uchar *after_record)
{
- DBUG_ASSERT(current_stmt_binlog_row_based && mysql_bin_log.is_open());
+ DBUG_ASSERT(is_current_stmt_binlog_format_row() && mysql_bin_log.is_open());
size_t const before_maxlen = max_row_length(table, before_record);
size_t const after_maxlen = max_row_length(table, after_record);
@@ -3538,7 +3538,7 @@ int THD::binlog_delete_row(TABLE* table, bool is_trans,
MY_BITMAP const* cols, size_t colcnt,
uchar const *record)
{
- DBUG_ASSERT(current_stmt_binlog_row_based && mysql_bin_log.is_open());
+ DBUG_ASSERT(is_current_stmt_binlog_format_row() && mysql_bin_log.is_open());
/*
Pack records into format for transfer. We are allocating more
@@ -3620,8 +3620,6 @@ show_query_type(THD::enum_binlog_query_type qtype)
return "ROW";
case THD::STMT_QUERY_TYPE:
return "STMT";
- case THD::MYSQL_QUERY_TYPE:
- return "MYSQL";
case THD::QUERY_TYPE_COUNT:
default:
DBUG_ASSERT(0 <= qtype && qtype < THD::QUERY_TYPE_COUNT);
@@ -3633,28 +3631,30 @@ show_query_type(THD::enum_binlog_query_type qtype)
#endif
-/*
- Member function that will log query, either row-based or
- statement-based depending on the value of the 'current_stmt_binlog_row_based'
- the value of the 'qtype' flag.
+/**
+ Log the current query.
- This function should be called after the all calls to ha_*_row()
- functions have been issued, but before tables are unlocked and
- closed.
+ The query will be logged in either row format or statement format
+ depending on the value of @c current_stmt_binlog_row_based field and
+ the value of the @c qtype parameter.
- OBSERVE
- There shall be no writes to any system table after calling
- binlog_query(), so these writes has to be moved to before the call
- of binlog_query() for correct functioning.
+ This function must be called:
- This is necessesary not only for RBR, but the master might crash
- after binlogging the query but before changing the system tables.
- This means that the slave and the master are not in the same state
- (after the master has restarted), so therefore we have to
- eliminate this problem.
+ - After the all calls to ha_*_row() functions have been issued.
- RETURN VALUE
- Error code, or 0 if no error.
+ - After any writes to system tables. Rationale: if system tables
+ were written after a call to this function, and the master crashes
+ after the call to this function and before writing the system
+ tables, then the master and slave get out of sync.
+
+ - Before tables are unlocked and closed.
+
+ @see decide_logging_format
+
+ @retval 0 Success
+
+ @retval nonzero If there is a failure when writing the query (e.g.,
+ write failure), then the error code is returned.
*/
int THD::binlog_query(THD::enum_binlog_query_type qtype, char const *query_arg,
ulong query_len, bool is_trans, bool suppress_use,
@@ -3679,50 +3679,69 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype, char const *query_arg,
DBUG_RETURN(error);
/*
- If we are in statement mode and trying to log an unsafe statement,
- we should print a warning.
+ Warnings for unsafe statements logged in statement format are
+ printed here instead of in decide_logging_format(). This is
+ because the warnings should be printed only if the statement is
+ actually logged. When executing decide_logging_format(), we cannot
+ know for sure if the statement will be logged.
*/
- if (sql_log_bin_toplevel && lex->is_stmt_unsafe() &&
- variables.binlog_format == BINLOG_FORMAT_STMT)
+ if (sql_log_bin_toplevel)
{
- /*
- A warning can be elevated a error when STRICT sql mode.
- But we don't want to elevate binlog warning to error here.
- */
- push_warning(this, MYSQL_ERROR::WARN_LEVEL_NOTE,
- ER_BINLOG_UNSAFE_STATEMENT,
- ER(ER_BINLOG_UNSAFE_STATEMENT));
- if (!(binlog_flags & BINLOG_FLAG_UNSAFE_STMT_PRINTED))
+ if (binlog_warning_flags &
+ (1 << BINLOG_WARNING_FLAG_UNSAFE_AND_STMT_ENGINE))
+ {
+ push_warning_printf(this, MYSQL_ERROR::WARN_LEVEL_NOTE,
+ ER_BINLOG_UNSAFE_AND_STMT_ENGINE,
+ "%s Statement: %.*s",
+ ER(ER_BINLOG_UNSAFE_AND_STMT_ENGINE),
+ MYSQL_ERRMSG_SIZE, query_arg);
+ sql_print_warning("%s Statement: %.*s",
+ ER(ER_BINLOG_UNSAFE_AND_STMT_ENGINE),
+ MYSQL_ERRMSG_SIZE, query_arg);
+ binlog_warning_flags|= 1 << BINLOG_WARNING_FLAG_PRINTED;
+ }
+ else if (binlog_warning_flags &
+ (1 << BINLOG_WARNING_FLAG_UNSAFE_AND_STMT_MODE))
{
+ push_warning_printf(this, MYSQL_ERROR::WARN_LEVEL_NOTE,
+ ER_BINLOG_UNSAFE_STATEMENT,
+ "%s Statement: %.*s",
+ ER(ER_BINLOG_UNSAFE_STATEMENT),
+ MYSQL_ERRMSG_SIZE, query_arg);
sql_print_warning("%s Statement: %.*s",
ER(ER_BINLOG_UNSAFE_STATEMENT),
MYSQL_ERRMSG_SIZE, query_arg);
- binlog_flags|= BINLOG_FLAG_UNSAFE_STMT_PRINTED;
+ binlog_warning_flags|= 1 << BINLOG_WARNING_FLAG_PRINTED;
}
}
switch (qtype) {
+ /*
+ ROW_QUERY_TYPE means that the statement may be logged either in
+ row format or in statement format. If
+ current_stmt_binlog_row_based is set, it means that the
+ statement has already been logged in row format and hence shall
+ not be logged again.
+ */
case THD::ROW_QUERY_TYPE:
DBUG_PRINT("debug",
("current_stmt_binlog_row_based: %d",
- current_stmt_binlog_row_based));
- if (current_stmt_binlog_row_based)
+ is_current_stmt_binlog_format_row()));
+ if (is_current_stmt_binlog_format_row())
DBUG_RETURN(0);
- /* Otherwise, we fall through */
- case THD::MYSQL_QUERY_TYPE:
- /*
- Using this query type is a conveniece hack, since we have been
- moving back and forth between using RBR for replication of
- system tables and not using it.
+ /* Fall through */
- Make sure to change in check_table_binlog_row_based() according
- to how you treat this.
+ /*
+ STMT_QUERY_TYPE means that the query must be logged in statement
+ format; it cannot be logged in row format. This is typically
+ used by DDL statements. It is an error to use this query type
+ if current_stmt_binlog_row_based is set.
*/
case THD::STMT_QUERY_TYPE:
/*
The MYSQL_LOG::write() function will set the STMT_END_F flag and
flush the pending rows event if necessary.
- */
+ */
{
Query_log_event qinfo(this, query_arg, query_len, is_trans, suppress_use,
errcode);
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 36e696f2da6..5e069f1cbb6 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -1254,6 +1254,7 @@ public:
/* Used to execute base64 coded binlog events in MySQL server */
Relay_log_info* rli_fake;
+ void reset_for_next_command();
/*
Constant for THD::where initialization in the beginning of every query.
@@ -1421,23 +1422,44 @@ public:
int binlog_flush_pending_rows_event(bool stmt_end);
int binlog_remove_pending_rows_event(bool clear_maps);
+ int is_current_stmt_binlog_format_row() {
+ DBUG_ASSERT(current_stmt_binlog_format == BINLOG_FORMAT_STMT ||
+ current_stmt_binlog_format == BINLOG_FORMAT_ROW);
+ return current_stmt_binlog_format == BINLOG_FORMAT_ROW;
+ }
+
private:
/*
+ Tells if current statement should binlog row-based(1) or stmt-based(0)
+ */
+ enum_binlog_format current_stmt_binlog_format;
+
+ enum enum_binlog_warning_flag {
+ /* ER_BINLOG_UNSAFE_AND_STMT_ENGINE affects current stmt */
+ BINLOG_WARNING_FLAG_UNSAFE_AND_STMT_ENGINE = 0,
+ /* ER_BINLOG_UNSAFE_AND_STMT_MODE affects current stmt */
+ BINLOG_WARNING_FLAG_UNSAFE_AND_STMT_MODE,
+ /* One of the warnings has already been printed */
+ BINLOG_WARNING_FLAG_PRINTED,
+ /* number of elements of this enum; insert new members above */
+ BINLOG_WARNING_FLAG_COUNT
+ };
+ /**
+ Flags holding the status of binlog-related warnings for the
+ current statement. This is a binary combination of (1<<flag),
+ where flag is a member of @c enum_binlog_warning_flag.
+
+ The warnings are determined in @c THD::decide_logging_format, but
+ issued only later, after the statement has been written to the
+ binlog. Hence it must be stored in the @c THD object.
+ */
+ uint32 binlog_warning_flags;
+
+ /*
Number of outstanding table maps, i.e., table maps in the
transaction cache.
*/
uint binlog_table_maps;
-
- enum enum_binlog_flag {
- BINLOG_FLAG_UNSAFE_STMT_PRINTED,
- BINLOG_FLAG_COUNT
- };
-
- /**
- Flags with per-thread information regarding the status of the
- binary log.
- */
- uint32 binlog_flags;
public:
uint get_binlog_table_maps() const {
return binlog_table_maps;
@@ -1749,8 +1771,6 @@ public:
char scramble[SCRAMBLE_LENGTH+1];
bool slave_thread, one_shot_set;
- /* tells if current statement should binlog row-based(1) or stmt-based(0) */
- bool current_stmt_binlog_row_based;
bool locked, some_tables_deleted;
bool last_cuted_field;
bool no_errors, password;
@@ -1902,21 +1922,12 @@ public:
#ifndef MYSQL_CLIENT
enum enum_binlog_query_type {
- /*
- The query can be logged row-based or statement-based
- */
+ /* The query can be logged in row format or in statement format. */
ROW_QUERY_TYPE,
- /*
- The query has to be logged statement-based
- */
+ /* The query has to be logged in statement format. */
STMT_QUERY_TYPE,
- /*
- The query represents a change to a table in the "mysql"
- database and is currently mapped to ROW_QUERY_TYPE.
- */
- MYSQL_QUERY_TYPE,
QUERY_TYPE_COUNT
};
@@ -2120,8 +2131,13 @@ public:
void set_n_backup_active_arena(Query_arena *set, Query_arena *backup);
void restore_active_arena(Query_arena *set, Query_arena *backup);
+ /*
+ @todo Make these methods private or remove them completely. Only
+ decide_logging_format should call them. /Sven
+ */
inline void set_current_stmt_binlog_row_based_if_mixed()
{
+ DBUG_ENTER("set_current_stmt_binlog_row_based_if_mixed");
/*
If in a stored/function trigger, the caller should already have done the
change. We test in_sub_stmt to prevent introducing bugs where people
@@ -2133,18 +2149,25 @@ public:
*/
if ((variables.binlog_format == BINLOG_FORMAT_MIXED) &&
(in_sub_stmt == 0))
- current_stmt_binlog_row_based= TRUE;
+ current_stmt_binlog_format= BINLOG_FORMAT_ROW;
+
+ DBUG_VOID_RETURN;
}
inline void set_current_stmt_binlog_row_based()
{
- current_stmt_binlog_row_based= TRUE;
+ DBUG_ENTER("set_current_stmt_binlog_row_based");
+ current_stmt_binlog_format= BINLOG_FORMAT_ROW;
+ DBUG_VOID_RETURN;
}
inline void clear_current_stmt_binlog_row_based()
{
- current_stmt_binlog_row_based= FALSE;
+ DBUG_ENTER("clear_current_stmt_binlog_row_based");
+ current_stmt_binlog_format= BINLOG_FORMAT_STMT;
+ DBUG_VOID_RETURN;
}
inline void reset_current_stmt_binlog_row_based()
{
+ DBUG_ENTER("reset_current_stmt_binlog_row_based");
/*
If there are temporary tables, don't reset back to
statement-based. Indeed it could be that:
@@ -2159,19 +2182,18 @@ public:
or trigger is decided when it starts executing, depending for example on
the caller (for a stored function: if caller is SELECT or
INSERT/UPDATE/DELETE...).
-
- Don't reset binlog format for NDB binlog injector thread.
*/
DBUG_PRINT("debug",
("temporary_tables: %s, in_sub_stmt: %s, system_thread: %s",
YESNO(temporary_tables), YESNO(in_sub_stmt),
show_system_thread(system_thread)));
- if ((temporary_tables == NULL) && (in_sub_stmt == 0) &&
- (system_thread != SYSTEM_THREAD_NDBCLUSTER_BINLOG))
+ if ((temporary_tables == NULL) && (in_sub_stmt == 0))
{
- current_stmt_binlog_row_based=
- test(variables.binlog_format == BINLOG_FORMAT_ROW);
+ current_stmt_binlog_format=
+ (variables.binlog_format == BINLOG_FORMAT_ROW) ?
+ BINLOG_FORMAT_ROW : BINLOG_FORMAT_STMT;
}
+ DBUG_VOID_RETURN;
}
/**
@@ -2267,7 +2289,11 @@ public:
*/
void pop_internal_handler();
+ int decide_logging_format(TABLE_LIST *tables);
+
+
private:
+
/** The current internal error handler for this thread, or NULL. */
Internal_error_handler *m_internal_handler;
/**
diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc
index 277269f3b0d..facf1992f82 100644
--- a/sql/sql_delete.cc
+++ b/sql/sql_delete.cc
@@ -131,7 +131,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
if (!using_limit && const_cond_result &&
!(specialflag & (SPECIAL_NO_NEW_FUNC | SPECIAL_SAFE_MODE)) &&
(thd->lex->sql_command == SQLCOM_TRUNCATE ||
- (!thd->current_stmt_binlog_row_based &&
+ (!thd->is_current_stmt_binlog_format_row() &&
!(table->triggers && table->triggers->has_delete_triggers()))))
{
/* Update the table->file->stats.records number */
@@ -452,19 +452,6 @@ int mysql_prepare_delete(THD *thd, TABLE_LIST *table_list, Item **conds)
DBUG_ENTER("mysql_prepare_delete");
List<Item> all_fields;
- /*
- Statement-based replication of DELETE ... LIMIT is not safe as order of
- rows is not defined, so in mixed mode we go to row-based.
-
- Note that we may consider a statement as safe if ORDER BY primary_key
- is present. However it may confuse users to see very similiar statements
- replicated differently.
- */
- if (thd->lex->current_select->select_limit)
- {
- thd->lex->set_stmt_unsafe();
- thd->set_current_stmt_binlog_row_based_if_mixed();
- }
thd->lex->allow_sum_func= 0;
if (setup_tables_and_check_access(thd, &thd->lex->select_lex.context,
&thd->lex->select_lex.top_join_list,
@@ -1023,7 +1010,7 @@ bool multi_delete::send_eof()
static bool mysql_truncate_by_delete(THD *thd, TABLE_LIST *table_list)
{
- bool error, save_binlog_row_based= thd->current_stmt_binlog_row_based;
+ bool error, save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
DBUG_ENTER("mysql_truncate_by_delete");
table_list->lock_type= TL_WRITE;
mysql_init_select(thd->lex);
@@ -1031,7 +1018,8 @@ static bool mysql_truncate_by_delete(THD *thd, TABLE_LIST *table_list)
error= mysql_delete(thd, table_list, NULL, NULL, HA_POS_ERROR, LL(0), TRUE);
ha_autocommit_or_rollback(thd, error);
end_trans(thd, error ? ROLLBACK : COMMIT);
- thd->current_stmt_binlog_row_based= save_binlog_row_based;
+ if (save_binlog_row_based)
+ thd->set_current_stmt_binlog_row_based();
DBUG_RETURN(error);
}
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 9de27868d74..2cfa6ae6f59 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -1699,6 +1699,7 @@ public:
table(0),tables_in_use(0),stacked_inserts(0), status(0), dead(0),
group_count(0)
{
+ DBUG_ENTER("Delayed_insert constructor");
thd.security_ctx->user=thd.security_ctx->priv_user=(char*) delayed_user;
thd.security_ctx->host=(char*) my_localhost;
thd.current_tablenr=0;
@@ -1707,8 +1708,18 @@ public:
thd.lex->current_select= 0; // for my_message_sql
thd.lex->sql_command= SQLCOM_INSERT; // For innodb::store_lock()
/*
- Statement-based replication of INSERT DELAYED has problems with RAND()
- and user vars, so in mixed mode we go to row-based.
+ Statement-based replication of INSERT DELAYED has problems with
+ RAND() and user variables, so in mixed mode we go to row-based.
+ For normal commands, the unsafe flag is set at parse time.
+ However, since the flag is a member of the THD object, of which
+ the delayed_insert thread has its own copy, we must set the
+ statement to unsafe here and explicitly set row logging mode.
+
+ @todo set_current_stmt_binlog_row_based_if_mixed should not be
+ called by anything else than thd->decide_logging_format(). When
+ we call set_current_blah here, none of the checks in
+ decide_logging_format is made. We should probably call
+ thd->decide_logging_format() directly instead. /Sven
*/
thd.lex->set_stmt_unsafe();
thd.set_current_stmt_binlog_row_based_if_mixed();
@@ -1726,6 +1737,7 @@ public:
delayed_lock= global_system_variables.low_priority_updates ?
TL_WRITE_LOW_PRIORITY : TL_WRITE;
VOID(pthread_mutex_unlock(&LOCK_thread_count));
+ DBUG_VOID_RETURN;
}
~Delayed_insert()
{
@@ -2305,12 +2317,6 @@ pthread_handler_t handle_delayed_insert(void *arg)
*/
lex_start(thd);
thd->lex->sql_command= SQLCOM_INSERT; // For innodb::store_lock()
- /*
- Statement-based replication of INSERT DELAYED has problems with RAND()
- and user vars, so in mixed mode we go to row-based.
- */
- thd->lex->set_stmt_unsafe();
- thd->set_current_stmt_binlog_row_based_if_mixed();
/* Open table */
if (!(di->table= open_n_lock_single_table(thd, &di->table_list,
@@ -2756,7 +2762,7 @@ bool Delayed_insert::handle_inserts(void)
TODO: Move the logging to last in the sequence of rows.
*/
- if (thd.current_stmt_binlog_row_based)
+ if (thd.is_current_stmt_binlog_format_row())
thd.binlog_flush_pending_rows_event(TRUE);
if ((error=table->file->extra(HA_EXTRA_NO_CACHE)))
@@ -2821,19 +2827,6 @@ bool mysql_insert_select_prepare(THD *thd)
DBUG_ENTER("mysql_insert_select_prepare");
/*
- Statement-based replication of INSERT ... SELECT ... LIMIT is not safe
- as order of rows is not defined, so in mixed mode we go to row-based.
-
- Note that we may consider a statement as safe if ORDER BY primary_key
- is present or we SELECT a constant. However it may confuse users to
- see very similiar statements replicated differently.
- */
- if (lex->current_select->select_limit)
- {
- lex->set_stmt_unsafe();
- thd->set_current_stmt_binlog_row_based_if_mixed();
- }
- /*
SELECT_LEX do not belong to INSERT statement, so we can't add WHERE
clause if table is VIEW
*/
@@ -3286,7 +3279,7 @@ void select_insert::abort() {
thd->binlog_query(THD::ROW_QUERY_TYPE, thd->query, thd->query_length,
transactional_table, FALSE, errcode);
}
- if (!thd->current_stmt_binlog_row_based && !can_rollback_data())
+ if (!thd->is_current_stmt_binlog_format_row() && !can_rollback_data())
thd->transaction.all.modified_non_trans_table= TRUE;
if (changed)
query_cache_invalidate3(thd, table, 1);
@@ -3550,11 +3543,11 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
virtual int do_postlock(TABLE **tables, uint count)
{
THD *thd= const_cast<THD*>(ptr->get_thd());
- if (int error= decide_logging_format(thd, &all_tables))
+ if (int error= thd->decide_logging_format(&all_tables))
return error;
TABLE const *const table = *tables;
- if (thd->current_stmt_binlog_row_based &&
+ if (thd->is_current_stmt_binlog_format_row() &&
!table->s->tmp_table &&
!ptr->get_create_info()->table_existed)
{
@@ -3578,7 +3571,7 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
temporary table, we need to start a statement transaction.
*/
if ((thd->lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) == 0 &&
- thd->current_stmt_binlog_row_based &&
+ thd->is_current_stmt_binlog_format_row() &&
mysql_bin_log.is_open())
{
thd->binlog_start_trans_and_stmt();
@@ -3660,7 +3653,7 @@ select_create::binlog_show_create_table(TABLE **tables, uint count)
schema that will do a close_thread_tables(), destroying the
statement transaction cache.
*/
- DBUG_ASSERT(thd->current_stmt_binlog_row_based);
+ DBUG_ASSERT(thd->is_current_stmt_binlog_format_row());
DBUG_ASSERT(tables && *tables && count > 0);
char buf[2048];
@@ -3700,7 +3693,7 @@ void select_create::send_error(uint errcode,const char *err)
DBUG_PRINT("info",
("Current statement %s row-based",
- thd->current_stmt_binlog_row_based ? "is" : "is NOT"));
+ thd->is_current_stmt_binlog_format_row() ? "is" : "is NOT"));
DBUG_PRINT("info",
("Current table (at 0x%lu) %s a temporary (or non-existant) table",
(ulong) table,
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index 22b7d2e359c..9528d8f8f29 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -1044,24 +1044,49 @@ public:
}
/**
- Has the parser/scanner detected that this statement is unsafe?
- */
+ Has the parser/scanner detected that this statement is unsafe?
+
+ @retval 0 if the statement is not marked as unsafe
+ @retval nonzero if the statement is marked as unsafe
+ */
inline bool is_stmt_unsafe() const {
return binlog_stmt_flags & (1U << BINLOG_STMT_FLAG_UNSAFE);
}
/**
- Flag the current (top-level) statement as unsafe.
+ Is this statement actually a row injection?
- The flag will be reset after the statement has finished.
+ @retval 0 if the statement is not a row injection
+ @retval nonzero if the statement is a row injection
+ */
+ inline bool is_stmt_row_injection() const {
+ return binlog_stmt_flags & (1U << BINLOG_STMT_FLAG_ROW_INJECTION);
+ }
+ /**
+ Flag the statement as a row injection. (A row injection is either
+ a BINLOG statement, or a row event in the relay log executed by
+ the slave SQL thread.)
+ */
+ inline void set_stmt_row_injection() {
+ DBUG_ENTER("set_stmt_row_injection");
+ binlog_stmt_flags|= (1U << BINLOG_STMT_FLAG_ROW_INJECTION);
+ DBUG_VOID_RETURN;
+ }
+ /**
+ Flag the current (top-level) statement as unsafe.
+ The flag will be reset after the statement has finished.
*/
inline void set_stmt_unsafe() {
+ DBUG_ENTER("set_stmt_unsafe");
binlog_stmt_flags|= (1U << BINLOG_STMT_FLAG_UNSAFE);
+ DBUG_VOID_RETURN;
}
inline void clear_stmt_unsafe() {
+ DBUG_ENTER("clear_stmt_unsafe");
binlog_stmt_flags&= ~(1U << BINLOG_STMT_FLAG_UNSAFE);
+ DBUG_VOID_RETURN;
}
/**
@@ -1072,16 +1097,37 @@ public:
{ return sroutines_list.elements != 0; }
private:
+ /**
+ Flags indicating properties of the statement with respect to
+ logging.
+
+ These are combined in a binary manner; e.g., an unsafe statement
+ has the bit (1<<BINLOG_STMT_FLAG_UNSAFE) set.
+ */
enum enum_binlog_stmt_flag {
- BINLOG_STMT_FLAG_UNSAFE,
+ /** The statement is unsafe to log in statement mode. */
+ BINLOG_STMT_FLAG_UNSAFE= 0,
+ /**
+ The statement is a row injection (i.e., either a BINLOG
+ statement or a row event executed by the slave SQL thread).
+ */
+ BINLOG_STMT_FLAG_ROW_INJECTION,
+ /**
+ The last element of this enumeration type. Insert new members
+ above.
+ */
BINLOG_STMT_FLAG_COUNT
};
- /*
- Tells if the parsing stage detected properties of the statement,
- for example: that some items require row-based binlogging to give
- a reliable binlog/replication, or if we will use stored functions
- or triggers which themselves need require row-based binlogging.
+ /**
+ Indicates the type of statement with respect to binlogging.
+
+ This is typically zeroed before parsing a statement, set during
+ parsing (depending on the query), and read when deciding the
+ logging format of the current statement.
+
+ This is a binary combination of one or more bits (1<<flag), where
+ flag is a member of enum_binlog_stmt_flag.
*/
uint32 binlog_stmt_flags;
};
@@ -1891,6 +1937,7 @@ typedef struct st_lex : public Query_tables_list
}
return FALSE;
}
+
} LEX;
diff --git a/sql/sql_load.cc b/sql/sql_load.cc
index babd02c0008..8bf71d55660 100644
--- a/sql/sql_load.cc
+++ b/sql/sql_load.cc
@@ -518,7 +518,7 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
version for the binary log to mark that table maps are invalid
after this point.
*/
- if (thd->current_stmt_binlog_row_based)
+ if (thd->is_current_stmt_binlog_format_row())
thd->binlog_flush_pending_rows_event(true);
else
{
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 83f44bba008..0f89b5ab5eb 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -5625,6 +5625,12 @@ bool my_yyoverflow(short **yyss, YYSTYPE **yyvs, ulong *yystacksize)
void mysql_reset_thd_for_next_command(THD *thd)
{
+ thd->reset_for_next_command();
+}
+
+void THD::reset_for_next_command()
+{
+ THD *thd= this;
DBUG_ENTER("mysql_reset_thd_for_next_command");
DBUG_ASSERT(!thd->spcont); /* not for substatements of routines */
DBUG_ASSERT(! thd->in_sub_stmt);
@@ -5668,15 +5674,12 @@ void mysql_reset_thd_for_next_command(THD *thd)
thd->rand_used= 0;
thd->sent_row_count= thd->examined_row_count= 0;
- /*
- Because we come here only for start of top-statements, binlog format is
- constant inside a complex statement (using stored functions) etc.
- */
thd->reset_current_stmt_binlog_row_based();
+ thd->binlog_warning_flags= 0;
DBUG_PRINT("debug",
("current_stmt_binlog_row_based: %d",
- thd->current_stmt_binlog_row_based));
+ thd->is_current_stmt_binlog_format_row()));
DBUG_VOID_RETURN;
}
diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc
index 06c6c022780..19df65bfd51 100644
--- a/sql/sql_repl.cc
+++ b/sql/sql_repl.cc
@@ -1684,7 +1684,7 @@ int log_loaded_block(IO_CACHE* file)
uchar* buffer= (uchar*) my_b_get_buffer_start(file);
uint max_event_size= current_thd->variables.max_allowed_packet;
lf_info= (LOAD_FILE_INFO*) file->arg;
- if (lf_info->thd->current_stmt_binlog_row_based)
+ if (lf_info->thd->is_current_stmt_binlog_format_row())
DBUG_RETURN(0);
if (lf_info->last_pos_in_file != HA_POS_ERROR &&
lf_info->last_pos_in_file >= my_b_get_pos_in_file(file))
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 0fc1d04a41b..9badd43173c 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -1804,7 +1804,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
LINT_INIT(alias);
LINT_INIT(path_length);
- if (thd->current_stmt_binlog_row_based && !dont_log_query)
+ if (thd->is_current_stmt_binlog_format_row() && !dont_log_query)
{
built_query.set_charset(system_charset_info);
if (if_exists)
@@ -1882,7 +1882,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
being built. The string always end in a comma and the comma
will be chopped off before being written to the binary log.
*/
- if (thd->current_stmt_binlog_row_based && !dont_log_query)
+ if (thd->is_current_stmt_binlog_format_row() && !dont_log_query)
{
non_temp_tables_count++;
/*
@@ -2009,7 +2009,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
query_cache_invalidate3(thd, tables, 0);
if (!dont_log_query)
{
- if (!thd->current_stmt_binlog_row_based ||
+ if (!thd->is_current_stmt_binlog_format_row() ||
non_temp_tables_count > 0 && !tmp_table_deleted)
{
/*
@@ -2021,7 +2021,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
*/
write_bin_log(thd, !error, thd->query, thd->query_length);
}
- else if (thd->current_stmt_binlog_row_based &&
+ else if (thd->is_current_stmt_binlog_format_row() &&
non_temp_tables_count > 0 &&
tmp_table_deleted)
{
@@ -3822,8 +3822,8 @@ bool mysql_create_table_no_lock(THD *thd,
Otherwise, the statement shall be binlogged.
*/
if (!internal_tmp_table &&
- (!thd->current_stmt_binlog_row_based ||
- (thd->current_stmt_binlog_row_based &&
+ (!thd->is_current_stmt_binlog_format_row() ||
+ (thd->is_current_stmt_binlog_format_row() &&
!(create_info->options & HA_LEX_CREATE_TMP_TABLE))))
write_bin_log(thd, TRUE, thd->query, thd->query_length);
error= FALSE;
@@ -5236,7 +5236,7 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, TABLE_LIST* src_table,
/*
We have to write the query before we unlock the tables.
*/
- if (thd->current_stmt_binlog_row_based)
+ if (thd->is_current_stmt_binlog_format_row())
{
/*
Since temporary tables are not replicated under row-based
@@ -7143,7 +7143,7 @@ view_err:
if (rename_temporary_table(thd, new_table, new_db, new_name))
goto err1;
/* We don't replicate alter table statement on temporary tables */
- if (!thd->current_stmt_binlog_row_based)
+ if (!thd->is_current_stmt_binlog_format_row())
write_bin_log(thd, TRUE, thd->query, thd->query_length);
goto end_temporary;
}
@@ -7305,7 +7305,7 @@ view_err:
db, table_name);
DBUG_ASSERT(!(mysql_bin_log.is_open() &&
- thd->current_stmt_binlog_row_based &&
+ thd->is_current_stmt_binlog_format_row() &&
(create_info->options & HA_LEX_CREATE_TMP_TABLE)));
write_bin_log(thd, TRUE, thd->query, thd->query_length);
diff --git a/sql/sql_udf.cc b/sql/sql_udf.cc
index c60dac42fb8..a49e0df7124 100644
--- a/sql/sql_udf.cc
+++ b/sql/sql_udf.cc
@@ -437,7 +437,7 @@ int mysql_create_function(THD *thd,udf_func *udf)
Turn off row binlogging of this statement and use statement-based
so that all supporting tables are updated for CREATE FUNCTION command.
*/
- if (thd->current_stmt_binlog_row_based)
+ if (thd->is_current_stmt_binlog_format_row())
thd->clear_current_stmt_binlog_row_based();
rw_wrlock(&THR_LOCK_udf);
@@ -540,7 +540,7 @@ int mysql_drop_function(THD *thd,const LEX_STRING *udf_name)
Turn off row binlogging of this statement and use statement-based
so that all supporting tables are updated for DROP FUNCTION command.
*/
- if (thd->current_stmt_binlog_row_based)
+ if (thd->is_current_stmt_binlog_format_row())
thd->clear_current_stmt_binlog_row_based();
rw_wrlock(&THR_LOCK_udf);
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index ab6ba2ba756..638b15df414 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -871,19 +871,6 @@ bool mysql_prepare_update(THD *thd, TABLE_LIST *table_list,
SELECT_LEX *select_lex= &thd->lex->select_lex;
DBUG_ENTER("mysql_prepare_update");
- /*
- Statement-based replication of UPDATE ... LIMIT is not safe as order of
- rows is not defined, so in mixed mode we go to row-based.
-
- Note that we may consider a statement as safe if ORDER BY primary_key
- is present. However it may confuse users to see very similiar statements
- replicated differently.
- */
- if (thd->lex->current_select->select_limit)
- {
- thd->lex->set_stmt_unsafe();
- thd->set_current_stmt_binlog_row_based_if_mixed();
- }
#ifndef NO_EMBEDDED_ACCESS_CHECKS
table_list->grant.want_privilege= table->grant.want_privilege=
(SELECT_ACL & ~table->grant.privilege);
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index c40062e5d52..dfb5e9d5fcb 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -8939,7 +8939,7 @@ opt_limit_clause:
;
limit_clause:
- LIMIT limit_options {}
+ LIMIT limit_options { Lex->set_stmt_unsafe(); }
;
limit_options:
@@ -9001,6 +9001,7 @@ delete_limit_clause:
{
SELECT_LEX *sel= Select;
sel->select_limit= $2;
+ Lex->set_stmt_unsafe();
sel->explicit_limit= 1;
}
;
@@ -9454,13 +9455,21 @@ insert_lock_option:
#endif
}
| LOW_PRIORITY { $$= TL_WRITE_LOW_PRIORITY; }
- | DELAYED_SYM { $$= TL_WRITE_DELAYED; }
+ | DELAYED_SYM
+ {
+ $$= TL_WRITE_DELAYED;
+ Lex->set_stmt_unsafe();
+ }
| HIGH_PRIORITY { $$= TL_WRITE; }
;
replace_lock_option:
opt_low_priority { $$= $1; }
- | DELAYED_SYM { $$= TL_WRITE_DELAYED; }
+ | DELAYED_SYM
+ {
+ $$= TL_WRITE_DELAYED;
+ Lex->set_stmt_unsafe();
+ }
;
insert2:
diff --git a/storage/example/ha_example.cc b/storage/example/ha_example.cc
index 604722c3c8c..2c7512afda5 100644
--- a/storage/example/ha_example.cc
+++ b/storage/example/ha_example.cc
@@ -355,7 +355,13 @@ int ha_example::close(void)
int ha_example::write_row(uchar *buf)
{
DBUG_ENTER("ha_example::write_row");
- DBUG_RETURN(HA_ERR_WRONG_COMMAND);
+ /*
+ Example of a successful write_row. We don't store the data
+ anywhere; they are thrown away. A real implementation will
+ probably need to do something with 'buf'. We report a success
+ here, to pretend that the insert was successful.
+ */
+ DBUG_RETURN(0);
}
diff --git a/storage/example/ha_example.h b/storage/example/ha_example.h
index ec3987ced5d..e565bd5ffba 100644
--- a/storage/example/ha_example.h
+++ b/storage/example/ha_example.h
@@ -83,11 +83,11 @@ public:
ulonglong table_flags() const
{
/*
- We are saying that this engine is just row capable to have an
- engine that can only handle row-based logging. This is used in
- testing.
+ We are saying that this engine is just statement capable to have
+ an engine that can only handle statement-based logging. This is
+ used in testing.
*/
- return HA_BINLOG_ROW_CAPABLE;
+ return HA_BINLOG_STMT_CAPABLE;
}
/** @brief
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index 56e28cf5f14..67c24456d1c 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -6838,21 +6838,21 @@ ha_innobase::external_lock(
/* Statement based binlogging does not work in isolation level
READ UNCOMMITTED and READ COMMITTED since the necessary
locks cannot be taken. In this case, we print an
- informative error message and return with an error. */
- if (lock_type == F_WRLCK)
- {
- ulong const binlog_format= thd_binlog_format(thd);
- ulong const tx_isolation = thd_tx_isolation(current_thd);
- if (tx_isolation <= ISO_READ_COMMITTED &&
- binlog_format == BINLOG_FORMAT_STMT)
- {
- char buf[256];
- my_snprintf(buf, sizeof(buf),
- "Transaction level '%s' in"
- " InnoDB is not safe for binlog mode '%s'",
- tx_isolation_names[tx_isolation],
- binlog_format_names[binlog_format]);
- my_error(ER_BINLOG_LOGGING_IMPOSSIBLE, MYF(0), buf);
+ informative error message and return with an error.
+ Note: decide_logging_format would give the same error message,
+ except it cannot give the extra details.
+ */
+ if (lock_type == F_WRLCK &&
+ !(table_flags() & HA_BINLOG_STMT_CAPABLE) &&
+ thd_binlog_format(thd) == BINLOG_FORMAT_STMT) {
+ int skip = 0;
+ /* used by test case */
+ DBUG_EXECUTE_IF("no_innodb_binlog_errors", skip = 1;);
+ if (!skip) {
+ my_error(ER_BINLOG_STMT_MODE_AND_ROW_ENGINE, MYF(0),
+ " InnoDB is limited to row-logging when "
+ "transaction isolation level is "
+ "READ COMMITTED or READ UNCOMMITTED.");
DBUG_RETURN(HA_ERR_LOGGING_IMPOSSIBLE);
}
}