Browse Source
			
			
			MDEV-382: Incorrect quoting
			
				
		MDEV-382: Incorrect quoting
	
		
	
			
				Various places in the server replication code was incorrectly quoting strings, which could lead to incorrect SQL on the slave/mysqlbinlog.pull/843/head
				 39 changed files with 1163 additions and 443 deletions
			
			
		- 
					2include/my_sys.h
 - 
					4mysql-test/r/func_compress.result
 - 
					32mysql-test/r/mysqlbinlog.result
 - 
					70mysql-test/r/mysqlbinlog2.result
 - 
					2mysql-test/r/mysqlbinlog_row.result
 - 
					8mysql-test/r/mysqlbinlog_row_innodb.result
 - 
					8mysql-test/r/mysqlbinlog_row_myisam.result
 - 
					2mysql-test/r/mysqlbinlog_row_trans.result
 - 
					2mysql-test/r/user_var-binlog.result
 - 
					2mysql-test/r/variables.result
 - 
					2mysql-test/suite/binlog/r/binlog_base64_flag.result
 - 
					2mysql-test/suite/binlog/r/binlog_stm_ctype_ucs.result
 - 
					4mysql-test/suite/binlog/r/binlog_stm_mix_innodb_myisam.result
 - 
					275mysql-test/suite/rpl/r/rpl_mdev382.result
 - 
					8mysql-test/suite/rpl/r/rpl_row_mysqlbinlog.result
 - 
					12mysql-test/suite/rpl/r/rpl_sp.result
 - 
					249mysql-test/suite/rpl/t/rpl_mdev382.test
 - 
					54mysys/mf_iocache2.c
 - 
					25sql/ha_ndbcluster_binlog.cc
 - 
					18sql/item.cc
 - 
					1sql/item.h
 - 
					6sql/item_func.cc
 - 
					2sql/item_func.h
 - 
					11sql/log.cc
 - 
					381sql/log_event.cc
 - 
					47sql/log_event.h
 - 
					2sql/log_event_old.cc
 - 
					2sql/log_event_old.h
 - 
					2sql/mysql_priv.h
 - 
					22sql/sql_base.cc
 - 
					41sql/sql_db.cc
 - 
					14sql/sql_insert.cc
 - 
					89sql/sql_load.cc
 - 
					2sql/sql_repl.cc
 - 
					24sql/sql_show.cc
 - 
					28sql/sql_string.cc
 - 
					1sql/sql_string.h
 - 
					21sql/sql_table.cc
 - 
					129strings/my_vsnprintf.c
 
@ -0,0 +1,275 @@ | 
				
			|||
include/master-slave.inc | 
				
			|||
[connection master] | 
				
			|||
create table t1 (a int primary key) engine=innodb; | 
				
			|||
create table t2 (a int primary key) engine=myisam; | 
				
			|||
begin; | 
				
			|||
insert into t1 values (1); | 
				
			|||
SET sql_mode = 'ANSI_QUOTES'; | 
				
			|||
savepoint `a``; create database couldbebadthingshere; savepoint ``dummy`; | 
				
			|||
insert into t1 values (2); | 
				
			|||
insert into t2 values (1); | 
				
			|||
SET sql_mode = ''; | 
				
			|||
rollback to savepoint `a``; create database couldbebadthingshere; savepoint ``dummy`; | 
				
			|||
Warnings: | 
				
			|||
Warning	1196	Some non-transactional changed tables couldn't be rolled back | 
				
			|||
insert into t1 values (3); | 
				
			|||
commit; | 
				
			|||
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 primary key) engine=innodb | 
				
			|||
master-bin.000001	#	Query	#	#	use `test`; create table t2 (a int primary key) engine=myisam | 
				
			|||
master-bin.000001	#	Query	#	#	BEGIN | 
				
			|||
master-bin.000001	#	Query	#	#	use `test`; insert into t1 values (1) | 
				
			|||
master-bin.000001	#	Query	#	#	SAVEPOINT "a`; create database couldbebadthingshere; savepoint `dummy" | 
				
			|||
master-bin.000001	#	Query	#	#	use `test`; insert into t1 values (2) | 
				
			|||
master-bin.000001	#	Query	#	#	use `test`; insert into t2 values (1) | 
				
			|||
master-bin.000001	#	Query	#	#	ROLLBACK TO `a``; create database couldbebadthingshere; savepoint ``dummy` | 
				
			|||
master-bin.000001	#	Query	#	#	use `test`; insert into t1 values (3) | 
				
			|||
master-bin.000001	#	Xid	#	#	COMMIT /* XID */ | 
				
			|||
BEGIN; | 
				
			|||
insert into t1 values(10); | 
				
			|||
set sql_mode = 'ANSI_QUOTES'; | 
				
			|||
set sql_quote_show_create = 1; | 
				
			|||
savepoint a; | 
				
			|||
insert into t1 values(11); | 
				
			|||
savepoint "a""a"; | 
				
			|||
insert into t1 values(12); | 
				
			|||
set sql_quote_show_create = 0; | 
				
			|||
savepoint b; | 
				
			|||
insert into t1 values(13); | 
				
			|||
savepoint "b""b"; | 
				
			|||
insert into t1 values(14); | 
				
			|||
