mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
169 lines
5.5 KiB
Text
169 lines
5.5 KiB
Text
source include/have_binlog_format_mixed_or_statement.inc;
|
|
RESET MASTER;
|
|
|
|
--echo # Bug#33048 Not able to recover binary/blob data correctly using mysqlbinlog
|
|
--echo # --------------------------------------------------------------------------
|
|
--echo # The test verify that 0x00 and 0x0D0A sequence can be handled correctly by
|
|
--echo # mysql
|
|
--echo
|
|
|
|
# zero => 0x00, newline => 0x0D0A, A => 0x41, B => 0x42
|
|
|
|
# 0x410D0A42 => 'A\r\nB'
|
|
let $table_name_right= `SELECT 0x410D0A42`;
|
|
|
|
# 0x410A42 => 'A\nB'
|
|
let $table_name_wrong= `SELECT 0x410A42`;
|
|
|
|
# 0x410042 => 'A\0B'
|
|
let $char0= `SELECT 0x410042`;
|
|
|
|
eval CREATE TABLE `$table_name_right` (c1 CHAR(100));
|
|
|
|
--echo # It is a faked statement. ASCII 0 is in the original statement, it would
|
|
--echo # make the test result to become a binary file which was difficult to get
|
|
--echo # the diff result if the original query was logged in the result.
|
|
--echo INSERT INTO `A\r\nB` VALUES("A\0B");
|
|
--echo
|
|
--disable_query_log
|
|
eval INSERT INTO `$table_name_right` VALUES("$char0");
|
|
--enable_query_log
|
|
|
|
let $char0= $table_name_right;
|
|
eval INSERT INTO `$table_name_right` VALUES("$char0");
|
|
|
|
eval SELECT HEX(c1) FROM `$table_name_right`;
|
|
|
|
--echo
|
|
let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1);
|
|
FLUSH LOGS;
|
|
eval DROP TABLE `$table_name_right`;
|
|
|
|
--echo
|
|
let $MYSQLD_DATADIR= `SELECT @@datadir`;
|
|
--exec $MYSQL_BINLOG $MYSQLD_DATADIR/$binlog_file > $MYSQLTEST_VARDIR/tmp/my.sql
|
|
RESET MASTER;
|
|
|
|
--echo # '--exec mysql ...' without --binary-mode option
|
|
--echo # It creates the table with a wrong table name and generates an error.
|
|
--echo # (error output was suppressed to make the test case platform agnostic)
|
|
|
|
## disabling result log because the error message has the
|
|
## table name in the output which is one byte different ('\r')
|
|
## on unixes and windows.
|
|
--disable_result_log
|
|
--error 1
|
|
--exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/my.sql 2>&1
|
|
--enable_result_log
|
|
|
|
--echo
|
|
--echo # It is not in binary_mode, so table name '0x410D0A42' can be translated to
|
|
--echo # '0x410A42' by mysql depending on the OS - Windows or Unix-like.
|
|
--replace_result $table_name_wrong TABLE_NAME_MASKED $table_name_right TABLE_NAME_MASKED
|
|
if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) IN ('Win32', 'Win64', 'Windows')`)
|
|
{
|
|
eval DROP TABLE `$table_name_right`;
|
|
}
|
|
|
|
if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) NOT IN ('Win32', 'Win64', 'Windows')`)
|
|
{
|
|
eval DROP TABLE `$table_name_wrong`;
|
|
}
|
|
|
|
--echo
|
|
--echo # In binary_mode, table name '0x410D0A42' and string '0x410042' can be
|
|
--echo # handled correctly.
|
|
RESET MASTER;
|
|
--exec $MYSQL --binary-mode test < $MYSQLTEST_VARDIR/tmp/my.sql
|
|
eval SELECT HEX(c1) FROM `$table_name_right`;
|
|
|
|
--echo
|
|
eval DROP TABLE `$table_name_right`;
|
|
|
|
#
|
|
# BUG#12794048 - MAIN.MYSQL_BINARY_MODE FAILS ON WINDOWS RELEASE BUILD
|
|
#
|
|
RESET MASTER;
|
|
|
|
#
|
|
# This test case tests if the table names and their values
|
|
# are handled properly. For that we check
|
|
#
|
|
|
|
# 0x610D0A62 => 'a\r\nb'
|
|
let $tbl= `SELECT 0x610D0A62`;
|
|
|
|
--disable_result_log
|
|
--disable_query_log
|
|
|
|
--let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1)
|
|
|
|
#### case #1: mysqltest
|
|
#### CREATE table and insert value through regular mysqltest session
|
|
|
|
--eval CREATE TABLE `$tbl` (c1 CHAR(100))
|
|
--eval INSERT INTO `$tbl` VALUES ("$tbl")
|
|
|
|
--let $table_name=`SELECT table_name FROM information_schema.tables WHERE table_schema='test'`
|
|
--let $tbl0= `SELECT HEX(table_name) FROM information_schema.tables WHERE table_schema='test'`
|
|
--let $val0= `SELECT HEX(c1) FROM `$table_name` LIMIT 1`
|
|
|
|
FLUSH LOGS;
|
|
|
|
--eval DROP TABLE `$table_name`;
|
|
|
|
#### case #2: mysql --binlog-mode=0
|
|
#### Replay through regular mysql client non-interactive mode
|
|
|
|
--let $MYSQLD_DATADIR= `SELECT @@datadir`
|
|
--let $prefix=`SELECT UUID()`
|
|
--let $binlog_uuid_filename= $MYSQLTEST_VARDIR/tmp/$prefix-bin.log
|
|
--copy_file $MYSQLD_DATADIR/$binlog_file $binlog_uuid_filename
|
|
RESET MASTER;
|
|
|
|
--exec $MYSQL_BINLOG $binlog_uuid_filename | $MYSQL
|
|
|
|
--let $table_name=`SELECT table_name FROM information_schema.tables WHERE table_schema='test'`
|
|
--let $tbl1= `SELECT hex(table_name) FROM information_schema.tables WHERE table_schema='test'`
|
|
--let $val1= `SELECT HEX(c1) FROM `$table_name` LIMIT 1`
|
|
|
|
--eval DROP TABLE `$table_name`;
|
|
|
|
#### case #3: mysql --binlog-mode=1
|
|
#### Replay through regular mysql client non-interactive mode and with binary mode set
|
|
|
|
RESET MASTER;
|
|
--exec $MYSQL_BINLOG $binlog_uuid_filename | $MYSQL --binary-mode
|
|
|
|
--let $table_name=`SELECT table_name FROM information_schema.tables WHERE table_schema='test'`
|
|
--let $tbl2= `SELECT hex(table_name) FROM information_schema.tables WHERE table_schema='test'`
|
|
--let $val2= `SELECT HEX(c1) FROM `$table_name` LIMIT 1`
|
|
|
|
--eval DROP TABLE `$table_name`;
|
|
|
|
--enable_result_log
|
|
--disable_query_log
|
|
|
|
##### OUTCOME
|
|
|
|
--let $assert_text= Table and contents created through mysqltest match 0x610D0A62.
|
|
--let $assert_cond= "$tbl0" = "610D0A62" AND "$val0" = "610D0A62"
|
|
--source include/assert.inc
|
|
|
|
--let $assert_text= Table and contents created while replaying binary log without --binary-mode set match 0x61(0D)0A62.
|
|
if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) IN ('Win32', 'Win64', 'Windows')`)
|
|
{
|
|
--let $assert_cond= "$tbl1" = "610D0A62" AND "$val1" = "610D0A62"
|
|
}
|
|
if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) NOT IN ('Win32', 'Win64', 'Windows')`)
|
|
{
|
|
--let $assert_cond= "$tbl1" = "610A62" AND "$val1" = "610A62"
|
|
}
|
|
--source include/assert.inc
|
|
|
|
--let $assert_text= Table and contents created while replaying binary log with --binary-mode set match 0x610D0A62.
|
|
--let $assert_cond= "$tbl2" = "610D0A62" AND "$val2" = "610D0A62"
|
|
--source include/assert.inc
|
|
|
|
RESET MASTER;
|
|
--remove_file $binlog_uuid_filename
|