mirror of
https://github.com/MariaDB/server.git
synced 2026-05-05 22:55:32 +02:00
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.
1146 lines
32 KiB
Text
1146 lines
32 KiB
Text
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;
|
|
|
|
***********************************************************
|
|
***********************************************************
|
|
***************** Start of Testing ************************
|
|
***********************************************************
|
|
***********************************************************
|
|
* This test format == binlog_format ROW 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;
|
|
|