set sql_mode = ''; | 
				
			|||
set sql_quote_show_create = 1; | 
				
			|||
savepoint c; | 
				
			|||
insert into t1 values(15); | 
				
			|||
savepoint `c``c`; | 
				
			|||
insert into t1 values(16); | 
				
			|||
set sql_quote_show_create = 0; | 
				
			|||
savepoint d; | 
				
			|||
insert into t1 values(17); | 
				
			|||
savepoint `d``d`; | 
				
			|||
insert into t1 values(18); | 
				
			|||
COMMIT; | 
				
			|||
set sql_quote_show_create = 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	#	Query	#	#	use `test`; insert into t1 values(10) | 
				
			|||
master-bin.000001	#	Query	#	#	SAVEPOINT "a" | 
				
			|||
master-bin.000001	#	Query	#	#	use `test`; insert into t1 values(11) | 
				
			|||
master-bin.000001	#	Query	#	#	SAVEPOINT "a""a" | 
				
			|||
master-bin.000001	#	Query	#	#	use `test`; insert into t1 values(12) | 
				
			|||
master-bin.000001	#	Query	#	#	SAVEPOINT b | 
				
			|||
master-bin.000001	#	Query	#	#	use `test`; insert into t1 values(13) | 
				
			|||
master-bin.000001	#	Query	#	#	SAVEPOINT "b""b" | 
				
			|||
master-bin.000001	#	Query	#	#	use `test`; insert into t1 values(14) | 
				
			|||
master-bin.000001	#	Query	#	#	SAVEPOINT `c` | 
				
			|||
master-bin.000001	#	Query	#	#	use `test`; insert into t1 values(15) | 
				
			|||
master-bin.000001	#	Query	#	#	SAVEPOINT `c``c` | 
				
			|||
master-bin.000001	#	Query	#	#	use `test`; insert into t1 values(16) | 
				
			|||
master-bin.000001	#	Query	#	#	SAVEPOINT d | 
				
			|||
master-bin.000001	#	Query	#	#	use `test`; insert into t1 values(17) | 
				
			|||
master-bin.000001	#	Query	#	#	SAVEPOINT `d``d` | 
				
			|||
master-bin.000001	#	Query	#	#	use `test`; insert into t1 values(18) | 
				
			|||
master-bin.000001	#	Xid	#	#	COMMIT /* XID */ | 
				
			|||
*** Test correct USE statement in SHOW BINLOG EVENTS *** | 
				
			|||
set sql_mode = 'ANSI_QUOTES'; | 
				
			|||
CREATE DATABASE "db1`; SELECT 'oops!'"; | 
				
			|||
use "db1`; SELECT 'oops!'"; | 
				
			|||
CREATE TABLE t1 (a INT PRIMARY KEY) engine=MyISAM; | 
				
			|||
INSERT INTO t1 VALUES (1); | 
				
			|||
set sql_mode = ''; | 
				
			|||
INSERT INTO t1 VALUES (2); | 
				
			|||
set sql_mode = 'ANSI_QUOTES'; | 
				
			|||
show binlog events from <binlog_start>; | 
				
			|||
Log_name	Pos	Event_type	Server_id	End_log_pos	Info | 
				
			|||
master-bin.000001	#	Query	#	#	CREATE DATABASE "db1`; SELECT 'oops!'" | 
				
			|||
master-bin.000001	#	Query	#	#	use "db1`; SELECT 'oops!'"; CREATE TABLE t1 (a INT PRIMARY KEY) engine=MyISAM | 
				
			|||
master-bin.000001	#	Query	#	#	use "db1`; SELECT 'oops!'"; INSERT INTO t1 VALUES (1) | 
				
			|||
master-bin.000001	#	Query	#	#	use "db1`; SELECT 'oops!'"; INSERT INTO t1 VALUES (2) | 
				
			|||
set sql_mode = ''; | 
				
			|||
set sql_quote_show_create = 0; | 
				
			|||
show binlog events from <binlog_start>; | 
				
			|||
Log_name	Pos	Event_type	Server_id	End_log_pos	Info | 
				
			|||
master-bin.000001	#	Query	#	#	CREATE DATABASE "db1`; SELECT 'oops!'" | 
				
			|||
master-bin.000001	#	Query	#	#	use `db1``; SELECT 'oops!'`; CREATE TABLE t1 (a INT PRIMARY KEY) engine=MyISAM | 
				
			|||
master-bin.000001	#	Query	#	#	use `db1``; SELECT 'oops!'`; INSERT INTO t1 VALUES (1) | 
				
			|||
master-bin.000001	#	Query	#	#	use `db1``; SELECT 'oops!'`; INSERT INTO t1 VALUES (2) | 
				
			|||
set sql_quote_show_create = 1; | 
				
			|||
show binlog events from <binlog_start>; | 
				
			|||
Log_name	Pos	Event_type	Server_id	End_log_pos	Info | 
				
			|||
master-bin.000001	#	Query	#	#	CREATE DATABASE "db1`; SELECT 'oops!'" | 
				
			|||
master-bin.000001	#	Query	#	#	use `db1``; SELECT 'oops!'`; CREATE TABLE t1 (a INT PRIMARY KEY) engine=MyISAM | 
				
			|||
