361 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			361 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | # | ||
|  | # 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 | ||
|  | -- source include/have_debug.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; | ||
|  | 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) engine=innodb; | ||
|  | 
 | ||
|  | let $1=400; | ||
|  | disable_query_log; | ||
|  | begin; | ||
|  | while ($1) | ||
|  | { | ||
|  |  eval insert into t1 values( $1 ); | ||
|  |  dec $1; | ||
|  | } | ||
|  | commit; | ||
|  | 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: see if the truncated value goes | ||
|  | # into binlog (right), or the too big value (wrong); we look at the | ||
|  | # binlog further down with SHOW BINLOG EVENTS. | ||
|  | reset master; | ||
|  | create table t1 (id tinyint auto_increment primary key); | ||
|  | set insert_id=128; | ||
|  | insert into t1 values(null); | ||
|  | select * from t1; | ||
|  | 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'. | ||
|  | 
 | ||
|  | --disable_warnings | ||
|  | USE mysql; | ||
|  | INSERT INTO user SET host='localhost', user='@#@', password=password('Just a test'); | ||
|  | UPDATE user SET password=password('Another password') WHERE host='localhost' AND user='@#@'; | ||
|  | DELETE FROM user WHERE host='localhost' AND user='@#@'; | ||
|  | --enable_warnings | ||
|  | 
 | ||
|  | use test; | ||
|  | source include/show_binlog_events.inc; | ||
|  | drop table t1,t2,t3,tt1; | ||
|  | 
 | ||
|  | -- source extra/binlog_tests/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; | ||
|  | source include/show_master_status.inc; | ||
|  | let $it=4; | ||
|  | while ($it) | ||
|  | { | ||
|  | insert into t3(b) values ('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'); | ||
|  | dec $it; | ||
|  | } | ||
|  | # must show new binlog index after rotating; | ||
|  | source include/show_master_status.inc; | ||
|  | 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 "%_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 "%_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("Slave SQL.*Could not execute Write_rows 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 "%_checks"; | ||
|  | 
 | ||
|  | DROP TABLE t1; | ||
|  | 
 | ||
|  | disconnect fresh; | ||
|  | 
 |