mirror of
https://github.com/MariaDB/server.git
synced 2025-02-02 12:01:42 +01:00
19c380aaff
Non-transactional updates that take place inside a transaction present problems for logging because they are visible to other clients before the transaction is committed, and they are not rolled back even if the transaction is rolled back. It is not always possible to log correctly in statement format when both transactional and non-transactional tables are used in the same transaction. In the current patch, we ensure that such scenario is completely safe under the ROW and MIXED modes.
110 lines
3.2 KiB
Text
110 lines
3.2 KiB
Text
# Test to test how logging is done depending on the capabilities of
|
|
# the engines. Unfortunately, we don't have a good row-only logging
|
|
# engine, and NDB does not really cut is since it is also
|
|
# self-logging. I'm using it nevertheless.
|
|
|
|
source include/have_blackhole.inc;
|
|
source include/have_ndb.inc;
|
|
source include/have_log_bin.inc;
|
|
|
|
call mtr.add_suppression("Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT");
|
|
|
|
CREATE TABLE t1m (m INT, n INT) ENGINE=MYISAM;
|
|
CREATE TABLE t1b (b INT, c INT) ENGINE=BLACKHOLE;
|
|
CREATE TABLE t1n (e INT, f INT) ENGINE=NDB;
|
|
|
|
RESET MASTER;
|
|
|
|
SET SESSION BINLOG_FORMAT=STATEMENT;
|
|
|
|
INSERT INTO t1b VALUES (1,1), (1,2), (2,1), (2,2);
|
|
INSERT INTO t1m VALUES (1,1), (1,2), (2,1), (2,2);
|
|
|
|
UPDATE t1m, t1b SET m = 2, b = 3 WHERE n = c;
|
|
|
|
# Here and below we need to wait when some event appears in binlog
|
|
# to avoid unsrted mixing local events and from NDB
|
|
let $wait_binlog_event= COMMIT;
|
|
source include/wait_for_binlog_event.inc;
|
|
let $event= query_get_value(SHOW BINLOG EVENTS, Info, 9);
|
|
--echo The last event before the COMMIT is $event
|
|
|
|
echo *** Please look in binlog_multi_engine.test if you have a diff here ****;
|
|
START TRANSACTION;
|
|
INSERT INTO t1n VALUES (1,1), (1,2), (2,1), (2,2);
|
|
UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
|
|
UPDATE t1n, t1b SET e = 2, b = 3 WHERE f = c;
|
|
COMMIT;
|
|
|
|
let $wait_binlog_event= COMMIT;
|
|
source include/wait_for_binlog_event.inc;
|
|
|
|
TRUNCATE t1m;
|
|
TRUNCATE t1b;
|
|
TRUNCATE t1n;
|
|
|
|
let $wait_binlog_event= t1n;
|
|
source include/wait_for_binlog_event.inc;
|
|
|
|
source include/show_binlog_events.inc;
|
|
|
|
RESET MASTER;
|
|
|
|
SET SESSION BINLOG_FORMAT=MIXED;
|
|
|
|
INSERT INTO t1b VALUES (1,1), (1,2), (2,1), (2,2);
|
|
INSERT INTO t1m VALUES (1,1), (1,2), (2,1), (2,2);
|
|
|
|
let $wait_binlog_event= COMMIT;
|
|
source include/wait_for_binlog_event.inc;
|
|
let $event= query_get_value(SHOW BINLOG EVENTS, Info, 6);
|
|
--echo The last event before the COMMIT is $event
|
|
|
|
INSERT INTO t1n VALUES (1,1), (1,2), (2,1), (2,2);
|
|
|
|
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_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
|
|
# might cause it to be out of sync with the results from MyISAM.
|
|
# This will generate an error once BUG#28722 is fixed.
|
|
|
|
#UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
|
|
|
|
TRUNCATE t1m;
|
|
TRUNCATE t1b;
|
|
TRUNCATE t1n;
|
|
|
|
source include/show_binlog_events.inc;
|
|
|
|
RESET MASTER;
|
|
|
|
SET SESSION BINLOG_FORMAT=ROW;
|
|
|
|
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_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
|
|
# might cause it to be out of sync with the results from MyISAM.
|
|
# This will generate an error once BUG#28722 is fixed.
|
|
|
|
#UPDATE t1m, t1n SET m = 2, e = 3 WHERE n = f;
|
|
|
|
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;
|
|
|
|
RESET MASTER;
|
|
|
|
DROP TABLE t1m, t1b, t1n;
|
|
|