master-bin.000001	#	Query	#	#	use `db1``; SELECT 'oops!'`; INSERT INTO t1 VALUES (1) | 
				
			|||
master-bin.000001	#	Query	#	#	use `db1``; SELECT 'oops!'`; INSERT INTO t1 VALUES (2) | 
				
			|||
DROP TABLE t1; | 
				
			|||
use test; | 
				
			|||
***Test LOAD DATA INFILE with various identifiers that need correct quoting *** | 
				
			|||
use `db1``; SELECT 'oops!'`; | 
				
			|||
set timestamp=1000000000; | 
				
			|||
CREATE TABLE `t``1` (`a``1` VARCHAR(4) PRIMARY KEY, `b``2` VARCHAR(3), | 
				
			|||
`c``3` VARCHAR(7)); | 
				
			|||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/f''le.txt' INTO TABLE `t``1` | 
				
			|||
  FIELDS TERMINATED BY ',' ESCAPED BY '\\' ENCLOSED BY '''' | 
				
			|||
  LINES TERMINATED BY '\n' | 
				
			|||
  (`a``1`, @`b```) SET `b``2` = @`b```, `c``3` = concat('|', "b""a'z", "!"); | 
				
			|||
SELECT * FROM `t``1`; | 
				
			|||
a`1	b`2	c`3 | 
				
			|||
fo\o	bar	|b"a'z! | 
				
			|||
truncate `t``1`; | 
				
			|||
use test; | 
				
			|||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/f''le.txt' | 
				
			|||
  INTO TABLE `db1``; SELECT 'oops!'`.`t``1` | 
				
			|||
  FIELDS TERMINATED BY ',' ESCAPED BY '\\' ENCLOSED BY '''' | 
				
			|||
  LINES TERMINATED BY '\n' | 
				
			|||
  (`a``1`, `b``2`) SET `c``3` = concat('|', "b""a'z", "!"); | 
				
			|||
SELECT * FROM `db1``; SELECT 'oops!'`.`t``1`; | 
				
			|||
a`1	b`2	c`3 | 
				
			|||
fo\o	bar	|b"a'z! | 
				
			|||
show binlog events from <binlog_start>; | 
				
			|||
Log_name	Pos	Event_type	Server_id	End_log_pos	Info | 
				
			|||
master-bin.000001	#	Query	#	#	use `db1``; SELECT 'oops!'`; CREATE TABLE `t``1` (`a``1` VARCHAR(4) PRIMARY KEY, `b``2` VARCHAR(3), | 
				
			|||
`c``3` VARCHAR(7)) | 
				
			|||
master-bin.000001	#	Begin_load_query	#	#	;file_id=#;block_len=# | 
				
			|||
master-bin.000001	#	Execute_load_query	#	#	use `db1``; SELECT 'oops!'`; LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/f\'le.txt' INTO TABLE `t``1` FIELDS TERMINATED BY ',' ENCLOSED BY '\'' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a``1`, @`b```) SET `b``2`=(@`b```), `c``3`=concat('|','b"a\'z','!') ;file_id=# | 
				
			|||
master-bin.000001	#	Query	#	#	use `db1``; SELECT 'oops!'`; truncate `t``1` | 
				
			|||
master-bin.000001	#	Begin_load_query	#	#	;file_id=#;block_len=# | 
				
			|||
master-bin.000001	#	Execute_load_query	#	#	use `test`; LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/f\'le.txt' INTO TABLE `db1``; SELECT 'oops!'`.`t``1` FIELDS TERMINATED BY ',' ENCLOSED BY '\'' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a``1`, `b``2`) SET `c``3`=concat('|','b"a\'z','!') ;file_id=# | 
				
			|||
/*!40019 SET @@session.max_insert_delayed_threads=0*/; | 
				
			|||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; | 
				
			|||
DELIMITER /*!*/; | 
				
			|||
ROLLBACK/*!*/; | 
				
			|||
use `db1``; SELECT 'oops!'`/*!*/; | 
				
			|||
SET TIMESTAMP=1000000000/*!*/; | 
				
			|||
SET @@session.pseudo_thread_id=999999999/*!*/; | 
				
			|||
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/; | 
				
			|||
SET @@session.sql_mode=0/*!*/; | 
				
			|||
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; | 
				
			|||
/*!\C latin1 *//*!*/; | 
				
			|||
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/; | 
				
			|||
SET @@session.lc_time_names=0/*!*/; | 
				
			|||
SET @@session.collation_database=DEFAULT/*!*/; | 
				
			|||
CREATE TABLE `t``1` (`a``1` VARCHAR(4) PRIMARY KEY, `b``2` VARCHAR(3), | 
				
			|||
`c``3` VARCHAR(7)) | 
				
			|||
/*!*/; | 
				
			|||
SET TIMESTAMP=1000000000/*!*/; | 
				
			|||
