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.
This commit is contained in:
parent
34f2f8ea41
commit
cdeabcfd43
@ -806,6 +806,8 @@ extern size_t my_b_fill(IO_CACHE *info);
|
||||
extern void my_b_seek(IO_CACHE *info,my_off_t pos);
|
||||
extern size_t my_b_gets(IO_CACHE *info, char *to, size_t max_length);
|
||||
extern my_off_t my_b_filelength(IO_CACHE *info);
|
||||
extern size_t my_b_write_backtick_quote(IO_CACHE *info, const char *str,
|
||||
size_t len);
|
||||
extern size_t my_b_printf(IO_CACHE *info, const char* fmt, ...);
|
||||
extern size_t my_b_vprintf(IO_CACHE *info, const char* fmt, va_list ap);
|
||||
extern int init_strvar_from_file(char *var, int max_size, IO_CACHE *f,
|
||||
|
@ -11,7 +11,7 @@ explain extended select uncompress(compress(@test_compress_string));
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
Warnings:
|
||||
Note 1003 select uncompress(compress((@test_compress_string))) AS `uncompress(compress(@test_compress_string))`
|
||||
Note 1003 select uncompress(compress((@`test_compress_string`))) AS `uncompress(compress(@test_compress_string))`
|
||||
select uncompressed_length(compress(@test_compress_string))=length(@test_compress_string);
|
||||
uncompressed_length(compress(@test_compress_string))=length(@test_compress_string)
|
||||
1
|
||||
@ -19,7 +19,7 @@ explain extended select uncompressed_length(compress(@test_compress_string))=len
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
Warnings:
|
||||
Note 1003 select (uncompressed_length(compress((@test_compress_string))) = length((@test_compress_string))) AS `uncompressed_length(compress(@test_compress_string))=length(@test_compress_string)`
|
||||
Note 1003 select (uncompressed_length(compress((@`test_compress_string`))) = length((@`test_compress_string`))) AS `uncompressed_length(compress(@test_compress_string))=length(@test_compress_string)`
|
||||
select uncompressed_length(compress(@test_compress_string));
|
||||
uncompressed_length(compress(@test_compress_string))
|
||||
117
|
||||
|
@ -18,7 +18,7 @@ flush logs;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
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/*!*/;
|
||||
@ -64,7 +64,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
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/*!*/;
|
||||
@ -97,7 +97,7 @@ Warning: The option '--position' is deprecated and will be removed in a future r
|
||||
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
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/*!*/;
|
||||
@ -119,7 +119,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
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/*!*/;
|
||||
@ -165,7 +165,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
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/*!*/;
|
||||
@ -198,7 +198,7 @@ Warning: The option '--position' is deprecated and will be removed in a future r
|
||||
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
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/*!*/;
|
||||
@ -220,7 +220,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1108844556/*!*/;
|
||||
SET @@session.pseudo_thread_id=999999999/*!*/;
|
||||
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
|
||||
@ -239,7 +239,7 @@ Warning: The option '--position' is deprecated and will be removed in a future r
|
||||
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1108844556/*!*/;
|
||||
SET @@session.pseudo_thread_id=999999999/*!*/;
|
||||
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
|
||||
@ -299,7 +299,7 @@ ERROR 42000: PROCEDURE test.p1 does not exist
|
||||
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
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/*!*/;
|
||||
@ -349,7 +349,7 @@ flush logs;
|
||||
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
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/*!*/;
|
||||
@ -484,7 +484,7 @@ FLUSH LOGS;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1253783037/*!*/;
|
||||
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/*!*/;
|
||||
@ -581,22 +581,22 @@ SET @@session.lc_time_names=0/*!*/;
|
||||
SET @@session.collation_database=DEFAULT/*!*/;
|
||||
BEGIN
|
||||
/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1266652094/*!*/;
|
||||
SavePoint mixed_cases
|
||||
/*!*/;
|
||||
use db1/*!*/;
|
||||
use `db1`/*!*/;
|
||||
SET TIMESTAMP=1266652094/*!*/;
|
||||
INSERT INTO db1.t2 VALUES("in savepoint mixed_cases")
|
||||
/*!*/;
|
||||
SET TIMESTAMP=1266652094/*!*/;
|
||||
INSERT INTO db1.t1 VALUES(40)
|
||||
/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1266652094/*!*/;
|
||||
ROLLBACK TO mixed_cases
|
||||
/*!*/;
|
||||
use db1/*!*/;
|
||||
use `db1`/*!*/;
|
||||
SET TIMESTAMP=1266652094/*!*/;
|
||||
INSERT INTO db1.t2 VALUES("after rollback to")
|
||||
/*!*/;
|
||||
@ -624,7 +624,7 @@ SET @@session.lc_time_names=0/*!*/;
|
||||
SET @@session.collation_database=DEFAULT/*!*/;
|
||||
BEGIN
|
||||
/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1266652094/*!*/;
|
||||
SavePoint mixed_cases
|
||||
/*!*/;
|
||||
|
@ -19,7 +19,7 @@ insert into t1 values(null, "f");
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
@ -62,7 +62,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
SET INSERT_ID=1/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
@ -101,7 +101,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
SET INSERT_ID=4/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609946/*!*/;
|
||||
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/*!*/;
|
||||
@ -127,7 +127,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
@ -162,7 +162,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
SET INSERT_ID=4/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609946/*!*/;
|
||||
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/*!*/;
|
||||
@ -185,7 +185,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
SET INSERT_ID=3/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609944/*!*/;
|
||||
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/*!*/;
|
||||
@ -215,7 +215,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
@ -246,7 +246,7 @@ flush logs;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
@ -281,7 +281,7 @@ insert into t1 values(null, "e")
|
||||
DELIMITER ;
|
||||
DELIMITER /*!*/;
|
||||
SET INSERT_ID=6/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609943/*!*/;
|
||||
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/*!*/;
|
||||
@ -304,7 +304,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
SET INSERT_ID=1/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
@ -335,7 +335,7 @@ insert into t1 values(null, "e")
|
||||
DELIMITER ;
|
||||
DELIMITER /*!*/;
|
||||
SET INSERT_ID=6/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609943/*!*/;
|
||||
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/*!*/;
|
||||
@ -358,7 +358,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
SET INSERT_ID=4/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609946/*!*/;
|
||||
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/*!*/;
|
||||
@ -377,7 +377,7 @@ insert into t1 values(null, "e")
|
||||
DELIMITER ;
|
||||
DELIMITER /*!*/;
|
||||
SET INSERT_ID=6/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609943/*!*/;
|
||||
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/*!*/;
|
||||
@ -399,7 +399,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
@ -445,7 +445,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
SET INSERT_ID=3/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609944/*!*/;
|
||||
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/*!*/;
|
||||
@ -468,7 +468,7 @@ insert into t1 values(null, "e")
|
||||
DELIMITER ;
|
||||
DELIMITER /*!*/;
|
||||
SET INSERT_ID=6/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609943/*!*/;
|
||||
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/*!*/;
|
||||
@ -490,7 +490,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
@ -520,7 +520,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
@ -563,7 +563,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
SET INSERT_ID=1/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
@ -601,7 +601,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
SET INSERT_ID=4/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609946/*!*/;
|
||||
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/*!*/;
|
||||
@ -627,7 +627,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
@ -661,7 +661,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
SET INSERT_ID=4/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609946/*!*/;
|
||||
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/*!*/;
|
||||
@ -684,7 +684,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
SET INSERT_ID=3/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609944/*!*/;
|
||||
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/*!*/;
|
||||
@ -714,7 +714,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
@ -744,7 +744,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
@ -779,7 +779,7 @@ insert into t1 values(null, "e")
|
||||
DELIMITER ;
|
||||
DELIMITER /*!*/;
|
||||
SET INSERT_ID=6/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609943/*!*/;
|
||||
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/*!*/;
|
||||
@ -802,7 +802,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
SET INSERT_ID=1/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
@ -833,7 +833,7 @@ insert into t1 values(null, "e")
|
||||
DELIMITER ;
|
||||
DELIMITER /*!*/;
|
||||
SET INSERT_ID=6/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609943/*!*/;
|
||||
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/*!*/;
|
||||
@ -855,7 +855,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
SET INSERT_ID=4/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609946/*!*/;
|
||||
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/*!*/;
|
||||
@ -874,7 +874,7 @@ insert into t1 values(null, "e")
|
||||
DELIMITER ;
|
||||
DELIMITER /*!*/;
|
||||
SET INSERT_ID=6/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609943/*!*/;
|
||||
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/*!*/;
|
||||
@ -896,7 +896,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
@ -942,7 +942,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
SET INSERT_ID=3/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609944/*!*/;
|
||||
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/*!*/;
|
||||
@ -965,7 +965,7 @@ insert into t1 values(null, "e")
|
||||
DELIMITER ;
|
||||
DELIMITER /*!*/;
|
||||
SET INSERT_ID=6/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609943/*!*/;
|
||||
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/*!*/;
|
||||
@ -987,7 +987,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
@ -1017,7 +1017,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1579609942/*!*/;
|
||||
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/*!*/;
|
||||
|
@ -336,7 +336,7 @@ DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1000000000/*!*/;
|
||||
SET @@session.pseudo_thread_id=#/*!*/;
|
||||
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
|
||||
|
@ -2253,7 +2253,7 @@ DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1000000000/*!*/;
|
||||
SET @@session.pseudo_thread_id=#/*!*/;
|
||||
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
|
||||
@ -3876,7 +3876,7 @@ DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1000000000/*!*/;
|
||||
SET @@session.pseudo_thread_id=#/*!*/;
|
||||
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
|
||||
@ -4243,7 +4243,7 @@ DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1000000000/*!*/;
|
||||
SET @@session.pseudo_thread_id=#/*!*/;
|
||||
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
|
||||
@ -4804,7 +4804,7 @@ DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1000000000/*!*/;
|
||||
SET @@session.pseudo_thread_id=#/*!*/;
|
||||
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
|
||||
|
@ -2253,7 +2253,7 @@ DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1000000000/*!*/;
|
||||
SET @@session.pseudo_thread_id=#/*!*/;
|
||||
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
|
||||
@ -3898,7 +3898,7 @@ DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1000000000/*!*/;
|
||||
SET @@session.pseudo_thread_id=#/*!*/;
|
||||
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
|
||||
@ -4271,7 +4271,7 @@ DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1000000000/*!*/;
|
||||
SET @@session.pseudo_thread_id=#/*!*/;
|
||||
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
|
||||
@ -4842,7 +4842,7 @@ DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1000000000/*!*/;
|
||||
SET @@session.pseudo_thread_id=#/*!*/;
|
||||
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
|
||||
|
@ -132,7 +132,7 @@ DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
# at #
|
||||
#010909 4:46:40 server id 1 end_log_pos # Query thread_id=# exec_time=# error_code=0
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=1000000000/*!*/;
|
||||
SET @@session.pseudo_thread_id=#/*!*/;
|
||||
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
|
||||
|
@ -19,7 +19,7 @@ flush logs;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
SET @`a b`:=_latin1 0x68656C6C6F COLLATE `latin1_swedish_ci`/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=10000/*!*/;
|
||||
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/*!*/;
|
||||
|
@ -76,7 +76,7 @@ explain extended select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
Warnings:
|
||||
Note 1003 select (@t1:=((@t2:=1) + (@t3:=4))) AS `@t1:=(@t2:=1)+@t3:=4`,(@t1) AS `@t1`,(@t2) AS `@t2`,(@t3) AS `@t3`
|
||||
Note 1003 select (@t1:=((@t2:=1) + (@t3:=4))) AS `@t1:=(@t2:=1)+@t3:=4`,(@`t1`) AS `@t1`,(@`t2`) AS `@t2`,(@`t3`) AS `@t3`
|
||||
select @t5;
|
||||
@t5
|
||||
1.23456
|
||||
|
@ -35,7 +35,7 @@ DELIMITER /*!*/;
|
||||
# at 4
|
||||
<#>ROLLBACK/*!*/;
|
||||
# at 102
|
||||
<#>use test/*!*/;
|
||||
<#>use `test`/*!*/;
|
||||
SET TIMESTAMP=1196959712/*!*/;
|
||||
<#>SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
|
||||
SET @@session.sql_mode=0/*!*/;
|
||||
|
@ -13,7 +13,7 @@ flush logs;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
SET @`v`:=_ucs2 0x006100620063 COLLATE `ucs2_general_ci`/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=10000/*!*/;
|
||||
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/*!*/;
|
||||
|
@ -631,7 +631,7 @@ master-bin.000001 # Query # # BEGIN
|
||||
master-bin.000001 # Intvar # # INSERT_ID=10
|
||||
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
||||
master-bin.000001 # Intvar # # INSERT_ID=10
|
||||
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE '../../std_data/rpl_loaddata.dat' INTO TABLE `t4` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a`, @b) SET `b`=((@b) + `bug27417`(2)) ;file_id=#
|
||||
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE '../../std_data/rpl_loaddata.dat' INTO TABLE `t4` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a`, @`b`) SET `b`=((@`b`) + `bug27417`(2)) ;file_id=#
|
||||
master-bin.000001 # Query # # ROLLBACK
|
||||
/* the output must denote there is the query */;
|
||||
drop trigger trg_del_t2;
|
||||
@ -869,7 +869,7 @@ master-bin.000001 # User var # # @`b`=_latin1 0x3135 COLLATE latin1_swedish_ci
|
||||
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
||||
master-bin.000001 # Intvar # # INSERT_ID=10
|
||||
master-bin.000001 # User var # # @`b`=_latin1 0x3135 COLLATE latin1_swedish_ci
|
||||
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE '../../std_data/rpl_loaddata.dat' INTO TABLE `t4` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a`, @b) SET `b`=((@b) + `bug27417`(2)) ;file_id=#
|
||||
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE '../../std_data/rpl_loaddata.dat' INTO TABLE `t4` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a`, @`b`) SET `b`=((@`b`) + `bug27417`(2)) ;file_id=#
|
||||
master-bin.000001 # Query # # ROLLBACK
|
||||
drop trigger trg_del_t2;
|
||||
drop table t1,t2,t3,t4,t5;
|
||||
|
275
mysql-test/suite/rpl/r/rpl_mdev382.result
Normal file
275
mysql-test/suite/rpl/r/rpl_mdev382.result
Normal file
@ -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
|
@ -153,7 +153,7 @@ Warning: The option '--position' is deprecated and will be removed in a future r
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
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/*!*/;
|
||||
@ -175,7 +175,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
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/*!*/;
|
||||
@ -284,7 +284,7 @@ ROLLBACK /* added by mysqlbinlog */;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
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/*!*/;
|
||||
@ -316,7 +316,7 @@ Warning: The option '--position' is deprecated and will be removed in a future r
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
DELIMITER /*!*/;
|
||||
ROLLBACK/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
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/*!*/;
|
||||
|
@ -627,7 +627,7 @@ drop database if exists mysqltest1
|
||||
SET TIMESTAMP=t/*!*/;
|
||||
create database mysqltest1
|
||||
/*!*/;
|
||||
use mysqltest1/*!*/;
|
||||
use `mysqltest1`/*!*/;
|
||||
SET TIMESTAMP=t/*!*/;
|
||||
create table t1 (a varchar(100))
|
||||
/*!*/;
|
||||
@ -840,7 +840,7 @@ drop database mysqltest1
|
||||
SET TIMESTAMP=t/*!*/;
|
||||
drop user "zedjzlcsjhd"@127.0.0.1
|
||||
/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=t/*!*/;
|
||||
drop function if exists f1
|
||||
/*!*/;
|
||||
@ -925,7 +925,7 @@ create database mysqltest
|
||||
SET TIMESTAMP=t/*!*/;
|
||||
create database mysqltest2
|
||||
/*!*/;
|
||||
use mysqltest2/*!*/;
|
||||
use `mysqltest2`/*!*/;
|
||||
SET TIMESTAMP=t/*!*/;
|
||||
create table t ( t integer )
|
||||
/*!*/;
|
||||
@ -943,7 +943,7 @@ insert into t values (1);
|
||||
return 0;
|
||||
end
|
||||
/*!*/;
|
||||
use mysqltest/*!*/;
|
||||
use `mysqltest`/*!*/;
|
||||
SET TIMESTAMP=t/*!*/;
|
||||
SELECT `mysqltest2`.`f1`()
|
||||
/*!*/;
|
||||
@ -953,14 +953,14 @@ drop database mysqltest
|
||||
SET TIMESTAMP=t/*!*/;
|
||||
drop database mysqltest2
|
||||
/*!*/;
|
||||
use test/*!*/;
|
||||
use `test`/*!*/;
|
||||
SET TIMESTAMP=t/*!*/;
|
||||
CREATE DEFINER=`root`@`localhost` PROCEDURE `mysqltestbug36570_p1`()
|
||||
begin
|
||||
select 1;
|
||||
end
|
||||
/*!*/;
|
||||
use mysql/*!*/;
|
||||
use `mysql`/*!*/;
|
||||
SET TIMESTAMP=t/*!*/;
|
||||
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`.` mysqltestbug36570_p2`( a int)
|
||||
`label`:
|
||||
|
249
mysql-test/suite/rpl/t/rpl_mdev382.test
Normal file
249
mysql-test/suite/rpl/t/rpl_mdev382.test
Normal file
@ -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
|
@ -284,6 +284,40 @@ my_off_t my_b_filelength(IO_CACHE *info)
|
||||
}
|
||||
|
||||
|
||||
size_t
|
||||
my_b_write_backtick_quote(IO_CACHE *info, const char *str, size_t len)
|
||||
{
|
||||
const uchar *start;
|
||||
const uchar *p= (const uchar *)str;
|
||||
const uchar *end= p + len;
|
||||
size_t count;
|
||||
size_t total= 0;
|
||||
|
||||
if (my_b_write(info, (uchar *)"`", 1))
|
||||
return (size_t)-1;
|
||||
++total;
|
||||
for (;;)
|
||||
{
|
||||
start= p;
|
||||
while (p < end && *p != '`')
|
||||
++p;
|
||||
count= p - start;
|
||||
if (count && my_b_write(info, start, count))
|
||||
return (size_t)-1;
|
||||
total+= count;
|
||||
if (p >= end)
|
||||
break;
|
||||
if (my_b_write(info, (uchar *)"``", 2))
|
||||
return (size_t)-1;
|
||||
total+= 2;
|
||||
++p;
|
||||
}
|
||||
if (my_b_write(info, (uchar *)"`", 1))
|
||||
return (size_t)-1;
|
||||
++total;
|
||||
return total;
|
||||
}
|
||||
|
||||
/*
|
||||
Simple printf version. Supports '%s', '%d', '%u', "%ld" and "%lu"
|
||||
Used for logging in MySQL
|
||||
@ -308,6 +342,7 @@ size_t my_b_vprintf(IO_CACHE *info, const char* fmt, va_list args)
|
||||
uint minimum_width_sign;
|
||||
uint precision; /* as yet unimplemented for anything but %b */
|
||||
my_bool is_zero_padded;
|
||||
my_bool backtick_quoting;
|
||||
|
||||
/*
|
||||
Store the location of the beginning of a format directive, for the
|
||||
@ -342,6 +377,7 @@ size_t my_b_vprintf(IO_CACHE *info, const char* fmt, va_list args)
|
||||
fmt++;
|
||||
|
||||
is_zero_padded= FALSE;
|
||||
backtick_quoting= FALSE;
|
||||
minimum_width_sign= 1;
|
||||
minimum_width= 0;
|
||||
precision= 0;
|
||||
@ -354,6 +390,8 @@ process_flags:
|
||||
minimum_width_sign= -1; fmt++; goto process_flags;
|
||||
case '0':
|
||||
is_zero_padded= TRUE; fmt++; goto process_flags;
|
||||
case '`':
|
||||
backtick_quoting= TRUE; fmt++; goto process_flags;
|
||||
case '#':
|
||||
/** @todo Implement "#" conversion flag. */ fmt++; goto process_flags;
|
||||
case ' ':
|
||||
@ -397,9 +435,19 @@ process_flags:
|
||||
reg2 char *par = va_arg(args, char *);
|
||||
size_t length2 = strlen(par);
|
||||
/* TODO: implement precision */
|
||||
out_length+= length2;
|
||||
if (my_b_write(info, (uchar*) par, length2))
|
||||
goto err;
|
||||
if (backtick_quoting)
|
||||
{
|
||||
size_t total= my_b_write_backtick_quote(info, (uchar *) par, length2);
|
||||
if (total == (size_t)-1)
|
||||
goto err;
|
||||
out_length+= total;
|
||||
}
|
||||
else
|
||||
{
|
||||
out_length+= length2;
|
||||
if (my_b_write(info, (uchar*) par, length2))
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
else if (*fmt == 'b') /* Sized buffer parameter, only precision makes sense */
|
||||
{
|
||||
|
@ -1268,7 +1268,9 @@ int ndbcluster_log_schema_op(THD *thd, NDB_SHARE *share,
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
char tmp_buf2[FN_REFLEN];
|
||||
char tmp_buf2_mem[FN_REFLEN];
|
||||
String tmp_buf2(tmp_buf2_mem, sizeof(tmp_buf2_mem), system_charset_info);
|
||||
tmp_buf2.length(0);
|
||||
const char *type_str;
|
||||
switch (type)
|
||||
{
|
||||
@ -1277,17 +1279,24 @@ int ndbcluster_log_schema_op(THD *thd, NDB_SHARE *share,
|
||||
if (thd->lex->sql_command == SQLCOM_DROP_DB)
|
||||
DBUG_RETURN(0);
|
||||
/* redo the drop table query as is may contain several tables */
|
||||
query= tmp_buf2;
|
||||
query_length= (uint) (strxmov(tmp_buf2, "drop table `",
|
||||
table_name, "`", NullS) - tmp_buf2);
|
||||
tmp_buf2.append(STRING_WITH_LEN("drop table "));
|
||||
append_identifier(thd, &tmp_buf2, table_name, strlen(table_name));
|
||||
query= tmp_buf2.c_ptr_safe();
|
||||
query_length= tmp_buf2.length();
|
||||
type_str= "drop table";
|
||||
break;
|
||||
case SOT_RENAME_TABLE:
|
||||
/* redo the rename table query as is may contain several tables */
|
||||
query= tmp_buf2;
|
||||
query_length= (uint) (strxmov(tmp_buf2, "rename table `",
|
||||
db, ".", table_name, "` to `",
|
||||
new_db, ".", new_table_name, "`", NullS) - tmp_buf2);
|
||||
tmp_buf2.append(STRING_WITH_LEN("rename table "));
|
||||
append_identifier(thd, &tmp_buf2, db, strlen(db));
|
||||
tmp_buf2.append(STRING_WITH_LEN("."));
|
||||
append_identifier(thd, &tmp_buf2, table_name, strlen(table_name));
|
||||
tmp_buf2.append(STRING_WITH_LEN(" to "));
|
||||
append_identifier(thd, &tmp_buf2, new_db, strlen(new_db));
|
||||
tmp_buf2.append(STRING_WITH_LEN("."));
|
||||
append_identifier(thd, &tmp_buf2, new_table_name, strlen(new_table_name));
|
||||
query= tmp_buf2.c_ptr_safe();
|
||||
query_length= tmp_buf2.length();
|
||||
type_str= "rename table";
|
||||
break;
|
||||
case SOT_CREATE_TABLE:
|
||||
|
18
sql/item.cc
18
sql/item.cc
@ -749,15 +749,31 @@ void Item::set_name(const char *str, uint length, CHARSET_INFO *cs)
|
||||
if (!my_charset_same(cs, system_charset_info))
|
||||
{
|
||||
size_t res_length;
|
||||
name= sql_strmake_with_convert(str, name_length= length, cs,
|
||||
name= sql_strmake_with_convert(str, length, cs,
|
||||
MAX_ALIAS_NAME, system_charset_info,
|
||||
&res_length);
|
||||
name_length= res_length;
|
||||
}
|
||||
else
|
||||
name= sql_strmake(str, (name_length= min(length,MAX_ALIAS_NAME)));
|
||||
}
|
||||
|
||||
|
||||
void Item::set_name_no_truncate(const char *str, uint length, CHARSET_INFO *cs)
|
||||
{
|
||||
if (!my_charset_same(cs, system_charset_info))
|
||||
{
|
||||
size_t res_length;
|
||||
name= sql_strmake_with_convert(str, length, cs,
|
||||
UINT_MAX, system_charset_info,
|
||||
&res_length);
|
||||
name_length= res_length;
|
||||
}
|
||||
else
|
||||
name= sql_strmake(str, (name_length= length));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@details
|
||||
This function is called when:
|
||||
|
@ -554,6 +554,7 @@ public:
|
||||
#endif
|
||||
} /*lint -e1509 */
|
||||
void set_name(const char *str, uint length, CHARSET_INFO *cs);
|
||||
void set_name_no_truncate(const char *str, uint length, CHARSET_INFO *cs);
|
||||
void rename(char *new_name);
|
||||
void init_make_field(Send_field *tmp_field,enum enum_field_types type);
|
||||
virtual void cleanup();
|
||||
|
@ -4743,7 +4743,7 @@ enum Item_result Item_func_get_user_var::result_type() const
|
||||
void Item_func_get_user_var::print(String *str, enum_query_type query_type)
|
||||
{
|
||||
str->append(STRING_WITH_LEN("(@"));
|
||||
str->append(name.str,name.length);
|
||||
append_identifier(current_thd, str, name.str, name.length);
|
||||
str->append(')');
|
||||
}
|
||||
|
||||
@ -4841,10 +4841,10 @@ my_decimal* Item_user_var_as_out_param::val_decimal(my_decimal *decimal_buffer)
|
||||
}
|
||||
|
||||
|
||||
void Item_user_var_as_out_param::print(String *str, enum_query_type query_type)
|
||||
void Item_user_var_as_out_param::print_for_load(THD *thd, String *str)
|
||||
{
|
||||
str->append('@');
|
||||
str->append(name.str,name.length);
|
||||
append_identifier(thd, str, name.str, name.length);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1503,7 +1503,7 @@ public:
|
||||
my_decimal *val_decimal(my_decimal *decimal_buffer);
|
||||
/* fix_fields() binds variable name with its entry structure */
|
||||
bool fix_fields(THD *thd, Item **ref);
|
||||
virtual void print(String *str, enum_query_type query_type);
|
||||
void print_for_load(THD *thd, String *str);
|
||||
void set_null_value(CHARSET_INFO* cs);
|
||||
void set_value(const char *str, uint length, CHARSET_INFO* cs);
|
||||
};
|
||||
|
11
sql/log.cc
11
sql/log.cc
@ -38,6 +38,7 @@
|
||||
#endif
|
||||
|
||||
#include <mysql/plugin.h>
|
||||
#include "sql_show.h"
|
||||
|
||||
/* max size of the log message */
|
||||
#define MAX_LOG_BUFFER_SIZE 1024
|
||||
@ -1726,9 +1727,8 @@ static int binlog_savepoint_set(handlerton *hton, THD *thd, void *sv)
|
||||
|
||||
String log_query;
|
||||
if (log_query.append(STRING_WITH_LEN("SAVEPOINT ")) ||
|
||||
log_query.append("`") ||
|
||||
log_query.append(thd->lex->ident.str, thd->lex->ident.length) ||
|
||||
log_query.append("`"))
|
||||
append_identifier(thd, &log_query,
|
||||
thd->lex->ident.str, thd->lex->ident.length))
|
||||
DBUG_RETURN(1);
|
||||
int errcode= query_error_code(thd, thd->killed == THD::NOT_KILLED);
|
||||
Query_log_event qinfo(thd, log_query.c_ptr_safe(), log_query.length(),
|
||||
@ -1750,9 +1750,8 @@ static int binlog_savepoint_rollback(handlerton *hton, THD *thd, void *sv)
|
||||
{
|
||||
String log_query;
|
||||
if (log_query.append(STRING_WITH_LEN("ROLLBACK TO ")) ||
|
||||
log_query.append("`") ||
|
||||
log_query.append(thd->lex->ident.str, thd->lex->ident.length) ||
|
||||
log_query.append("`"))
|
||||
append_identifier(thd, &log_query,
|
||||
thd->lex->ident.str, thd->lex->ident.length))
|
||||
DBUG_RETURN(1);
|
||||
int errcode= query_error_code(thd, thd->killed == THD::NOT_KILLED);
|
||||
Query_log_event qinfo(thd, log_query.c_ptr_safe(), log_query.length(),
|
||||
|
381
sql/log_event.cc
381
sql/log_event.cc
@ -34,6 +34,7 @@
|
||||
#include "rpl_utility.h"
|
||||
#include "rpl_record.h"
|
||||
#include <my_dir.h>
|
||||
#include "sql_show.h"
|
||||
|
||||
#endif /* MYSQL_CLIENT */
|
||||
|
||||
@ -413,29 +414,28 @@ inline bool unexpected_error_code(int unexpected_error)
|
||||
pretty_print_str()
|
||||
*/
|
||||
|
||||
static char *pretty_print_str(char *packet, const char *str, int len)
|
||||
static void
|
||||
pretty_print_str(String *packet, const char *str, int len)
|
||||
{
|
||||
const char *end= str + len;
|
||||
char *pos= packet;
|
||||
*pos++= '\'';
|
||||
packet->append(STRING_WITH_LEN("'"));
|
||||
while (str < end)
|
||||
{
|
||||
char c;
|
||||
switch ((c=*str++)) {
|
||||
case '\n': *pos++= '\\'; *pos++= 'n'; break;
|
||||
case '\r': *pos++= '\\'; *pos++= 'r'; break;
|
||||
case '\\': *pos++= '\\'; *pos++= '\\'; break;
|
||||
case '\b': *pos++= '\\'; *pos++= 'b'; break;
|
||||
case '\t': *pos++= '\\'; *pos++= 't'; break;
|
||||
case '\'': *pos++= '\\'; *pos++= '\''; break;
|
||||
case 0 : *pos++= '\\'; *pos++= '0'; break;
|
||||
case '\n': packet->append(STRING_WITH_LEN("\\n")); break;
|
||||
case '\r': packet->append(STRING_WITH_LEN("\\r")); break;
|
||||
case '\\': packet->append(STRING_WITH_LEN("\\\\")); break;
|
||||
case '\b': packet->append(STRING_WITH_LEN("\\b")); break;
|
||||
case '\t': packet->append(STRING_WITH_LEN("\\t")); break;
|
||||
case '\'': packet->append(STRING_WITH_LEN("\\'")); break;
|
||||
case 0 : packet->append(STRING_WITH_LEN("\\0")); break;
|
||||
default:
|
||||
*pos++= c;
|
||||
packet->append(&c, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
*pos++= '\'';
|
||||
return pos;
|
||||
packet->append(STRING_WITH_LEN("'"));
|
||||
}
|
||||
#endif /* !MYSQL_CLIENT */
|
||||
|
||||
@ -861,7 +861,7 @@ Log_event::do_shall_skip(Relay_log_info *rli)
|
||||
Log_event::pack_info()
|
||||
*/
|
||||
|
||||
void Log_event::pack_info(Protocol *protocol)
|
||||
void Log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
protocol->store("", &my_charset_bin);
|
||||
}
|
||||
@ -870,7 +870,8 @@ void Log_event::pack_info(Protocol *protocol)
|
||||
/**
|
||||
Only called by SHOW BINLOG EVENTS
|
||||
*/
|
||||
int Log_event::net_send(Protocol *protocol, const char* log_name, my_off_t pos)
|
||||
int Log_event::net_send(THD *thd, Protocol *protocol, const char* log_name,
|
||||
my_off_t pos)
|
||||
{
|
||||
const char *p= strrchr(log_name, FN_LIBCHAR);
|
||||
const char *event_type;
|
||||
@ -884,7 +885,7 @@ int Log_event::net_send(Protocol *protocol, const char* log_name, my_off_t pos)
|
||||
protocol->store(event_type, strlen(event_type), &my_charset_bin);
|
||||
protocol->store((uint32) server_id);
|
||||
protocol->store((ulonglong) log_pos);
|
||||
pack_info(protocol);
|
||||
pack_info(thd, protocol);
|
||||
return protocol->write();
|
||||
}
|
||||
#endif /* HAVE_REPLICATION */
|
||||
@ -2139,27 +2140,22 @@ Log_event::continue_group(Relay_log_info *rli)
|
||||
show the catalog ??
|
||||
*/
|
||||
|
||||
void Query_log_event::pack_info(Protocol *protocol)
|
||||
void Query_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
// TODO: show the catalog ??
|
||||
char *buf, *pos;
|
||||
if (!(buf= (char*) my_malloc(9 + db_len + q_len, MYF(MY_WME))))
|
||||
return;
|
||||
pos= buf;
|
||||
char buf_mem[1024];
|
||||
String buf(buf_mem, sizeof(buf_mem), system_charset_info);
|
||||
buf.real_alloc(9 + db_len + q_len);
|
||||
if (!(flags & LOG_EVENT_SUPPRESS_USE_F)
|
||||
&& db && db_len)
|
||||
{
|
||||
pos= strmov(buf, "use `");
|
||||
memcpy(pos, db, db_len);
|
||||
pos= strmov(pos+db_len, "`; ");
|
||||
buf.append(STRING_WITH_LEN("use "));
|
||||
append_identifier(thd, &buf, db, db_len);
|
||||
buf.append("; ");
|
||||
}
|
||||
if (query && q_len)
|
||||
{
|
||||
memcpy(pos, query, q_len);
|
||||
pos+= q_len;
|
||||
}
|
||||
protocol->store(buf, pos-buf, &my_charset_bin);
|
||||
my_free(buf, MYF(MY_ALLOW_ZERO_PTR));
|
||||
buf.append(query, q_len);
|
||||
protocol->store(&buf);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -2924,11 +2920,17 @@ void Query_log_event::print_query_header(IO_CACHE* file,
|
||||
}
|
||||
else if (db)
|
||||
{
|
||||
/* Room for expand ` to `` + initial/final ` + \0 */
|
||||
char buf[FN_REFLEN*2+3];
|
||||
|
||||
different_db= memcmp(print_event_info->db, db, db_len + 1);
|
||||
if (different_db)
|
||||
memcpy(print_event_info->db, db, db_len + 1);
|
||||
if (db[0] && different_db)
|
||||
my_b_printf(file, "use %s%s\n", db, print_event_info->delimiter);
|
||||
{
|
||||
my_snprintf(buf, sizeof(buf), "%`s", db);
|
||||
my_b_printf(file, "use %s%s\n", buf, print_event_info->delimiter);
|
||||
}
|
||||
}
|
||||
|
||||
end=int10_to_str((long) when, strmov(buff,"SET TIMESTAMP="),10);
|
||||
@ -3545,7 +3547,7 @@ Start_log_event_v3::Start_log_event_v3()
|
||||
*/
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
void Start_log_event_v3::pack_info(Protocol *protocol)
|
||||
void Start_log_event_v3::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
char buf[12 + ST_SERVER_VER_LEN + 14 + 22], *pos;
|
||||
pos= strmov(buf, "Server ver: ");
|
||||
@ -4194,131 +4196,115 @@ void Format_description_log_event::calc_server_version_split()
|
||||
*/
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
uint Load_log_event::get_query_buffer_length()
|
||||
void Load_log_event::print_query(THD *thd, bool need_db, const char *cs,
|
||||
String *buf, my_off_t *fn_start,
|
||||
my_off_t *fn_end, const char *qualify_db)
|
||||
{
|
||||
return
|
||||
5 + db_len + 3 + // "use DB; "
|
||||
18 + fname_len + 2 + // "LOAD DATA INFILE 'file''"
|
||||
11 + // "CONCURRENT "
|
||||
7 + // LOCAL
|
||||
9 + // " REPLACE or IGNORE "
|
||||
13 + table_name_len*2 + // "INTO TABLE `table`"
|
||||
21 + sql_ex.field_term_len*4 + 2 + // " FIELDS TERMINATED BY 'str'"
|
||||
23 + sql_ex.enclosed_len*4 + 2 + // " OPTIONALLY ENCLOSED BY 'str'"
|
||||
12 + sql_ex.escaped_len*4 + 2 + // " ESCAPED BY 'str'"
|
||||
21 + sql_ex.line_term_len*4 + 2 + // " LINES TERMINATED BY 'str'"
|
||||
19 + sql_ex.line_start_len*4 + 2 + // " LINES STARTING BY 'str'"
|
||||
15 + 22 + // " IGNORE xxx LINES"
|
||||
3 + (num_fields-1)*2 + field_block_len; // " (field1, field2, ...)"
|
||||
}
|
||||
|
||||
|
||||
void Load_log_event::print_query(bool need_db, const char *cs, char *buf,
|
||||
char **end, char **fn_start, char **fn_end)
|
||||
{
|
||||
char *pos= buf;
|
||||
|
||||
if (need_db && db && db_len)
|
||||
{
|
||||
pos= strmov(pos, "use `");
|
||||
memcpy(pos, db, db_len);
|
||||
pos= strmov(pos+db_len, "`; ");
|
||||
buf->append(STRING_WITH_LEN("use "));
|
||||
append_identifier(thd, buf, db, db_len);
|
||||
buf->append(STRING_WITH_LEN("; "));
|
||||
}
|
||||
|
||||
pos= strmov(pos, "LOAD DATA ");
|
||||
buf->append(STRING_WITH_LEN("LOAD DATA "));
|
||||
|
||||
if (thd->lex->lock_option == TL_WRITE_CONCURRENT_INSERT)
|
||||
pos= strmov(pos, "CONCURRENT ");
|
||||
buf->append(STRING_WITH_LEN("CONCURRENT "));
|
||||
|
||||
if (fn_start)
|
||||
*fn_start= pos;
|
||||
*fn_start= buf->length();
|
||||
|
||||
if (check_fname_outside_temp_buf())
|
||||
pos= strmov(pos, "LOCAL ");
|
||||
pos= strmov(pos, "INFILE '");
|
||||
memcpy(pos, fname, fname_len);
|
||||
pos= strmov(pos+fname_len, "' ");
|
||||
buf->append(STRING_WITH_LEN("LOCAL "));
|
||||
buf->append(STRING_WITH_LEN("INFILE '"));
|
||||
buf->append_for_single_quote(fname, fname_len);
|
||||
buf->append(STRING_WITH_LEN("' "));
|
||||
|
||||
if (sql_ex.opt_flags & REPLACE_FLAG)
|
||||
pos= strmov(pos, "REPLACE ");
|
||||
buf->append(STRING_WITH_LEN("REPLACE "));
|
||||
else if (sql_ex.opt_flags & IGNORE_FLAG)
|
||||
pos= strmov(pos, "IGNORE ");
|
||||
buf->append(STRING_WITH_LEN("IGNORE "));
|
||||
|
||||
pos= strmov(pos ,"INTO");
|
||||
buf->append(STRING_WITH_LEN("INTO"));
|
||||
|
||||
if (fn_end)
|
||||
*fn_end= pos;
|
||||
*fn_end= buf->length();
|
||||
|
||||
pos= strmov(pos ," TABLE `");
|
||||
memcpy(pos, table_name, table_name_len);
|
||||
pos+= table_name_len;
|
||||
buf->append(STRING_WITH_LEN(" TABLE "));
|
||||
if (qualify_db)
|
||||
{
|
||||
append_identifier(thd, buf, qualify_db, strlen(qualify_db));
|
||||
buf->append(STRING_WITH_LEN("."));
|
||||
}
|
||||
append_identifier(thd, buf, table_name, table_name_len);
|
||||
|
||||
if (cs != NULL)
|
||||
{
|
||||
pos= strmov(pos ,"` CHARACTER SET ");
|
||||
pos= strmov(pos , cs);
|
||||
buf->append(STRING_WITH_LEN(" CHARACTER SET "));
|
||||
buf->append(cs, strlen(cs));
|
||||
}
|
||||
else
|
||||
pos= strmov(pos, "`");
|
||||
|
||||
/* We have to create all optional fields as the default is not empty */
|
||||
pos= strmov(pos, " FIELDS TERMINATED BY ");
|
||||
pos= pretty_print_str(pos, sql_ex.field_term, sql_ex.field_term_len);
|
||||
buf->append(STRING_WITH_LEN(" FIELDS TERMINATED BY "));
|
||||
pretty_print_str(buf, sql_ex.field_term, sql_ex.field_term_len);
|
||||
if (sql_ex.opt_flags & OPT_ENCLOSED_FLAG)
|
||||
pos= strmov(pos, " OPTIONALLY ");
|
||||
pos= strmov(pos, " ENCLOSED BY ");
|
||||
pos= pretty_print_str(pos, sql_ex.enclosed, sql_ex.enclosed_len);
|
||||
buf->append(STRING_WITH_LEN(" OPTIONALLY "));
|
||||
buf->append(STRING_WITH_LEN(" ENCLOSED BY "));
|
||||
pretty_print_str(buf, sql_ex.enclosed, sql_ex.enclosed_len);
|
||||
|
||||
pos= strmov(pos, " ESCAPED BY ");
|
||||
pos= pretty_print_str(pos, sql_ex.escaped, sql_ex.escaped_len);
|
||||
buf->append(STRING_WITH_LEN(" ESCAPED BY "));
|
||||
pretty_print_str(buf, sql_ex.escaped, sql_ex.escaped_len);
|
||||
|
||||
pos= strmov(pos, " LINES TERMINATED BY ");
|
||||
pos= pretty_print_str(pos, sql_ex.line_term, sql_ex.line_term_len);
|
||||
buf->append(STRING_WITH_LEN(" LINES TERMINATED BY "));
|
||||
pretty_print_str(buf, sql_ex.line_term, sql_ex.line_term_len);
|
||||
if (sql_ex.line_start_len)
|
||||
{
|
||||
pos= strmov(pos, " STARTING BY ");
|
||||
pos= pretty_print_str(pos, sql_ex.line_start, sql_ex.line_start_len);
|
||||
buf->append(STRING_WITH_LEN(" STARTING BY "));
|
||||
pretty_print_str(buf, sql_ex.line_start, sql_ex.line_start_len);
|
||||
}
|
||||
|
||||
if ((long) skip_lines > 0)
|
||||
{
|
||||
pos= strmov(pos, " IGNORE ");
|
||||
pos= longlong10_to_str((longlong) skip_lines, pos, 10);
|
||||
pos= strmov(pos," LINES ");
|
||||
char skipbuf[22];
|
||||
buf->append(STRING_WITH_LEN(" IGNORE "));
|
||||
longlong10_to_str((longlong) skip_lines, skipbuf, 10);
|
||||
buf->append(skipbuf);
|
||||
buf->append(STRING_WITH_LEN(" LINES "));
|
||||
}
|
||||
|
||||
if (num_fields)
|
||||
{
|
||||
uint i;
|
||||
const char *field= fields;
|
||||
pos= strmov(pos, " (");
|
||||
buf->append(STRING_WITH_LEN(" ("));
|
||||
for (i = 0; i < num_fields; i++)
|
||||
{
|
||||
if (i)
|
||||
{
|
||||
*pos++= ' ';
|
||||
*pos++= ',';
|
||||
/*
|
||||
Yes, the space and comma is reversed here. But this is mostly dead
|
||||
code, at most used when reading really old binlogs from old servers,
|
||||
so better just leave it as is...
|
||||
*/
|
||||
buf->append(STRING_WITH_LEN(" ,"));
|
||||
}
|
||||
memcpy(pos, field, field_lens[i]);
|
||||
pos+= field_lens[i];
|
||||
append_identifier(thd, buf, field, field_lens[i]);
|
||||
field+= field_lens[i] + 1;
|
||||
}
|
||||
*pos++= ')';
|
||||
buf->append(STRING_WITH_LEN(")"));
|
||||
}
|
||||
|
||||
*end= pos;
|
||||
}
|
||||
|
||||
|
||||
void Load_log_event::pack_info(Protocol *protocol)
|
||||
void Load_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
char *buf, *end;
|
||||
char query_buffer[1024];
|
||||
String query_str(query_buffer, sizeof(query_buffer), system_charset_info);
|
||||
|
||||
if (!(buf= (char*) my_malloc(get_query_buffer_length(), MYF(MY_WME))))
|
||||
return;
|
||||
print_query(TRUE, NULL, buf, &end, 0, 0);
|
||||
protocol->store(buf, end-buf, &my_charset_bin);
|
||||
my_free(buf, MYF(0));
|
||||
query_str.length(0);
|
||||
print_query(thd, TRUE, NULL, &query_str, 0, 0, NULL);
|
||||
protocol->store(query_str.ptr(), query_str.length(), &my_charset_bin);
|
||||
}
|
||||
#endif /* defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT) */
|
||||
|
||||
@ -4585,7 +4571,7 @@ void Load_log_event::print(FILE* file_arg, PRINT_EVENT_INFO* print_event_info,
|
||||
else if (sql_ex.opt_flags & IGNORE_FLAG)
|
||||
my_b_printf(&cache,"IGNORE ");
|
||||
|
||||
my_b_printf(&cache, "INTO TABLE `%s`", table_name);
|
||||
my_b_printf(&cache, "INTO TABLE %`s", table_name);
|
||||
my_b_printf(&cache, " FIELDS TERMINATED BY ");
|
||||
pretty_print_str(&cache, sql_ex.field_term, sql_ex.field_term_len);
|
||||
|
||||
@ -4774,16 +4760,20 @@ int Load_log_event::do_apply_event(NET* net, Relay_log_info const *rli,
|
||||
else
|
||||
{
|
||||
char llbuff[22];
|
||||
char *end;
|
||||
enum enum_duplicates handle_dup;
|
||||
bool ignore= 0;
|
||||
char query_buffer[1024];
|
||||
String query_str(query_buffer, sizeof(query_buffer), system_charset_info);
|
||||
char *load_data_query;
|
||||
|
||||
query_str.length(0);
|
||||
/*
|
||||
Forge LOAD DATA INFILE query which will be used in SHOW PROCESS LIST
|
||||
and written to slave's binlog if binlogging is on.
|
||||
*/
|
||||
if (!(load_data_query= (char *)thd->alloc(get_query_buffer_length() + 1)))
|
||||
print_query(thd, FALSE, NULL, &query_str, NULL, NULL, NULL);
|
||||
if (!(load_data_query= (char *)thd->strmake(query_str.ptr(),
|
||||
query_str.length())))
|
||||
{
|
||||
/*
|
||||
This will set thd->fatal_error in case of OOM. So we surely will notice
|
||||
@ -4792,9 +4782,7 @@ int Load_log_event::do_apply_event(NET* net, Relay_log_info const *rli,
|
||||
goto error;
|
||||
}
|
||||
|
||||
print_query(FALSE, NULL, load_data_query, &end, NULL, NULL);
|
||||
*end= 0;
|
||||
thd->set_query(load_data_query, (uint) (end - load_data_query));
|
||||
thd->set_query(load_data_query, (uint) (query_str.length()));
|
||||
|
||||
if (sql_ex.opt_flags & REPLACE_FLAG)
|
||||
{
|
||||
@ -4959,7 +4947,7 @@ Error '%s' running LOAD DATA INFILE on table '%s'. Default database: '%s'",
|
||||
*/
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
void Rotate_log_event::pack_info(Protocol *protocol)
|
||||
void Rotate_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
char buf1[256], buf[22];
|
||||
String tmp(buf1, sizeof(buf1), log_cs);
|
||||
@ -5174,7 +5162,7 @@ Rotate_log_event::do_shall_skip(Relay_log_info *rli)
|
||||
*/
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
void Intvar_log_event::pack_info(Protocol *protocol)
|
||||
void Intvar_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
char buf[256], *pos;
|
||||
pos= strmake(buf, get_var_type_name(), sizeof(buf)-23);
|
||||
@ -5323,7 +5311,7 @@ Intvar_log_event::do_shall_skip(Relay_log_info *rli)
|
||||
**************************************************************************/
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
void Rand_log_event::pack_info(Protocol *protocol)
|
||||
void Rand_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
char buf1[256], *pos;
|
||||
pos= strmov(buf1,"rand_seed1=");
|
||||
@ -5421,7 +5409,7 @@ Rand_log_event::do_shall_skip(Relay_log_info *rli)
|
||||
**************************************************************************/
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
void Xid_log_event::pack_info(Protocol *protocol)
|
||||
void Xid_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
char buf[128], *pos;
|
||||
pos= strmov(buf, "COMMIT /* xid=");
|
||||
@ -5508,69 +5496,109 @@ Xid_log_event::do_shall_skip(Relay_log_info *rli)
|
||||
**************************************************************************/
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
void User_var_log_event::pack_info(Protocol* protocol)
|
||||
static bool
|
||||
user_var_append_name_part(THD *thd, String *buf,
|
||||
const char *name, size_t name_len)
|
||||
{
|
||||
char *buf= 0;
|
||||
uint val_offset= 4 + name_len;
|
||||
uint event_len= val_offset;
|
||||
return buf->append("@") ||
|
||||
append_identifier(thd, buf, name, name_len) ||
|
||||
buf->append("=");
|
||||
}
|
||||
|
||||
void User_var_log_event::pack_info(THD *thd, Protocol* protocol)
|
||||
{
|
||||
if (is_null)
|
||||
{
|
||||
if (!(buf= (char*) my_malloc(val_offset + 5, MYF(MY_WME))))
|
||||
char buf_mem[FN_REFLEN+7];
|
||||
String buf(buf_mem, sizeof(buf_mem), system_charset_info);
|
||||
buf.length(0);
|
||||
if (user_var_append_name_part(thd, &buf, name, name_len) ||
|
||||
buf.append("NULL"))
|
||||
return;
|
||||
strmov(buf + val_offset, "NULL");
|
||||
event_len= val_offset + 4;
|
||||
protocol->store(buf.ptr(), buf.length(), &my_charset_bin);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (type) {
|
||||
case REAL_RESULT:
|
||||
{
|
||||
double real_val;
|
||||
char buf2[FLOATING_POINT_BUFFER];
|
||||
char buf_mem[FN_REFLEN + FLOATING_POINT_BUFFER];
|
||||
String buf(buf_mem, sizeof(buf_mem), system_charset_info);
|
||||
float8get(real_val, val);
|
||||
if (!(buf= (char*) my_malloc(val_offset + FLOATING_POINT_BUFFER,
|
||||
MYF(MY_WME))))
|
||||
return;
|
||||
event_len+= my_sprintf(buf + val_offset,
|
||||
(buf + val_offset, "%.14g", real_val));
|
||||
buf.length(0);
|
||||
my_sprintf(buf2, (buf2, "%.14g", real_val));
|
||||
if (user_var_append_name_part(thd, &buf, name, name_len) ||
|
||||
buf.append(buf2))
|
||||
return;
|
||||
protocol->store(buf.ptr(), buf.length(), &my_charset_bin);
|
||||
break;
|
||||
}
|
||||
case INT_RESULT:
|
||||
if (!(buf= (char*) my_malloc(val_offset + 22, MYF(MY_WME))))
|
||||
{
|
||||
char buf2[22];
|
||||
char buf_mem[FN_REFLEN + 22];
|
||||
String buf(buf_mem, sizeof(buf_mem), system_charset_info);
|
||||
buf.length(0);
|
||||
if (user_var_append_name_part(thd, &buf, name, name_len) ||
|
||||
buf.append(buf2, longlong10_to_str(uint8korr(val), buf2, -10)-buf2))
|
||||
return;
|
||||
event_len= longlong10_to_str(uint8korr(val), buf + val_offset,-10)-buf;
|
||||
protocol->store(buf.ptr(), buf.length(), &my_charset_bin);
|
||||
break;
|
||||
}
|
||||
case DECIMAL_RESULT:
|
||||
{
|
||||
if (!(buf= (char*) my_malloc(val_offset + DECIMAL_MAX_STR_LENGTH,
|
||||
MYF(MY_WME))))
|
||||
return;
|
||||
String str(buf+val_offset, DECIMAL_MAX_STR_LENGTH, &my_charset_bin);
|
||||
char buf_mem[FN_REFLEN + DECIMAL_MAX_STR_LENGTH];
|
||||
String buf(buf_mem, sizeof(buf_mem), system_charset_info);
|
||||
char buf2[DECIMAL_MAX_STR_LENGTH+1];
|
||||
String str(buf2, sizeof(buf2), &my_charset_bin);
|
||||
my_decimal dec;
|
||||
buf.length(0);
|
||||
binary2my_decimal(E_DEC_FATAL_ERROR, (uchar*) (val+2), &dec, val[0],
|
||||
val[1]);
|
||||
my_decimal2string(E_DEC_FATAL_ERROR, &dec, 0, 0, 0, &str);
|
||||
event_len= str.length() + val_offset;
|
||||
if (user_var_append_name_part(thd, &buf, name, name_len) ||
|
||||
buf.append(buf2))
|
||||
return;
|
||||
protocol->store(buf.ptr(), buf.length(), &my_charset_bin);
|
||||
break;
|
||||
}
|
||||
case STRING_RESULT:
|
||||
{
|
||||
/* 15 is for 'COLLATE' and other chars */
|
||||
buf= (char*) my_malloc(event_len+val_len*2+1+2*MY_CS_NAME_SIZE+15,
|
||||
MYF(MY_WME));
|
||||
char buf_mem[FN_REFLEN + 512 + 1 + 2*MY_CS_NAME_SIZE+15];
|
||||
String buf(buf_mem, sizeof(buf_mem), system_charset_info);
|
||||
CHARSET_INFO *cs;
|
||||
if (!buf)
|
||||
return;
|
||||
buf.length(0);
|
||||
if (!(cs= get_charset(charset_number, MYF(0))))
|
||||
{
|
||||
strmov(buf+val_offset, "???");
|
||||
event_len+= 3;
|
||||
if (buf.append("???"))
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
char *p= strxmov(buf + val_offset, "_", cs->csname, " ", NullS);
|
||||
p= str_to_hex(p, val, val_len);
|
||||
p= strxmov(p, " COLLATE ", cs->name, NullS);
|
||||
event_len= p-buf;
|
||||
size_t old_len;
|
||||
char *beg, *end;
|
||||
if (user_var_append_name_part(thd, &buf, name, name_len) ||
|
||||
buf.append("_") ||
|
||||
buf.append(cs->csname) ||
|
||||
buf.append(" "))
|
||||
return;
|
||||
old_len= buf.length();
|
||||
if (buf.reserve(old_len + val_len*2 + 2 + sizeof(" COLLATE ") +
|
||||
MY_CS_NAME_SIZE))
|
||||
return;
|
||||
beg= const_cast<char *>(buf.ptr()) + old_len;
|
||||
end= str_to_hex(beg, val, val_len);
|
||||
buf.length(old_len + (end - beg));
|
||||
if (buf.append(" COLLATE ") ||
|
||||
buf.append(cs->name))
|
||||
return;
|
||||
}
|
||||
protocol->store(buf.ptr(), buf.length(), &my_charset_bin);
|
||||
break;
|
||||
}
|
||||
case ROW_RESULT:
|
||||
case IMPOSSIBLE_RESULT:
|
||||
default:
|
||||
@ -5578,13 +5606,6 @@ void User_var_log_event::pack_info(Protocol* protocol)
|
||||
return;
|
||||
}
|
||||
}
|
||||
buf[0]= '@';
|
||||
buf[1]= '`';
|
||||
memcpy(buf+2, name, name_len);
|
||||
buf[2+name_len]= '`';
|
||||
buf[3+name_len]= '=';
|
||||
protocol->store(buf, event_len, &my_charset_bin);
|
||||
my_free(buf, MYF(0));
|
||||
}
|
||||
#endif /* !MYSQL_CLIENT */
|
||||
|
||||
@ -5700,9 +5721,8 @@ void User_var_log_event::print(FILE* file, PRINT_EVENT_INFO* print_event_info)
|
||||
my_b_printf(&cache, "\tUser_var\n");
|
||||
}
|
||||
|
||||
my_b_printf(&cache, "SET @`");
|
||||
my_b_write(&cache, (uchar*) name, (uint) (name_len));
|
||||
my_b_printf(&cache, "`");
|
||||
my_b_printf(&cache, "SET @");
|
||||
my_b_write_backtick_quote(&cache, name, name_len);
|
||||
|
||||
if (is_null)
|
||||
{
|
||||
@ -5775,7 +5795,7 @@ void User_var_log_event::print(FILE* file, PRINT_EVENT_INFO* print_event_info)
|
||||
*/
|
||||
my_b_printf(&cache, ":=???%s\n", print_event_info->delimiter);
|
||||
else
|
||||
my_b_printf(&cache, ":=_%s %s COLLATE `%s`%s\n",
|
||||
my_b_printf(&cache, ":=_%s %s COLLATE %`s%s\n",
|
||||
cs->csname, hex_str, cs->name,
|
||||
print_event_info->delimiter);
|
||||
my_afree(hex_str);
|
||||
@ -5914,7 +5934,7 @@ void Unknown_log_event::print(FILE* file_arg, PRINT_EVENT_INFO* print_event_info
|
||||
#endif
|
||||
|
||||
#ifndef MYSQL_CLIENT
|
||||
void Slave_log_event::pack_info(Protocol *protocol)
|
||||
void Slave_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
char buf[256+HOSTNAME_LENGTH], *pos;
|
||||
pos= strmov(buf, "host=");
|
||||
@ -6286,7 +6306,7 @@ void Create_file_log_event::print(FILE* file, PRINT_EVENT_INFO* print_event_info
|
||||
*/
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
void Create_file_log_event::pack_info(Protocol *protocol)
|
||||
void Create_file_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
char buf[SAFE_NAME_LEN*2 + 30 + 21*2], *pos;
|
||||
pos= strmov(buf, "db=");
|
||||
@ -6467,7 +6487,7 @@ void Append_block_log_event::print(FILE* file,
|
||||
*/
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
void Append_block_log_event::pack_info(Protocol *protocol)
|
||||
void Append_block_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
char buf[256];
|
||||
uint length;
|
||||
@ -6619,7 +6639,7 @@ void Delete_file_log_event::print(FILE* file,
|
||||
*/
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
void Delete_file_log_event::pack_info(Protocol *protocol)
|
||||
void Delete_file_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
char buf[64];
|
||||
uint length;
|
||||
@ -6717,7 +6737,7 @@ void Execute_load_log_event::print(FILE* file,
|
||||
*/
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
void Execute_load_log_event::pack_info(Protocol *protocol)
|
||||
void Execute_load_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
char buf[64];
|
||||
uint length;
|
||||
@ -6970,27 +6990,26 @@ void Execute_load_query_log_event::print(FILE* file,
|
||||
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
void Execute_load_query_log_event::pack_info(Protocol *protocol)
|
||||
void Execute_load_query_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
char *buf, *pos;
|
||||
if (!(buf= (char*) my_malloc(9 + db_len + q_len + 10 + 21, MYF(MY_WME))))
|
||||
return;
|
||||
pos= buf;
|
||||
char buf_mem[1024];
|
||||
char file_id_buf[22];
|
||||
String buf(buf_mem, sizeof(buf_mem), system_charset_info);
|
||||
buf.real_alloc(9 + db_len + q_len + 10 + 21);
|
||||
if (db && db_len)
|
||||
{
|
||||
pos= strmov(buf, "use `");
|
||||
memcpy(pos, db, db_len);
|
||||
pos= strmov(pos+db_len, "`; ");
|
||||
if (buf.append("use ") ||
|
||||
append_identifier(thd, &buf, db, db_len) ||
|
||||
buf.append("; "))
|
||||
return;
|
||||
}
|
||||
if (query && q_len)
|
||||
{
|
||||
memcpy(pos, query, q_len);
|
||||
pos+= q_len;
|
||||
}
|
||||
pos= strmov(pos, " ;file_id=");
|
||||
pos= int10_to_str((long) file_id, pos, 10);
|
||||
protocol->store(buf, pos-buf, &my_charset_bin);
|
||||
my_free(buf, MYF(MY_ALLOW_ZERO_PTR));
|
||||
if (query && q_len && buf.append(query, q_len))
|
||||
return;
|
||||
int10_to_str((long) file_id, file_id_buf, 10);
|
||||
if (buf.append(" ;file_id=") ||
|
||||
buf.append(file_id_buf))
|
||||
return;
|
||||
protocol->store(buf.ptr(), buf.length(), &my_charset_bin);
|
||||
}
|
||||
|
||||
|
||||
@ -7932,7 +7951,7 @@ bool Rows_log_event::write_data_body(IO_CACHE*file)
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
void Rows_log_event::pack_info(Protocol *protocol)
|
||||
void Rows_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
char buf[256];
|
||||
char const *const flagstr=
|
||||
@ -8533,7 +8552,7 @@ bool Table_map_log_event::write_data_body(IO_CACHE *file)
|
||||
*/
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
void Table_map_log_event::pack_info(Protocol *protocol)
|
||||
void Table_map_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
char buf[256];
|
||||
size_t bytes= my_snprintf(buf, sizeof(buf),
|
||||
@ -8554,7 +8573,7 @@ void Table_map_log_event::print(FILE *, PRINT_EVENT_INFO *print_event_info)
|
||||
{
|
||||
print_header(&print_event_info->head_cache, print_event_info, TRUE);
|
||||
my_b_printf(&print_event_info->head_cache,
|
||||
"\tTable_map: `%s`.`%s` mapped to number %lu\n",
|
||||
"\tTable_map: %`s.%`s mapped to number %lu\n",
|
||||
m_dbnam, m_tblnam, m_table_id);
|
||||
print_base64(&print_event_info->body_cache, print_event_info, TRUE);
|
||||
}
|
||||
@ -9747,7 +9766,7 @@ Incident_log_event::description() const
|
||||
|
||||
|
||||
#ifndef MYSQL_CLIENT
|
||||
void Incident_log_event::pack_info(Protocol *protocol)
|
||||
void Incident_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
char buf[256];
|
||||
size_t bytes;
|
||||
|
@ -947,14 +947,15 @@ public:
|
||||
*/
|
||||
static void init_show_field_list(List<Item>* field_list);
|
||||
#ifdef HAVE_REPLICATION
|
||||
int net_send(Protocol *protocol, const char* log_name, my_off_t pos);
|
||||
int net_send(THD *thd, Protocol *protocol, const char* log_name,
|
||||
my_off_t pos);
|
||||
|
||||
/*
|
||||
pack_info() is used by SHOW BINLOG EVENTS; as print() it prepares and sends
|
||||
a string to display to the user, so it resembles print().
|
||||
*/
|
||||
|
||||
virtual void pack_info(Protocol *protocol);
|
||||
virtual void pack_info(THD *thd, Protocol *protocol);
|
||||
|
||||
#endif /* HAVE_REPLICATION */
|
||||
virtual const char* get_db()
|
||||
@ -1649,7 +1650,7 @@ public:
|
||||
bool using_trans, bool suppress_use, int error);
|
||||
const char* get_db() { return db; }
|
||||
#ifdef HAVE_REPLICATION
|
||||
void pack_info(Protocol* protocol);
|
||||
void pack_info(THD *thd, Protocol* protocol);
|
||||
#endif /* HAVE_REPLICATION */
|
||||
#else
|
||||
void print_query_header(IO_CACHE* file, PRINT_EVENT_INFO* print_event_info);
|
||||
@ -1779,7 +1780,7 @@ public:
|
||||
|
||||
#ifndef MYSQL_CLIENT
|
||||
Slave_log_event(THD* thd_arg, Relay_log_info* rli);
|
||||
void pack_info(Protocol* protocol);
|
||||
void pack_info(THD *thd, Protocol* protocol);
|
||||
#else
|
||||
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
|
||||
#endif
|
||||
@ -2012,9 +2013,11 @@ protected:
|
||||
const Format_description_log_event* description_event);
|
||||
|
||||
public:
|
||||
uint get_query_buffer_length();
|
||||
void print_query(bool need_db, const char *cs, char *buf, char **end,
|
||||
char **fn_start, char **fn_end);
|
||||
#ifndef MYSQL_CLIENT
|
||||
void print_query(THD *thd, bool need_db, const char *cs, String *buf,
|
||||
my_off_t *fn_start, my_off_t *fn_end,
|
||||
const char *qualify_db);
|
||||
#endif
|
||||
ulong thread_id;
|
||||
ulong slave_proxy_id;
|
||||
uint32 table_name_len;
|
||||
@ -2062,7 +2065,7 @@ public:
|
||||
Name_resolution_context *context);
|
||||
const char* get_db() { return db; }
|
||||
#ifdef HAVE_REPLICATION
|
||||
void pack_info(Protocol* protocol);
|
||||
void pack_info(THD *thd, Protocol* protocol);
|
||||
#endif /* HAVE_REPLICATION */
|
||||
#else
|
||||
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
|
||||
@ -2161,7 +2164,7 @@ public:
|
||||
#ifndef MYSQL_CLIENT
|
||||
Start_log_event_v3();
|
||||
#ifdef HAVE_REPLICATION
|
||||
void pack_info(Protocol* protocol);
|
||||
void pack_info(THD *thd, Protocol* protocol);
|
||||
#endif /* HAVE_REPLICATION */
|
||||
#else
|
||||
Start_log_event_v3() {}
|
||||
@ -2313,7 +2316,7 @@ public:
|
||||
:Log_event(thd_arg,0,0),val(val_arg),type(type_arg)
|
||||
{}
|
||||
#ifdef HAVE_REPLICATION
|
||||
void pack_info(Protocol* protocol);
|
||||
void pack_info(THD *thd, Protocol* protocol);
|
||||
#endif /* HAVE_REPLICATION */
|
||||
#else
|
||||
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
|
||||
@ -2389,7 +2392,7 @@ class Rand_log_event: public Log_event
|
||||
:Log_event(thd_arg,0,0),seed1(seed1_arg),seed2(seed2_arg)
|
||||
{}
|
||||
#ifdef HAVE_REPLICATION
|
||||
void pack_info(Protocol* protocol);
|
||||
void pack_info(THD *thd, Protocol* protocol);
|
||||
#endif /* HAVE_REPLICATION */
|
||||
#else
|
||||
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
|
||||
@ -2433,7 +2436,7 @@ class Xid_log_event: public Log_event
|
||||
#ifndef MYSQL_CLIENT
|
||||
Xid_log_event(THD* thd_arg, my_xid x): Log_event(thd_arg,0,0), xid(x) {}
|
||||
#ifdef HAVE_REPLICATION
|
||||
void pack_info(Protocol* protocol);
|
||||
void pack_info(THD *thd, Protocol* protocol);
|
||||
#endif /* HAVE_REPLICATION */
|
||||
#else
|
||||
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
|
||||
@ -2482,7 +2485,7 @@ public:
|
||||
:Log_event(), name(name_arg), name_len(name_len_arg), val(val_arg),
|
||||
val_len(val_len_arg), type(type_arg), charset_number(charset_number_arg)
|
||||
{ is_null= !val; }
|
||||
void pack_info(Protocol* protocol);
|
||||
void pack_info(THD *thd, Protocol* protocol);
|
||||
#else
|
||||
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
|
||||
#endif
|
||||
@ -2613,7 +2616,7 @@ public:
|
||||
uint ident_len_arg,
|
||||
ulonglong pos_arg, uint flags);
|
||||
#ifdef HAVE_REPLICATION
|
||||
void pack_info(Protocol* protocol);
|
||||
void pack_info(THD *thd, Protocol* protocol);
|
||||
#endif /* HAVE_REPLICATION */
|
||||
#else
|
||||
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
|
||||
@ -2673,7 +2676,7 @@ public:
|
||||
uchar* block_arg, uint block_len_arg,
|
||||
bool using_trans);
|
||||
#ifdef HAVE_REPLICATION
|
||||
void pack_info(Protocol* protocol);
|
||||
void pack_info(THD *thd, Protocol* protocol);
|
||||
#endif /* HAVE_REPLICATION */
|
||||
#else
|
||||
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
|
||||
@ -2745,7 +2748,7 @@ public:
|
||||
Append_block_log_event(THD* thd, const char* db_arg, uchar* block_arg,
|
||||
uint block_len_arg, bool using_trans);
|
||||
#ifdef HAVE_REPLICATION
|
||||
void pack_info(Protocol* protocol);
|
||||
void pack_info(THD *thd, Protocol* protocol);
|
||||
virtual int get_create_or_append() const;
|
||||
#endif /* HAVE_REPLICATION */
|
||||
#else
|
||||
@ -2786,7 +2789,7 @@ public:
|
||||
#ifndef MYSQL_CLIENT
|
||||
Delete_file_log_event(THD* thd, const char* db_arg, bool using_trans);
|
||||
#ifdef HAVE_REPLICATION
|
||||
void pack_info(Protocol* protocol);
|
||||
void pack_info(THD *thd, Protocol* protocol);
|
||||
#endif /* HAVE_REPLICATION */
|
||||
#else
|
||||
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
|
||||
@ -2827,7 +2830,7 @@ public:
|
||||
#ifndef MYSQL_CLIENT
|
||||
Execute_load_log_event(THD* thd, const char* db_arg, bool using_trans);
|
||||
#ifdef HAVE_REPLICATION
|
||||
void pack_info(Protocol* protocol);
|
||||
void pack_info(THD *thd, Protocol* protocol);
|
||||
#endif /* HAVE_REPLICATION */
|
||||
#else
|
||||
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
|
||||
@ -2923,7 +2926,7 @@ public:
|
||||
bool using_trans, bool suppress_use,
|
||||
int errcode);
|
||||
#ifdef HAVE_REPLICATION
|
||||
void pack_info(Protocol* protocol);
|
||||
void pack_info(THD *thd, Protocol* protocol);
|
||||
#endif /* HAVE_REPLICATION */
|
||||
#else
|
||||
void print(FILE* file, PRINT_EVENT_INFO* print_event_info);
|
||||
@ -3368,7 +3371,7 @@ public:
|
||||
#endif
|
||||
|
||||
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
|
||||
virtual void pack_info(Protocol *protocol);
|
||||
virtual void pack_info(THD *thd, Protocol *protocol);
|
||||
#endif
|
||||
|
||||
#ifdef MYSQL_CLIENT
|
||||
@ -3480,7 +3483,7 @@ public:
|
||||
flag_set get_flags(flag_set flags_arg) const { return m_flags & flags_arg; }
|
||||
|
||||
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
|
||||
virtual void pack_info(Protocol *protocol);
|
||||
virtual void pack_info(THD *thd, Protocol *protocol);
|
||||
#endif
|
||||
|
||||
#ifdef MYSQL_CLIENT
|
||||
@ -3917,7 +3920,7 @@ public:
|
||||
#endif
|
||||
|
||||
#ifndef MYSQL_CLIENT
|
||||
void pack_info(Protocol*);
|
||||
void pack_info(THD *thd, Protocol*);
|
||||
#endif
|
||||
|
||||
Incident_log_event(const char *buf, uint event_len,
|
||||
|
@ -2003,7 +2003,7 @@ bool Old_rows_log_event::write_data_body(IO_CACHE*file)
|
||||
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
void Old_rows_log_event::pack_info(Protocol *protocol)
|
||||
void Old_rows_log_event::pack_info(THD *thd, Protocol *protocol)
|
||||
{
|
||||
char buf[256];
|
||||
char const *const flagstr=
|
||||
|
@ -108,7 +108,7 @@ public:
|
||||
flag_set get_flags(flag_set flags_arg) const { return m_flags & flags_arg; }
|
||||
|
||||
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
|
||||
virtual void pack_info(Protocol *protocol);
|
||||
virtual void pack_info(THD *thd, Protocol *protocol);
|
||||
#endif
|
||||
|
||||
#ifdef MYSQL_CLIENT
|
||||
|
@ -1371,7 +1371,7 @@ bool append_escaped(String *to_str, String *from_str);
|
||||
/* sql_show.cc */
|
||||
bool mysqld_show_open_tables(THD *thd,const char *wild);
|
||||
bool mysqld_show_logs(THD *thd);
|
||||
void append_identifier(THD *thd, String *packet, const char *name,
|
||||
bool append_identifier(THD *thd, String *packet, const char *name,
|
||||
uint length);
|
||||
#endif /* MYSQL_SERVER */
|
||||
#if defined MYSQL_SERVER || defined INNODB_COMPATIBILITY_HOOKS
|
||||
|
@ -4172,22 +4172,22 @@ retry:
|
||||
entry->file->implicit_emptied= 0;
|
||||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
char *query, *end;
|
||||
uint query_buf_size= 20 + share->db.length + share->table_name.length +1;
|
||||
if ((query= (char*) my_malloc(query_buf_size,MYF(MY_WME))))
|
||||
char query_buf[2*FN_REFLEN + 21];
|
||||
String query(query_buf, sizeof(query_buf), system_charset_info);
|
||||
query.length(0);
|
||||
if (query.ptr())
|
||||
{
|
||||
/* this DELETE FROM is needed even with row-based binlogging */
|
||||
end = strxmov(strmov(query, "DELETE FROM `"),
|
||||
share->db.str,"`.`",share->table_name.str,"`", NullS);
|
||||
query.append("DELETE FROM ");
|
||||
append_identifier(thd, &query, share->db.str, share->db.length);
|
||||
query.append(".");
|
||||
append_identifier(thd, &query, share->table_name.str,
|
||||
share->table_name.length);
|
||||
int errcode= query_error_code(thd, TRUE);
|
||||
if (thd->binlog_query(THD::STMT_QUERY_TYPE,
|
||||
query, (ulong)(end-query),
|
||||
query.ptr(), query.length(),
|
||||
FALSE, FALSE, errcode))
|
||||
{
|
||||
my_free(query, MYF(0));
|
||||
goto err;
|
||||
}
|
||||
my_free(query, MYF(0));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -4197,7 +4197,7 @@ retry:
|
||||
because of MYF(MY_WME) in my_malloc() above).
|
||||
*/
|
||||
sql_print_error("When opening HEAP table, could not allocate memory "
|
||||
"to write 'DELETE FROM `%s`.`%s`' to the binary log",
|
||||
"to write 'DELETE FROM %`s.%`s' to the binary log",
|
||||
table_list->db, table_list->table_name);
|
||||
delete entry->triggers;
|
||||
closefrm(entry, 0);
|
||||
|
@ -612,7 +612,6 @@ int mysql_create_db(THD *thd, char *db, HA_CREATE_INFO *create_info,
|
||||
bool silent)
|
||||
{
|
||||
char path[FN_REFLEN+16];
|
||||
char tmp_query[FN_REFLEN+16];
|
||||
long result= 1;
|
||||
int error= 0;
|
||||
MY_STAT stat_info;
|
||||
@ -719,17 +718,9 @@ not_silent:
|
||||
char *query;
|
||||
uint query_length;
|
||||
|
||||
if (!thd->query()) // Only in replication
|
||||
{
|
||||
query= tmp_query;
|
||||
query_length= (uint) (strxmov(tmp_query,"create database `",
|
||||
db, "`", NullS) - tmp_query);
|
||||
}
|
||||
else
|
||||
{
|
||||
query= thd->query();
|
||||
query_length= thd->query_length();
|
||||
}
|
||||
query= thd->query();
|
||||
query_length= thd->query_length();
|
||||
DBUG_ASSERT(query);
|
||||
|
||||
ha_binlog_log_query(thd, 0, LOGCOM_CREATE_DB,
|
||||
query, query_length,
|
||||
@ -989,18 +980,11 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
|
||||
{
|
||||
const char *query;
|
||||
ulong query_length;
|
||||
if (!thd->query())
|
||||
{
|
||||
/* The client used the old obsolete mysql_drop_db() call */
|
||||
query= path;
|
||||
query_length= (uint) (strxmov(path, "drop database `", db, "`",
|
||||
NullS) - path);
|
||||
}
|
||||
else
|
||||
{
|
||||
query= thd->query();
|
||||
query_length= thd->query_length();
|
||||
}
|
||||
|
||||
query= thd->query();
|
||||
query_length= thd->query_length();
|
||||
DBUG_ASSERT(query);
|
||||
|
||||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
thd->clear_error();
|
||||
@ -1041,9 +1025,10 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
|
||||
for (tbl= dropped_tables; tbl; tbl= tbl->next_local)
|
||||
{
|
||||
uint tbl_name_len;
|
||||
char quoted_name[FN_REFLEN+3];
|
||||
|
||||
/* 3 for the quotes and the comma*/
|
||||
tbl_name_len= strlen(tbl->table_name) + 3;
|
||||
my_snprintf(quoted_name, sizeof(quoted_name), "%`s", tbl->table_name);
|
||||
tbl_name_len= strlen(quoted_name) + 1; /* +1 for the comma */
|
||||
if (query_pos + tbl_name_len + 1 >= query_end)
|
||||
{
|
||||
/* These DDL methods and logging protected with LOCK_mysql_create_db */
|
||||
@ -1055,9 +1040,7 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
|
||||
query_pos= query_data_start;
|
||||
}
|
||||
|
||||
*query_pos++ = '`';
|
||||
query_pos= strmov(query_pos,tbl->table_name);
|
||||
*query_pos++ = '`';
|
||||
query_pos= strmov(query_pos, quoted_name);
|
||||
*query_pos++ = ',';
|
||||
}
|
||||
|
||||
|
@ -3457,16 +3457,16 @@ int select_create::write_to_binlog(bool is_trans, int errcode)
|
||||
if (thd->lex->create_select_in_comment)
|
||||
query.append(STRING_WITH_LEN("/*! "));
|
||||
if (thd->lex->ignore)
|
||||
query.append(STRING_WITH_LEN("INSERT IGNORE INTO `"));
|
||||
query.append(STRING_WITH_LEN("INSERT IGNORE INTO "));
|
||||
else if (thd->lex->duplicates == DUP_REPLACE)
|
||||
query.append(STRING_WITH_LEN("REPLACE INTO `"));
|
||||
query.append(STRING_WITH_LEN("REPLACE INTO "));
|
||||
else
|
||||
query.append(STRING_WITH_LEN("INSERT INTO `"));
|
||||
query.append(STRING_WITH_LEN("INSERT INTO "));
|
||||
|
||||
query.append(create_table->db, db_len);
|
||||
query.append(STRING_WITH_LEN("`.`"));
|
||||
query.append(create_info->alias, table_len);
|
||||
query.append(STRING_WITH_LEN("` "));
|
||||
append_identifier(thd, &query, create_table->db, db_len);
|
||||
query.append(STRING_WITH_LEN("."));
|
||||
append_identifier(thd, &query, create_info->alias, table_len);
|
||||
query.append(STRING_WITH_LEN(" "));
|
||||
|
||||
/*
|
||||
The insert items.
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "sql_repl.h"
|
||||
#include "sp_head.h"
|
||||
#include "sql_trigger.h"
|
||||
#include "sql_show.h"
|
||||
|
||||
class READ_INFO {
|
||||
File file;
|
||||
@ -606,37 +607,19 @@ static bool write_execute_load_query_log_event(THD *thd, sql_exchange* ex,
|
||||
bool transactional_table,
|
||||
int errcode)
|
||||
{
|
||||
char *load_data_query,
|
||||
*end,
|
||||
*fname_start,
|
||||
*fname_end,
|
||||
*p= NULL;
|
||||
size_t pl= 0;
|
||||
char *load_data_query;
|
||||
my_off_t fname_start,
|
||||
fname_end;
|
||||
List<Item> fv;
|
||||
Item *item, *val;
|
||||
String pfield, pfields;
|
||||
int n;
|
||||
const char *tbl= table_name_arg;
|
||||
const char *tdb= (thd->db != NULL ? thd->db : db_arg);
|
||||
String string_buf;
|
||||
const char *qualify_db= NULL;
|
||||
char command_buffer[1024];
|
||||
String query_str(command_buffer, sizeof(command_buffer),
|
||||
system_charset_info);
|
||||
|
||||
if (!thd->db || strcmp(db_arg, thd->db))
|
||||
{
|
||||
/*
|
||||
If used database differs from table's database,
|
||||
prefix table name with database name so that it
|
||||
becomes a FQ name.
|
||||
*/
|
||||
string_buf.set_charset(system_charset_info);
|
||||
string_buf.append(db_arg);
|
||||
string_buf.append("`");
|
||||
string_buf.append(".");
|
||||
string_buf.append("`");
|
||||
string_buf.append(table_name_arg);
|
||||
tbl= string_buf.c_ptr_safe();
|
||||
}
|
||||
|
||||
Load_log_event lle(thd, ex, tdb, tbl, fv, duplicates,
|
||||
Load_log_event lle(thd, ex, tdb, table_name_arg, fv, duplicates,
|
||||
ignore, transactional_table);
|
||||
|
||||
/*
|
||||
@ -645,6 +628,19 @@ static bool write_execute_load_query_log_event(THD *thd, sql_exchange* ex,
|
||||
if (thd->lex->local_file)
|
||||
lle.set_fname_outside_temp_buf(ex->file_name, strlen(ex->file_name));
|
||||
|
||||
query_str.length(0);
|
||||
if (!thd->db || strcmp(db_arg, thd->db))
|
||||
{
|
||||
/*
|
||||
If used database differs from table's database,
|
||||
prefix table name with database name so that it
|
||||
becomes a FQ name.
|
||||
*/
|
||||
qualify_db= db_arg;
|
||||
}
|
||||
lle.print_query(thd, FALSE, (const char *) ex->cs?ex->cs->csname:NULL,
|
||||
&query_str, &fname_start, &fname_end, qualify_db);
|
||||
|
||||
/*
|
||||
prepare fields-list and SET if needed; print_query won't do that for us.
|
||||
*/
|
||||
@ -652,23 +648,19 @@ static bool write_execute_load_query_log_event(THD *thd, sql_exchange* ex,
|
||||
{
|
||||
List_iterator<Item> li(thd->lex->field_list);
|
||||
|
||||
pfields.append(" (");
|
||||
query_str.append(" (");
|
||||
n= 0;
|
||||
|
||||
while ((item= li++))
|
||||
{
|
||||
if (n++)
|
||||
pfields.append(", ");
|
||||
query_str.append(", ");
|
||||
if (item->name)
|
||||
{
|
||||
pfields.append("`");
|
||||
pfields.append(item->name);
|
||||
pfields.append("`");
|
||||
}
|
||||
append_identifier(thd, &query_str, item->name, strlen(item->name));
|
||||
else
|
||||
item->print(&pfields, QT_ORDINARY);
|
||||
((Item_user_var_as_out_param *)item)->print_for_load(thd, &query_str);
|
||||
}
|
||||
pfields.append(")");
|
||||
query_str.append(")");
|
||||
}
|
||||
|
||||
if (!thd->lex->update_list.is_empty())
|
||||
@ -676,39 +668,26 @@ static bool write_execute_load_query_log_event(THD *thd, sql_exchange* ex,
|
||||
List_iterator<Item> lu(thd->lex->update_list);
|
||||
List_iterator<Item> lv(thd->lex->value_list);
|
||||
|
||||
pfields.append(" SET ");
|
||||
query_str.append(" SET ");
|
||||
n= 0;
|
||||
|
||||
while ((item= lu++))
|
||||
{
|
||||
val= lv++;
|
||||
if (n++)
|
||||
pfields.append(", ");
|
||||
pfields.append("`");
|
||||
pfields.append(item->name);
|
||||
pfields.append("`");
|
||||
pfields.append("=");
|
||||
val->print(&pfields, QT_ORDINARY);
|
||||
query_str.append(", ");
|
||||
append_identifier(thd, &query_str, item->name, strlen(item->name));
|
||||
query_str.append("=");
|
||||
val->print(&query_str, QT_ORDINARY);
|
||||
}
|
||||
}
|
||||
|
||||
p= pfields.c_ptr_safe();
|
||||
pl= strlen(p);
|
||||
|
||||
if (!(load_data_query= (char *)thd->alloc(lle.get_query_buffer_length() + 1 + pl)))
|
||||
if (!(load_data_query= (char *)thd->strmake(query_str.ptr(), query_str.length())))
|
||||
return TRUE;
|
||||
|
||||
lle.print_query(FALSE, (const char *) ex->cs?ex->cs->csname:NULL,
|
||||
load_data_query, &end,
|
||||
(char **)&fname_start, (char **)&fname_end);
|
||||
|
||||
strcpy(end, p);
|
||||
end += pl;
|
||||
|
||||
Execute_load_query_log_event
|
||||
e(thd, load_data_query, end-load_data_query,
|
||||
(uint) ((char*) fname_start - load_data_query - 1),
|
||||
(uint) ((char*) fname_end - load_data_query),
|
||||
e(thd, load_data_query, query_str.length(),
|
||||
(uint) (fname_start - 1), (uint) fname_end,
|
||||
(duplicates == DUP_REPLACE) ? LOAD_DUP_REPLACE :
|
||||
(ignore ? LOAD_DUP_IGNORE : LOAD_DUP_ERROR),
|
||||
transactional_table, FALSE, errcode);
|
||||
|
@ -1554,7 +1554,7 @@ bool mysql_show_binlog_events(THD* thd)
|
||||
description_event)); )
|
||||
{
|
||||
if (event_count >= limit_start &&
|
||||
ev->net_send(protocol, linfo.log_file_name, pos))
|
||||
ev->net_send(thd, protocol, linfo.log_file_name, pos))
|
||||
{
|
||||
errmsg = "Net error";
|
||||
delete ev;
|
||||
|
@ -1019,9 +1019,13 @@ static const char *require_quotes(const char *name, uint name_length)
|
||||
packet target string
|
||||
name the identifier to be appended
|
||||
name_length length of the appending identifier
|
||||
|
||||
RETURN VALUES
|
||||
true Error
|
||||
false Ok
|
||||
*/
|
||||
|
||||
void
|
||||
bool
|
||||
append_identifier(THD *thd, String *packet, const char *name, uint length)
|
||||
{
|
||||
const char *name_end;
|
||||
@ -1029,10 +1033,7 @@ append_identifier(THD *thd, String *packet, const char *name, uint length)
|
||||
int q= get_quote_char_for_identifier(thd, name, length);
|
||||
|
||||
if (q == EOF)
|
||||
{
|
||||
packet->append(name, length, packet->charset());
|
||||
return;
|
||||
}
|
||||
return packet->append(name, length, packet->charset());
|
||||
|
||||
/*
|
||||
The identifier must be quoted as it includes a quote character or
|
||||
@ -1041,7 +1042,8 @@ append_identifier(THD *thd, String *packet, const char *name, uint length)
|
||||
|
||||
VOID(packet->reserve(length*2 + 2));
|
||||
quote_char= (char) q;
|
||||
packet->append("e_char, 1, system_charset_info);
|
||||
if (packet->append("e_char, 1, system_charset_info))
|
||||
return true;
|
||||
|
||||
for (name_end= name+length ; name < name_end ; name+= length)
|
||||
{
|
||||
@ -1056,11 +1058,13 @@ append_identifier(THD *thd, String *packet, const char *name, uint length)
|
||||
*/
|
||||
if (!length)
|
||||
length= 1;
|
||||
if (length == 1 && chr == (uchar) quote_char)
|
||||
packet->append("e_char, 1, system_charset_info);
|
||||
packet->append(name, length, system_charset_info);
|
||||
if (length == 1 && chr == (uchar) quote_char &&
|
||||
packet->append("e_char, 1, system_charset_info))
|
||||
return true;
|
||||
if (packet->append(name, length, system_charset_info))
|
||||
return true;
|
||||
}
|
||||
packet->append("e_char, 1, system_charset_info);
|
||||
return packet->append("e_char, 1, system_charset_info);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1157,39 +1157,47 @@ outp:
|
||||
|
||||
|
||||
|
||||
|
||||
void String::print(String *str)
|
||||
/*
|
||||
Append characters to a single-quoted string '...', escaping special
|
||||
characters as necessary.
|
||||
Does not add the enclosing quotes, this is left up to caller.
|
||||
*/
|
||||
void String::append_for_single_quote(const char *st, uint len)
|
||||
{
|
||||
char *st= (char*)Ptr, *end= st+str_length;
|
||||
const char *end= st+len;
|
||||
for (; st < end; st++)
|
||||
{
|
||||
uchar c= *st;
|
||||
switch (c)
|
||||
{
|
||||
case '\\':
|
||||
str->append(STRING_WITH_LEN("\\\\"));
|
||||
append(STRING_WITH_LEN("\\\\"));
|
||||
break;
|
||||
case '\0':
|
||||
str->append(STRING_WITH_LEN("\\0"));
|
||||
append(STRING_WITH_LEN("\\0"));
|
||||
break;
|
||||
case '\'':
|
||||
str->append(STRING_WITH_LEN("\\'"));
|
||||
append(STRING_WITH_LEN("\\'"));
|
||||
break;
|
||||
case '\n':
|
||||
str->append(STRING_WITH_LEN("\\n"));
|
||||
append(STRING_WITH_LEN("\\n"));
|
||||
break;
|
||||
case '\r':
|
||||
str->append(STRING_WITH_LEN("\\r"));
|
||||
append(STRING_WITH_LEN("\\r"));
|
||||
break;
|
||||
case '\032': // Ctrl-Z
|
||||
str->append(STRING_WITH_LEN("\\Z"));
|
||||
append(STRING_WITH_LEN("\\Z"));
|
||||
break;
|
||||
default:
|
||||
str->append(c);
|
||||
append(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void String::print(String *str)
|
||||
{
|
||||
str->append_for_single_quote(Ptr, str_length);
|
||||
}
|
||||
|
||||
/*
|
||||
Exchange state of this object and argument.
|
||||
|
@ -385,6 +385,7 @@ public:
|
||||
return FALSE;
|
||||
}
|
||||
void print(String *print);
|
||||
void append_for_single_quote(const char *st, uint len);
|
||||
|
||||
/* Swap two string objects. Efficient way to exchange data without memcpy. */
|
||||
void swap(String &s);
|
||||
|
@ -1945,6 +1945,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
|
||||
for (table= tables; table; table= table->next_local)
|
||||
{
|
||||
char *db=table->db;
|
||||
size_t db_length= table->db_length;
|
||||
handlerton *table_type;
|
||||
enum legacy_db_type frm_db_type= DB_TYPE_UNKNOWN;
|
||||
|
||||
@ -1967,14 +1968,14 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
|
||||
built_tmp_query.append("DROP TEMPORARY TABLE IF EXISTS ");
|
||||
}
|
||||
|
||||
built_tmp_query.append("`");
|
||||
if (thd->db == NULL || strcmp(db,thd->db) != 0)
|
||||
{
|
||||
built_tmp_query.append(db);
|
||||
built_tmp_query.append("`.`");
|
||||
append_identifier(thd, &built_tmp_query, db, db_length);
|
||||
built_tmp_query.append(".");
|
||||
}
|
||||
built_tmp_query.append(table->table_name);
|
||||
built_tmp_query.append("`,");
|
||||
append_identifier(thd, &built_tmp_query, table->table_name,
|
||||
table->table_name_length);
|
||||
built_tmp_query.append(",");
|
||||
}
|
||||
|
||||
continue;
|
||||
@ -2000,15 +2001,15 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
|
||||
Don't write the database name if it is the current one (or if
|
||||
thd->db is NULL).
|
||||
*/
|
||||
built_query.append("`");
|
||||
if (thd->db == NULL || strcmp(db,thd->db) != 0)
|
||||
{
|
||||
built_query.append(db);
|
||||
built_query.append("`.`");
|
||||
append_identifier(thd, &built_query, db, db_length);
|
||||
built_query.append(".");
|
||||
}
|
||||
|
||||
built_query.append(table->table_name);
|
||||
built_query.append("`,");
|
||||
append_identifier(thd, &built_query, table->table_name,
|
||||
table->table_name_length);
|
||||
built_query.append(",");
|
||||
}
|
||||
|
||||
if (!drop_temporary)
|
||||
|
@ -19,6 +19,57 @@
|
||||
#include <m_ctype.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
|
||||
/**
|
||||
Returns escaped string
|
||||
|
||||
@param cs string charset
|
||||
@param to buffer where escaped string will be placed
|
||||
@param end end of buffer
|
||||
@param par string to escape
|
||||
@param par_len string length
|
||||
@param quote_char character for quoting
|
||||
|
||||
@retval
|
||||
position in buffer which points on the end of escaped string
|
||||
*/
|
||||
|
||||
static char *backtick_string(char *to, char *end, char *par,
|
||||
size_t par_len, char quote_char)
|
||||
{
|
||||
char *start= to;
|
||||
char *par_end= par + par_len;
|
||||
size_t buff_length= (size_t) (end - to);
|
||||
|
||||
if (buff_length <= par_len)
|
||||
goto err;
|
||||
*start++= quote_char;
|
||||
|
||||
for ( ; par < par_end; ++par)
|
||||
{
|
||||
char c= *par;
|
||||
if (c == quote_char)
|
||||
{
|
||||
if (start + 1 >= end)
|
||||
goto err;
|
||||
*start++= quote_char;
|
||||
}
|
||||
if (start + 1 >= end)
|
||||
goto err;
|
||||
*start++= c;
|
||||
}
|
||||
|
||||
if (start + 1 >= end)
|
||||
goto err;
|
||||
*start++= quote_char;
|
||||
return start;
|
||||
|
||||
err:
|
||||
*to='\0';
|
||||
return to;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Limited snprintf() implementations
|
||||
|
||||
@ -45,7 +96,7 @@ size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap)
|
||||
{
|
||||
char *start=to, *end=to+n-1;
|
||||
size_t length, width;
|
||||
uint pre_zero, have_long;
|
||||
uint pre_zero, have_long, escaped_arg;
|
||||
|
||||
for (; *fmt ; fmt++)
|
||||
{
|
||||
@ -61,7 +112,7 @@ size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap)
|
||||
if (*fmt == '-')
|
||||
fmt++;
|
||||
length= width= 0;
|
||||
pre_zero= have_long= 0;
|
||||
pre_zero= have_long= escaped_arg= 0;
|
||||
if (*fmt == '*')
|
||||
{
|
||||
fmt++;
|
||||
@ -93,6 +144,11 @@ size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap)
|
||||
fmt++;
|
||||
have_long= 1;
|
||||
}
|
||||
if (*fmt == '`')
|
||||
{
|
||||
fmt++;
|
||||
escaped_arg= 1;
|
||||
}
|
||||
if (*fmt == 's') /* String parameter */
|
||||
{
|
||||
reg2 char *par = va_arg(ap, char *);
|
||||
@ -101,7 +157,10 @@ size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap)
|
||||
plen= (uint) strnlen(par, width);
|
||||
if (left_len <= plen)
|
||||
plen = left_len - 1;
|
||||
to=strnmov(to,par,plen);
|
||||
if (escaped_arg)
|
||||
to= backtick_string(to, end, par, plen, '`');
|
||||
else
|
||||
to= strnmov(to,par,plen);
|
||||
continue;
|
||||
}
|
||||
else if (*fmt == 'b') /* Buffer parameter */
|
||||
@ -185,6 +244,70 @@ size_t my_snprintf(char* to, size_t n, const char* fmt, ...)
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
Writes output to the stream according to a format string.
|
||||
|
||||
@param stream file to write to
|
||||
@param format string format
|
||||
@param args list of parameters
|
||||
|
||||
@retval
|
||||
number of the characters written.
|
||||
*/
|
||||
|
||||
int my_vfprintf(FILE *stream, const char* format, va_list args)
|
||||
{
|
||||
char cvtbuf[1024];
|
||||
int alloc= 0;
|
||||
char *p= cvtbuf;
|
||||
size_t cur_len= sizeof(cvtbuf);
|
||||
int ret;
|
||||
|
||||
/*
|
||||
We do not know how much buffer we need.
|
||||
So start with a reasonably-sized stack-allocated buffer, and increase
|
||||
it exponentially until it is big enough.
|
||||
*/
|
||||
for (;;)
|
||||
{
|
||||
size_t new_len;
|
||||
size_t actual= my_vsnprintf(p, cur_len, format, args);
|
||||
if (actual < cur_len - 1)
|
||||
break;
|
||||
/*
|
||||
Not enough space (or just enough with nothing to spare - but we cannot
|
||||
distinguish this case from the return value). Allocate a bigger buffer
|
||||
and try again.
|
||||
*/
|
||||
if (alloc)
|
||||
(*my_str_free)(p);
|
||||
else
|
||||
alloc= 1;
|
||||
new_len= cur_len*2;
|
||||
if (new_len < cur_len)
|
||||
return 0; /* Overflow */
|
||||
cur_len= new_len;
|
||||
p= (*my_str_malloc)(cur_len);
|
||||
if (!p)
|
||||
return 0;
|
||||
}
|
||||
ret= fprintf(stream, "%s", p);
|
||||
if (alloc)
|
||||
(*my_str_free)(p);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int my_fprintf(FILE *stream, const char* format, ...)
|
||||
{
|
||||
int result;
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
result= my_vfprintf(stream, format, args);
|
||||
va_end(args);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
#ifdef MAIN
|
||||
#define OVERRUN_SENTRY 250
|
||||
static void my_printf(const char * fmt, ...)
|
||||
|
Loading…
x
Reference in New Issue
Block a user