# # misc binlogging tests that do not require a slave running # -- source include/have_log_bin.inc -- source include/not_embedded.inc -- source include/have_innodb.inc --disable_warnings drop table if exists t1, t2; --enable_warnings reset master; create table t1 (a int) engine=innodb; create table t2 (a int) engine=innodb; begin; insert t1 values (5); commit; begin; insert t2 values (5); commit; # first COMMIT must be Query_log_event, second - Xid_log_event source include/show_binlog_events.inc; drop table t1,t2; # # binlog rotation after one big transaction # reset master; let $1=100; create table t1 (n int) engine=innodb; begin; --disable_query_log while ($1) { eval insert into t1 values($1 + 4); dec $1; } --enable_query_log commit; # Make sure binlog checkpoint is logged before DROP TABLE to avoid random # result difference. --source include/wait_for_binlog_checkpoint.inc drop table t1; --source include/show_binlog_events.inc --let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1) --source include/show_binlog_events.inc --let $binlog_file= # # Bug#22540 - Incorrect value in column End_log_pos of # SHOW BINLOG EVENTS using InnoDB # # the following tests will show that certain queries now return # absolute offsets (from binlog start, rather than relative to # the beginning of the current transaction). under what # conditions it should be allowed / is sensible to put the # slider into the middle of a transaction is not our concern # here; we just guarantee that if and when it's done, the # user has valid offsets to use. if the setter function still # wants to throw a "positioning into middle of transaction" # warning, that's its prerogative and handled elsewhere. set @ac = @@autocommit; # first show this to work for SHOW BINLOG EVENTS set autocommit= 0; reset master; create table t1(n int) engine=innodb; begin; insert into t1 values (1); insert into t1 values (2); insert into t1 values (3); commit; drop table t1; --source include/show_binlog_events.inc # now show that nothing breaks if we need to read from the cache more # than once, resulting in split event-headers set @bcs = @@binlog_cache_size; set global binlog_cache_size=4096; reset master; create table t1 (a int, b char(255)) engine=innodb; flush status; show status like "binlog_cache_use"; let $1=100; disable_query_log; begin; while ($1) { eval insert into t1 values( $1, 'just to fill void to make transaction occupying at least two buffers of the trans cache' ); dec $1; } commit; --echo *** the following must show the counter value = 1 *** show status like "binlog_cache_use"; enable_query_log; --source include/show_binlog_events.inc drop table t1; set global binlog_cache_size=@bcs; set session autocommit = @ac; # # Bug#33798: prepared statements improperly handle large unsigned ints # --disable_warnings drop table if exists t1; --enable_warnings reset master; create table t1 (a bigint unsigned, b bigint(20) unsigned); prepare stmt from "insert into t1 values (?,?)"; set @a= 9999999999999999; set @b= 14632475938453979136; execute stmt using @a, @b; deallocate prepare stmt; drop table t1; --source include/show_binlog_events.inc # # Bug #39182: Binary log producing incompatible character set query from # stored procedure. # reset master; CREATE DATABASE bug39182 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; USE bug39182; CREATE TABLE t1 (a VARCHAR(255) COLLATE utf8_unicode_ci) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; DELIMITER //; CREATE PROCEDURE p1() BEGIN DECLARE s1 VARCHAR(255); SET s1= "test"; CREATE TEMPORARY TABLE tmp1 SELECT * FROM t1 WHERE a LIKE CONCAT("%", s1, "%"); SELECT COLLATION(NAME_CONST('s1', _utf8'test')) c1, COLLATION(NAME_CONST('s1', _utf8'test' COLLATE utf8_unicode_ci)) c2, COLLATION(s1) c3, COERCIBILITY(NAME_CONST('s1', _utf8'test')) d1, COERCIBILITY(NAME_CONST('s1', _utf8'test' COLLATE utf8_unicode_ci)) d2, COERCIBILITY(s1) d3; DROP TEMPORARY TABLE tmp1; END// DELIMITER ;// CALL p1(); source include/show_binlog_events.inc; DROP PROCEDURE p1; DROP TABLE t1; DROP DATABASE bug39182; USE test; # # Bug#35383: binlog playback and replication breaks due to # name_const substitution # DELIMITER //; CREATE PROCEDURE p1(IN v1 INT) BEGIN CREATE TABLE t1 SELECT v1; DROP TABLE t1; END// CREATE PROCEDURE p2() BEGIN DECLARE v1 INT; CREATE TABLE t1 SELECT v1+1; DROP TABLE t1; END// CREATE PROCEDURE p3(IN v1 INT) BEGIN CREATE TABLE t1 SELECT 1 FROM DUAL WHERE v1!=0; DROP TABLE t1; END// CREATE PROCEDURE p4(IN v1 INT) BEGIN DECLARE v2 INT; CREATE TABLE t1 SELECT 1, v1, v2; DROP TABLE t1; CREATE TABLE t1 SELECT 1, v1+1, v2; DROP TABLE t1; END// DELIMITER ;// CALL p1(1); CALL p2(); CALL p3(0); CALL p4(0); DROP PROCEDURE p1; DROP PROCEDURE p2; DROP PROCEDURE p3; DROP PROCEDURE p4; --echo End of 5.0 tests # Test of a too big SET INSERT_ID. # This should generate an error and should not be put in binlog # We look at the binlog further down with SHOW BINLOG EVENTS. reset master; create table t1 (id tinyint auto_increment primary key); insert into t1 values(5); set insert_id=128; --error HA_ERR_AUTOINC_ERANGE insert into t1 values(null) /* Not binlogged */; # The followin insert ignore will be put in binlog set insert_id=128; insert ignore into t1 values(null) /* Insert 128 */; # Insert with duplicate key error should not go into binglo set insert_id=5; --error ER_DUP_ENTRY insert into t1 values(null) /* Not binlogged */; # Insert with autogenerated key + duplicate key error should go into binlog set insert_id=5; insert ignore into t1 values(null) /* Insert 5 */; select * from t1; drop table t1; # Same tests but with 2 rows inserted at a time create table t1 (id tinyint auto_increment primary key) engine=myisam; set insert_id=128; --error HA_ERR_AUTOINC_ERANGE insert into t1 values(5),(null) /* Insert_id 128 */; # The followin insert ignore will be put in binlog set insert_id=128; insert ignore into t1 values (4),(null) /* Insert_id 128 */; # Insert with duplicate key error should not go into binglo set insert_id=5; --error ER_DUP_ENTRY insert into t1 values(3),(null) /* Insert_id 5 */; # Insert with autogenerated key + duplicate key error should go into binlog set insert_id=5; insert ignore into t1 values(2),(null) /* Insert_id 5 */; select * from t1 order by id; drop table t1; # bug#22027 create table t1 (a int); create table if not exists t2 select * from t1; # bug#22762 create temporary table tt1 (a int); create table if not exists t3 like tt1; # BUG#25091 (A DELETE statement to mysql database is not logged with # ROW mode format): Checking that some basic operations on tables in # the mysql database is replicated even when the current database is # 'mysql'. USE mysql; INSERT db SET host='localhost', user='@#@', db='Just a test'; UPDATE db SET db='Another db' WHERE host='localhost' AND user='@#@'; DELETE FROM db WHERE host='localhost' AND user='@#@'; use test; source include/show_binlog_events.inc; drop table t1,t2,t3,tt1; -- source suite/binlog/include/binlog_insert_delayed.test #Bug #26079 max_binlog_size + innodb = not make new binlog and hang server # server should not hang, binlog must rotate in the end reset master; --disable_warnings drop table if exists t3; --enable_warnings create table t3 (a int(11) NOT NULL AUTO_INCREMENT, b text, PRIMARY KEY (a) ) engine=innodb; --let $binlog_file1= query_get_value(SHOW MASTER STATUS, File, 1) --echo File $binlog_file1 let $it=4; while ($it) { insert into t3(b) values ('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'); dec $it; } --let $binlog_file2= query_get_value(SHOW MASTER STATUS, File, 1) --echo *** show new binlog index after rotating *** --echo File $binlog_file2 drop table t3; --echo # --echo # Bug #45998: database crashes when running "create as select" --echo # CREATE DATABASE test1; USE test1; DROP DATABASE test1; CREATE TABLE test.t1(a int); INSERT INTO test.t1 VALUES (1), (2); CREATE TABLE test.t2 SELECT * FROM test.t1; USE test; DROP TABLES t1, t2; # # Bug#46640 # This test verifies if the server_id stored in the "format # description BINLOG statement" will override the server_id # of the server executing the statements. # connect (fresh,localhost,root,,test); connection fresh; RESET MASTER; CREATE TABLE t1 (a INT PRIMARY KEY); # Format description event, with server_id = 10; BINLOG ' 3u9kSA8KAAAAZgAAAGoAAAABAAQANS4xLjM1LW1hcmlhLWJldGExLWRlYnVnLWxvZwAAAAAAAAAA AAAAAAAAAAAAAAAAAADe72RIEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC '; # What server_id is logged for a statement? Should be our own, not the # one from the format description event. INSERT INTO t1 VALUES (1); # INSERT INTO t1 VALUES (2), with server_id=20. Check that this is logged # with our own server id, not the 20 from the BINLOG statement. BINLOG ' 3u9kSBMUAAAAKQAAAJEBAAAAABoAAAAAAAAABHRlc3QAAnQxAAEDAAA= 3u9kSBcUAAAAIgAAALMBAAAQABoAAAAAAAEAAf/+AgAAAA== '; # Show binlog events to check that server ids are correct. --replace_column 1 # 2 # 5 # --replace_regex /Server ver: .*, Binlog ver: .*/Server ver: #, Binlog ver: #/ /table_id: [0-9]+/table_id: #/ SHOW BINLOG EVENTS; DROP TABLE t1; --echo --echo # BUG#54903 BINLOG statement toggles session variables --echo # ---------------------------------------------------------------------- --echo # This test verify that BINLOG statement doesn't change current session's --echo # variables foreign_key_checks and unique_checks. --echo CREATE TABLE t1 (c1 INT KEY); SET @@SESSION.foreign_key_checks= ON; SET @@SESSION.unique_checks= ON; --echo # INSERT INTO t1 VALUES (1) --echo # foreign_key_checks=0 and unique_checks=0 BINLOG ' dfLtTBMBAAAAKQAAANcAAAAAABcAAAAAAAEABHRlc3QAAnQxAAEDAAE= dfLtTBcBAAAAIgAAAPkAAAAAABcAAAAAAAcAAf/+AQAAAA== '; SELECT * FROM t1; --echo # Their values should be ON SHOW SESSION VARIABLES LIKE "foreign_key_checks"; SHOW SESSION VARIABLES LIKE "unique_checks"; --echo SET @@SESSION.foreign_key_checks= OFF; SET @@SESSION.unique_checks= OFF; --echo # INSERT INTO t1 VALUES(2) --echo # foreign_key_checks=1 and unique_checks=1 BINLOG ' dfLtTBMBAAAAKQAAAKsBAAAAABcAAAAAAAEABHRlc3QAAnQxAAEDAAE= dfLtTBcBAAAAIgAAAM0BAAAAABcAAAAAAAEAAf/+AgAAAA== '; SELECT * FROM t1; --echo # Their values should be OFF SHOW SESSION VARIABLES LIKE "foreign_key_checks"; SHOW SESSION VARIABLES LIKE "unique_checks"; --echo # INSERT INTO t1 VALUES(2) --echo # foreign_key_checks=1 and unique_checks=1 --echo # It should not change current session's variables, even error happens call mtr.add_suppression("BINLOG_BASE64_EVENT.*Could not execute Write_rows_v1 event on table test.t1; Duplicate entry .2. for key .PRIMARY., Error_code: 1062"); --error 1062 BINLOG ' dfLtTBMBAAAAKQAAAKsBAAAAABcAAAAAAAEABHRlc3QAAnQxAAEDAAE= dfLtTBcBAAAAIgAAAM0BAAAAABcAAAAAAAEAAf/+AgAAAA== '; SELECT * FROM t1; --echo # Their values should be OFF SHOW SESSION VARIABLES LIKE "foreign_key_checks"; SHOW SESSION VARIABLES LIKE "unique_checks"; DROP TABLE t1; disconnect fresh; connection default; --echo # --echo # MDEV-25595 DROP part of failed CREATE OR REPLACE is not written into binary log --echo # reset master; --error ER_DUP_FIELDNAME create table t as select 1 as b, 2 as b; create table t (old_table_field int); --error ER_DUP_FIELDNAME create or replace table t as select 1 as b, 2 as b; --error ER_DUP_FIELDNAME create or replace temporary table t as select 1 as b, 2 as b; create table t (new_table_field int); --source include/show_binlog_events.inc # cleanup drop table t;