LOAD DATA LOCAL INFILE '<name>' INTO TABLE `t``1` FIELDS TERMINATED BY ',' ENCLOSED BY '\'' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a``1`, @`b```) SET `b``2`=(@`b```), `c``3`=concat('|','b"a\'z','!') | 
				
			|||
/*!*/; | 
				
			|||
SET TIMESTAMP=1000000000/*!*/; | 
				
			|||
truncate `t``1` | 
				
			|||
/*!*/; | 
				
			|||
use `test`/*!*/; | 
				
			|||
SET TIMESTAMP=1000000000/*!*/; | 
				
			|||
LOAD DATA LOCAL INFILE '<name>' INTO TABLE `db1``; SELECT 'oops!'`.`t``1` FIELDS TERMINATED BY ',' ENCLOSED BY '\'' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a``1`, `b``2`) SET `c``3`=concat('|','b"a\'z','!') | 
				
			|||
/*!*/; | 
				
			|||
DELIMITER ; | 
				
			|||
# End of log file | 
				
			|||
ROLLBACK /* added by mysqlbinlog */; | 
				
			|||
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; | 
				
			|||
SELECT * FROM `db1``; SELECT 'oops!'`.`t``1`; | 
				
			|||
a`1	b`2	c`3 | 
				
			|||
fo\o	bar	|b"a'z! | 
				
			|||
DROP TABLE `db1``; SELECT 'oops!'`.`t``1`; | 
				
			|||
drop table t1,t2; | 
				
			|||
*** Test truncation of long SET expression in LOAD DATA *** | 
				
			|||
CREATE TABLE t1 (a INT PRIMARY KEY, b VARCHAR(1000)); | 
				
			|||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/file.txt' INTO TABLE t1 | 
				
			|||
FIELDS TERMINATED BY ',' | 
				
			|||
  (a, @b) SET b = CONCAT(@b, '| 123456789A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J123456789K123456789L123456789M123456789N123456789O123456789P123456789Q123456789R123456789123456789T123456789U123456789V123456789W123456789X123456789Y123456789Z123456789|', @b); | 
				
			|||
SELECT * FROM t1 ORDER BY a; | 
				
			|||
a	b | 
				
			|||
1	X| 123456789A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J123456789K123456789L123456789M123456789N123456789O123456789P123456789Q123456789R123456789123456789T123456789U123456789V123456789W123456789X123456789Y123456789Z123456789|X | 
				
			|||
2	A| 123456789A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J123456789K123456789L123456789M123456789N123456789O123456789P123456789Q123456789R123456789123456789T123456789U123456789V123456789W123456789X123456789Y123456789Z123456789|A | 
				
			|||
show binlog events from <binlog_start>; | 
				
			|||
Log_name	Pos	Event_type	Server_id	End_log_pos	Info | 
				
			|||
master-bin.000001	#	Begin_load_query	#	#	;file_id=#;block_len=# | 
				
			|||
master-bin.000001	#	Execute_load_query	#	#	use `test`; LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/file.txt' INTO TABLE `t1` FIELDS TERMINATED BY ',' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a`, @`b`) SET `b`=concat((@`b`),'| 123456789A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J123456789K123456789L123456789M123456789N123456789O123456789P123456789Q123456789R123456789123456789T123456789U123456789V123456789W123456789X123456789Y123456789Z123456789|',(@`b`)) ;file_id=# | 
				
			|||
SELECT * FROM t1 ORDER BY a; | 
				
			|||
a	b | 
				
			|||
1	X| 123456789A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J123456789K123456789L123456789M123456789N123456789O123456789P123456789Q123456789R123456789123456789T123456789U123456789V123456789W123456789X123456789Y123456789Z123456789|X | 
				
			|||
2	A| 123456789A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J123456789K123456789L123456789M123456789N123456789O123456789P123456789Q123456789R123456789123456789T123456789U123456789V123456789W123456789X123456789Y123456789Z123456789|A | 
				
			|||
DROP TABLE t1; | 
				
			|||
*** Test user variables whose names require correct quoting *** | 
				
			|||
use `db1``; SELECT 'oops!'`; | 
				
			|||
CREATE TABLE t1 (a1 BIGINT PRIMARY KEY, a2 BIGINT, a3 BIGINT, a4 BIGINT UNSIGNED, b DOUBLE, c DECIMAL(65,10), d VARCHAR(100)); | 
				
			|||
INSERT INTO t1 VALUES (-9223372036854775808,42,9223372036854775807,18446744073709551615,-1234560123456789e110, -1234501234567890123456789012345678901234567890123456789.0123456789, REPEAT("x", 100)); | 
				
			|||
SELECT @`a``1`:=a1, @`a``2`:=a2, @`a``3`:=a3, @`a``4`:=a4, @`b```:=b, @```c`:=c, @```d```:=d FROM t1; | 
				
			|||
@`a``1`:=a1	@`a``2`:=a2	@`a``3`:=a3	@`a``4`:=a4	@`b```:=b	@```c`:=c	@```d```:=d | 
				
			|||
-9223372036854775808	42	9223372036854775807	18446744073709551615	-1.23456012345679e+125	-1234501234567890123456789012345678901234567890123456789.0123456789	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | 
				
			|||
INSERT INTO t1 VALUES (@`a``1`+1, @`a``2`*100, @`a``3`-1, @`a``4`-1, @`b```/2, @```c`, substr(@```d```, 2, 98)); | 
				
			|||
show binlog events from <binlog_start>; | 
				
			|||
Log_name	Pos	Event_type	Server_id	End_log_pos	Info | 
				
			|||
