mariadb/mysql-test/t/mysql_binary_mode.test
Sergei Golubchik 2db4392bf4 MDEV-4297 mysql --binary-mode
backport mysql --binary-mode (bug#11747577, bug#33048)
2013-06-10 21:45:30 +02:00

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