master-bin.000001	#	Query	#	#	use `db1``; SELECT 'oops!'`; CREATE TABLE t1 (a1 BIGINT PRIMARY KEY, a2 BIGINT, a3 BIGINT, a4 BIGINT UNSIGNED, b DOUBLE, c DECIMAL(65,10), d VARCHAR(100)) | 
				
			|||
master-bin.000001	#	Query	#	#	use `db1``; SELECT 'oops!'`; INSERT INTO t1 VALUES (-9223372036854775808,42,9223372036854775807,18446744073709551615,-1234560123456789e110, -1234501234567890123456789012345678901234567890123456789.0123456789, REPEAT("x", 100)) | 
				
			|||
master-bin.000001	#	User var	#	#	@`a``1`=-9223372036854775808 | 
				
			|||
master-bin.000001	#	User var	#	#	@`a``2`=42 | 
				
			|||
master-bin.000001	#	User var	#	#	@`a``3`=9223372036854775807 | 
				
			|||
master-bin.000001	#	User var	#	#	@`a``4`=-1 | 
				
			|||
master-bin.000001	#	User var	#	#	@`b```=-1.2345601234568e+125 | 
				
			|||
master-bin.000001	#	User var	#	#	@```c`=-1234501234567890123456789012345678901234567890123456789.0123456789 | 
				
			|||
master-bin.000001	#	User var	#	#	@```d```=_latin1 0x78787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878 COLLATE latin1_swedish_ci | 
				
			|||
master-bin.000001	#	Query	#	#	use `db1``; SELECT 'oops!'`; INSERT INTO t1 VALUES (@`a``1`+1, @`a``2`*100, @`a``3`-1, @`a``4`-1, @`b```/2, @```c`, substr(@```d```, 2, 98)) | 
				
			|||
/*!40019 SET @@session.max_insert_delayed_threads=0*/; | 
				
			|||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; | 
				
			|||
DELIMITER /*!*/; | 
				
			|||
ROLLBACK/*!*/; | 
				
			|||
use `db1``; SELECT 'oops!'`/*!*/; | 
				
			|||
SET TIMESTAMP=1000000000/*!*/; | 
				
			|||
SET @@session.pseudo_thread_id=999999999/*!*/; | 
				
			|||
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/; | 
				
			|||
SET @@session.sql_mode=0/*!*/; | 
				
			|||
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; | 
				
			|||
/*!\C latin1 *//*!*/; | 
				
			|||
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/; | 
				
			|||
SET @@session.lc_time_names=0/*!*/; | 
				
			|||
SET @@session.collation_database=DEFAULT/*!*/; | 
				
			|||
CREATE TABLE t1 (a1 BIGINT PRIMARY KEY, a2 BIGINT, a3 BIGINT, a4 BIGINT UNSIGNED, b DOUBLE, c DECIMAL(65,10), d VARCHAR(100)) | 
				
			|||
/*!*/; | 
				
			|||
SET TIMESTAMP=1000000000/*!*/; | 
				
			|||
INSERT INTO t1 VALUES (-9223372036854775808,42,9223372036854775807,18446744073709551615,-1234560123456789e110, -1234501234567890123456789012345678901234567890123456789.0123456789, REPEAT("x", 100)) | 
				
			|||
/*!*/; | 
				
			|||
SET @`a``1`:=-9223372036854775808/*!*/; | 
				
			|||
SET @`a``2`:=42/*!*/; | 
				
			|||
SET @`a``3`:=9223372036854775807/*!*/; | 
				
			|||
SET @`a``4`:=-1/*!*/; | 
				
			|||
SET @`b```:=-1.2345601234568e+125/*!*/; | 
				
			|||
SET @```c`:=-1234501234567890123456789012345678901234567890123456789.0123456789/*!*/; | 
				
			|||
SET @```d```:=_latin1 0x78787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878787878 COLLATE `latin1_swedish_ci`/*!*/; | 
				
			|||
SET TIMESTAMP=1000000000/*!*/; | 
				
			|||
INSERT INTO t1 VALUES (@`a``1`+1, @`a``2`*100, @`a``3`-1, @`a``4`-1, @`b```/2, @```c`, substr(@```d```, 2, 98)) | 
				
			|||
/*!*/; | 
				
			|||
DELIMITER ; | 
				
			|||
# End of log file | 
				
			|||
ROLLBACK /* added by mysqlbinlog */; | 
				
			|||
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; | 
				
			|||
SELECT * FROM `db1``; SELECT 'oops!'`.t1 ORDER BY a1; | 
				
			|||
a1	a2	a3	a4	b	c	d | 
				
			|||
-9223372036854775808	42	9223372036854775807	18446744073709551615	-1.23456012345679e+125	-1234501234567890123456789012345678901234567890123456789.0123456789	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | 
				
			|||
-9223372036854775807	4200	9223372036854775806	0	-6.17280061728394e+124	-1234501234567890123456789012345678901234567890123456789.0123456789	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | 
				
			|||
DROP TABLE t1; | 
				
			|||
*** Test correct quoting of DELETE FROM statement binlogged for HEAP table that is emptied due to server restart | 
				
			|||
include/stop_slave.inc | 
				
			|||
CREATE TABLE `db1``; SELECT 'oops!'`.`t``1` (`a``` INT PRIMARY KEY) ENGINE=heap; | 
				
			|||
INSERT INTO `db1``; SELECT 'oops!'`.`t``1` VALUES (1), (2), (5); | 
				
			|||
SELECT * FROM `db1``; SELECT 'oops!'`.`t``1` ORDER BY 1; | 
				
			|||
a` | 
				
			|||
1 | 
				
			|||
2 | 
				
			|||
5 | 
				
			|||
set timestamp=1000000000; | 
				
			|||
# The table should be empty on the master. | 
				
			|||
SELECT * FROM `db1``; SELECT 'oops!'`.`t``1`; | 
				
			|||
a` | 
				
			|||
# The DELETE statement should be correctly quoted | 
				
			|||
show binlog events in 'master-bin.000002' from <binlog_start>; | 
				
			|||
Log_name	Pos	Event_type	Server_id	End_log_pos	Info | 
				
			|||
master-bin.000002	#	Query	#	#	use `test`; DELETE FROM `db1``; SELECT 'oops!'`.`t``1` | 
				
			|||
include/start_slave.inc | 
				
			|||
# The table should be empty on the slave also. | 
				
			|||
SELECT * FROM `db1``; SELECT 'oops!'`.`t``1`; | 
				
			|||
a` | 
				
			|||
DROP TABLE `db1``; SELECT 'oops!'`.`t``1`; | 
				
			|||
use test; | 
				
			|||
DROP DATABASE `db1``; SELECT 'oops!'`; | 
				
			|||
include/rpl_end.inc | 
				
			|||
@ -0,0 +1,249 @@ | 
				
			|||
--source include/have_innodb.inc | 
				
			|||
--source include/not_windows.inc | 
				
			|||
--source include/have_binlog_format_statement.inc | 
				
			|||
--source include/master-slave.inc | 
				
			|||
 | 
				
			|||
# MDEV-382: multiple SQL injections in replication code. | 
				
			|||
 | 
				
			|||
# Test previous SQL injection attack against binlog for SAVEPOINT statement. | 
				
			|||
# The test would cause syntax error on slave due to improper quoting of | 
				
			|||
# the savepoint name. | 
				
			|||
connection master; | 
				
			|||
create table t1 (a int primary key) engine=innodb; | 
				
			|||
create table t2 (a int primary key) engine=myisam; | 
				
			|||
 | 
				
			|||
begin; | 
				
			|||
insert into t1 values (1); | 
				
			|||
SET sql_mode = 'ANSI_QUOTES'; | 
				
			|||
savepoint `a``; create database couldbebadthingshere; savepoint ``dummy`; | 
				
			|||
insert into t1 values (2); | 
				
			|||
insert into t2 values (1); | 
				
			|||
SET sql_mode = ''; | 
				
			|||
rollback to savepoint `a``; create database couldbebadthingshere; savepoint ``dummy`; | 
				
			|||
insert into t1 values (3); | 
				
			|||
commit; | 
				
			|||
 | 
				
			|||
--source include/show_binlog_events.inc | 
				
			|||
 | 
				
			|||
# This failed due to syntax error in query when the bug was not fixed. | 
				
			|||
sync_slave_with_master; | 
				
			|||
connection slave; | 
				
			|||
 | 
				
			|||
# Test some more combinations of ANSI_QUOTES and sql_quote_show_create | 
				
			|||
connection master; | 
				
			|||
let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1); | 
				
			|||
BEGIN; | 
				
			|||
insert into t1 values(10); | 
				
			|||
set sql_mode = 'ANSI_QUOTES'; | 
				
			|||
set sql_quote_show_create = 1; | 
				
			|||
savepoint a; | 
				
			|||
insert into t1 values(11); | 
				
			|||
savepoint "a""a"; | 
				
			|||
insert into t1 values(12); | 
				
			|||
set sql_quote_show_create = 0; | 
				
			|||
savepoint b; | 
				
			|||
insert into t1 values(13); | 
				
			|||
savepoint "b""b"; | 
				
			|||
insert into t1 values(14); | 
				
			|||
set sql_mode = ''; | 
				
			|||
set sql_quote_show_create = 1; | 
				
			|||
savepoint c; | 
				
			|||
insert into t1 values(15); | 
				
			|||
savepoint `c``c`; | 
				
			|||
insert into t1 values(16); | 
				
			|||
set sql_quote_show_create = 0; | 
				
			|||
savepoint d; | 
				
			|||
insert into t1 values(17); | 
				
			|||
savepoint `d``d`; | 
				
			|||
insert into t1 values(18); | 
				
			|||
COMMIT; | 
				
			|||
set sql_quote_show_create = 1; | 
				
			|||
 | 
				
			|||
--source include/show_binlog_events.inc | 
				
			|||
 | 
				
			|||
--echo *** Test correct USE statement in SHOW BINLOG EVENTS *** | 
				
			|||
connection master; | 
				
			|||
let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1); | 
				
			|||
set sql_mode = 'ANSI_QUOTES'; | 
				
			|||
CREATE DATABASE "db1`; SELECT 'oops!'"; | 
				
			|||
use "db1`; SELECT 'oops!'"; | 
				
			|||
CREATE TABLE t1 (a INT PRIMARY KEY) engine=MyISAM; | 
				
			|||
INSERT INTO t1 VALUES (1); | 
				
			|||
set sql_mode = ''; | 
				
			|||
INSERT INTO t1 VALUES (2); | 
				
			|||
set sql_mode = 'ANSI_QUOTES'; | 
				
			|||
--source include/show_binlog_events.inc | 
				
			|||
set sql_mode = ''; | 
				
			|||
set sql_quote_show_create = 0; | 
				
			|||
--source include/show_binlog_events.inc | 
				
			|||
set sql_quote_show_create = 1; | 
				
			|||
--source include/show_binlog_events.inc | 
				
			|||
DROP TABLE t1; | 
				
			|||
 | 
				
			|||
use test; | 
				
			|||
 | 
				
			|||
--echo ***Test LOAD DATA INFILE with various identifiers that need correct quoting *** | 
				
			|||
 | 
				
			|||
--let $load_file= $MYSQLTEST_VARDIR/tmp/f'le.txt | 
				
			|||
--write_file $load_file | 
				
			|||
'fo\\o','bar' | 
				
			|||
EOF | 
				
			|||
--exec chmod go+r "$load_file" | 
				
			|||
 | 
				
			|||
use `db1``; SELECT 'oops!'`; | 
				
			|||
let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1); | 
				
			|||
set timestamp=1000000000; | 
				
			|||
CREATE TABLE `t``1` (`a``1` VARCHAR(4) PRIMARY KEY, `b``2` VARCHAR(3), | 
				
			|||
    `c``3` VARCHAR(7)); | 
				
			|||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR | 
				
			|||
eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/f''le.txt' INTO TABLE `t``1` | 
				
			|||
  FIELDS TERMINATED BY ',' ESCAPED BY '\\\\' ENCLOSED BY '''' | 
				
			|||
  LINES TERMINATED BY '\\n' | 
				
			|||
  (`a``1`, @`b```) SET `b``2` = @`b```, `c``3` = concat('|', "b""a'z", "!"); | 
				
			|||
 | 
				
			|||
SELECT * FROM `t``1`; | 
				
			|||
# Also test when code prefixes table name with database. | 
				
			|||
truncate `t``1`; | 
				
			|||
use test; | 
				
			|||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR | 
				
			|||
eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/f''le.txt' | 
				
			|||
  INTO TABLE `db1``; SELECT 'oops!'`.`t``1` | 
				
			|||
  FIELDS TERMINATED BY ',' ESCAPED BY '\\\\' ENCLOSED BY '''' | 
				
			|||
  LINES TERMINATED BY '\\n' | 
				
			|||
  (`a``1`, `b``2`) SET `c``3` = concat('|', "b""a'z", "!"); | 
				
			|||
SELECT * FROM `db1``; SELECT 'oops!'`.`t``1`; | 
				
			|||
let $pos2= query_get_value(SHOW MASTER STATUS, Position, 1); | 
				
			|||
 | 
				
			|||
--source include/show_binlog_events.inc | 
				
			|||
let $MYSQLD_DATADIR= `select @@datadir`; | 
				
			|||
--replace_regex /LOCAL INFILE '.*SQL_LOAD.*' INTO/LOCAL INFILE '<name>' INTO/ | 
				
			|||
--exec $MYSQL_BINLOG --short-form --start-position=$binlog_start --stop-position=$pos2 $MYSQLD_DATADIR/master-bin.000001 | 
				
			|||
 | 
				
			|||
sync_slave_with_master; | 
				
			|||
connection slave; | 
				
			|||
SELECT * FROM `db1``; SELECT 'oops!'`.`t``1`; | 
				
			|||
connection master; | 
				
			|||
 | 
				
			|||
DROP TABLE `db1``; SELECT 'oops!'`.`t``1`; | 
				
			|||
--remove_file $load_file | 
				
			|||
 | 
				
			|||
connection master; | 
				
			|||
drop table t1,t2; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
--echo *** Test truncation of long SET expression in LOAD DATA *** | 
				
			|||
CREATE TABLE t1 (a INT PRIMARY KEY, b VARCHAR(1000)); | 
				
			|||
--let $load_file= $MYSQLTEST_VARDIR/tmp/file.txt | 
				
			|||
--write_file $load_file | 
				
			|||
1,X | 
				
			|||
2,A | 
				
			|||
EOF | 
				
			|||
--exec chmod go+r "$load_file" | 
				
			|||
 | 
				
			|||
let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1); | 
				
			|||
# The bug was that the SET expression was truncated to 256 bytes, so test with | 
				
			|||
# an expression longer than that. | 
				
			|||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR | 
				
			|||
eval LOAD DATA INFILE '$load_file' INTO TABLE t1 | 
				
			|||
  FIELDS TERMINATED BY ',' | 
				
			|||
  (a, @b) SET b = CONCAT(@b, '| 123456789A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J123456789K123456789L123456789M123456789N123456789O123456789P123456789Q123456789R123456789123456789T123456789U123456789V123456789W123456789X123456789Y123456789Z123456789|', @b); | 
				
			|||
 | 
				
			|||
SELECT * FROM t1 ORDER BY a; | 
				
			|||
--source include/show_binlog_events.inc | 
				
			|||
 | 
				
			|||
sync_slave_with_master; | 
				
			|||
connection slave; | 
				
			|||
SELECT * FROM t1 ORDER BY a; | 
				
			|||
 | 
				
			|||
connection master; | 
				
			|||
--remove_file $load_file | 
				
			|||
DROP TABLE t1; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
--echo *** Test user variables whose names require correct quoting *** | 
				
			|||
use `db1``; SELECT 'oops!'`; | 
				
			|||
let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1); | 
				
			|||
CREATE TABLE t1 (a1 BIGINT PRIMARY KEY, a2 BIGINT, a3 BIGINT, a4 BIGINT UNSIGNED, b DOUBLE, c DECIMAL(65,10), d VARCHAR(100)); | 
				
			|||
INSERT INTO t1 VALUES (-9223372036854775808,42,9223372036854775807,18446744073709551615,-1234560123456789e110, -1234501234567890123456789012345678901234567890123456789.0123456789, REPEAT("x", 100)); | 
				
			|||
SELECT @`a``1`:=a1, @`a``2`:=a2, @`a``3`:=a3, @`a``4`:=a4, @`b```:=b, @```c`:=c, @```d```:=d FROM t1; | 
				
			|||
INSERT INTO t1 VALUES (@`a``1`+1, @`a``2`*100, @`a``3`-1, @`a``4`-1, @`b```/2, @```c`, substr(@```d```, 2, 98)); | 
				
			|||
let $pos2= query_get_value(SHOW MASTER STATUS, Position, 1); | 
				
			|||
 | 
				
			|||
--source include/show_binlog_events.inc | 
				
			|||
 | 
				
			|||
--exec $MYSQL_BINLOG --short-form --start-position=$binlog_start --stop-position=$pos2 $MYSQLD_DATADIR/master-bin.000001 | 
				
			|||
 | 
				
			|||
sync_slave_with_master; | 
				
			|||
connection slave; | 
				
			|||
SELECT * FROM `db1``; SELECT 'oops!'`.t1 ORDER BY a1; | 
				
			|||
 | 
				
			|||
connection master; | 
				
			|||
DROP TABLE t1; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
--echo *** Test correct quoting of DELETE FROM statement binlogged for HEAP table that is emptied due to server restart | 
				
			|||
 | 
				
			|||
# Let's keep the slave stopped during master restart, to avoid any potential | 
				
			|||
# races between slave reconnect and master restart. | 
				
			|||
connection slave; | 
				
			|||
--source include/stop_slave.inc | 
				
			|||
 | 
				
			|||
connection master; | 
				
			|||
CREATE TABLE `db1``; SELECT 'oops!'`.`t``1` (`a``` INT PRIMARY KEY) ENGINE=heap; | 
				
			|||
INSERT INTO `db1``; SELECT 'oops!'`.`t``1` VALUES (1), (2), (5); | 
				
			|||
SELECT * FROM `db1``; SELECT 'oops!'`.`t``1` ORDER BY 1; | 
				
			|||
 | 
				
			|||
# Restart the master mysqld. | 
				
			|||
# This will cause an implicit truncation of the memory-based table, which will | 
				
			|||
# cause logging of an explicit DELETE FROM to binlog. | 
				
			|||
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect | 
				
			|||
wait-rpl_mdev382.test | 
				
			|||
EOF | 
				
			|||
 | 
				
			|||
--shutdown_server 30 | 
				
			|||
 | 
				
			|||
--remove_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect | 
				
			|||
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect | 
				
			|||
restart-rpl_mdev382.test | 
				
			|||
EOF | 
				
			|||
 | 
				
			|||
connection default; | 
				
			|||
--enable_reconnect | 
				
			|||
--source include/wait_until_connected_again.inc | 
				
			|||
# rpl_end.inc needs to use the connection server_1 | 
				
			|||
connection server_1; | 
				
			|||
--enable_reconnect | 
				
			|||
--source include/wait_until_connected_again.inc | 
				
			|||
connection master; | 
				
			|||
--enable_reconnect | 
				
			|||
--source include/wait_until_connected_again.inc | 
				
			|||
set timestamp=1000000000; | 
				
			|||
 | 
				
			|||
--echo # The table should be empty on the master. | 
				
			|||
let $binlog_file= master-bin.000002; | 
				
			|||
let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1); | 
				
			|||
SELECT * FROM `db1``; SELECT 'oops!'`.`t``1`; | 
				
			|||
 | 
				
			|||
--echo # The DELETE statement should be correctly quoted | 
				
			|||
--source include/show_binlog_events.inc | 
				
			|||
 | 
				
			|||
connection slave; | 
				
			|||
--source include/start_slave.inc | 
				
			|||
 | 
				
			|||
connection master; | 
				
			|||
sync_slave_with_master; | 
				
			|||
connection slave; | 
				
			|||
--echo # The table should be empty on the slave also. | 
				
			|||
SELECT * FROM `db1``; SELECT 'oops!'`.`t``1`; | 
				
			|||
 | 
				
			|||
connection master; | 
				
			|||
DROP TABLE `db1``; SELECT 'oops!'`.`t``1`; | 
				
			|||
sync_slave_with_master; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
connection master; | 
				
			|||
use test; | 
				
			|||
DROP DATABASE `db1``; SELECT 'oops!'`; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
--source include/rpl_end.inc | 
				
			|||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue