mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
BUG#49562: SBR out of sync when using numeric data types + user
variable The User_var_log_event was not serializing the unsigned flag. This would cause the slave to always assume signed values. We fix this by extending the User_var_log_event to also contain information on the unsigned_flag, meaning that it gets into the binlog as well, therefore the slave will get this information as well. Events without information on unsigned flag (old events) are treated as they were before (always signed: unsigned_flag= FALSE). The information on the unsigned_flag, is shipped in an extra byte appended to the end of the User_var_log_event and added by this patch. This extra byte holds values for general purpose User_var_log_event flags which are now packed in the binlog as well. One of these flags contains information about whether the value is signed or unsigned (currently this extra byte is only used to hold data on the unsigned flag, in the future we can use it to pack extra flags if there is the need to).
This commit is contained in:
146
mysql-test/suite/rpl/t/rpl_stm_user_variables.test
Normal file
146
mysql-test/suite/rpl/t/rpl_stm_user_variables.test
Normal file
@@ -0,0 +1,146 @@
|
||||
#
|
||||
# BUG#49562: SBR out of sync when using numeric data types + user variable
|
||||
#
|
||||
|
||||
-- source include/master-slave.inc
|
||||
-- source include/have_binlog_format_statement.inc
|
||||
|
||||
## Setup user variables for several numeric types, so that we get
|
||||
## coverage on the User_var_log_event different val types
|
||||
|
||||
-- let $max_unsigned_long= 18446744073709551615
|
||||
-- let $min_signed_long= -9223372036854775808
|
||||
-- eval SET @positive= $max_unsigned_long
|
||||
-- eval SET @negative= $min_signed_long
|
||||
|
||||
CREATE TABLE t1 (`tinyint` TINYINT,
|
||||
`smallint` SMALLINT,
|
||||
`mediumint` MEDIUMINT,
|
||||
`integer` INTEGER,
|
||||
`bigint` BIGINT,
|
||||
`utinyint` TINYINT UNSIGNED,
|
||||
`usmallint` SMALLINT UNSIGNED,
|
||||
`umediumint` MEDIUMINT UNSIGNED,
|
||||
`uinteger` INTEGER UNSIGNED,
|
||||
`ubigint` BIGINT UNSIGNED,
|
||||
`double` DOUBLE,
|
||||
`float` FLOAT,
|
||||
`real` REAL(30,2),
|
||||
`decimal` DECIMAL(30,2)) ENGINE = MyISAM;
|
||||
|
||||
-- disable_warnings
|
||||
|
||||
-- echo ### insert max unsigned
|
||||
-- echo ### a) declarative
|
||||
-- eval INSERT INTO t1 VALUES ($max_unsigned_long, $max_unsigned_long, $max_unsigned_long, $max_unsigned_long, $max_unsigned_long, $max_unsigned_long, $max_unsigned_long,$max_unsigned_long, $max_unsigned_long, $max_unsigned_long, $max_unsigned_long, $max_unsigned_long, $max_unsigned_long, $max_unsigned_long);
|
||||
|
||||
-- echo #########################################
|
||||
-- echo #### [ on master ]
|
||||
-- query_vertical SELECT * FROM t1
|
||||
-- sync_slave_with_master
|
||||
-- echo #### [ on slave ]
|
||||
-- query_vertical SELECT * FROM t1
|
||||
-- echo #########################################
|
||||
-- connection master
|
||||
-- echo ## assertion: master and slave tables are in sync
|
||||
-- let $diff_table_1=master:test.t1
|
||||
-- let $diff_table_2=slave:test.t1
|
||||
-- source include/diff_tables.inc
|
||||
-- connection master
|
||||
TRUNCATE t1;
|
||||
|
||||
-- echo ### b) user var
|
||||
INSERT INTO t1 VALUES (@positive,
|
||||
@positive,
|
||||
@positive,
|
||||
@positive,
|
||||
@positive,
|
||||
@positive,
|
||||
@positive,
|
||||
@positive,
|
||||
@positive,
|
||||
@positive,
|
||||
@positive,
|
||||
@positive,
|
||||
@positive,
|
||||
@positive);
|
||||
|
||||
-- echo #########################################
|
||||
-- echo #### [ on master ]
|
||||
-- query_vertical SELECT * FROM t1
|
||||
-- sync_slave_with_master
|
||||
-- echo #### [ on slave ]
|
||||
-- query_vertical SELECT * FROM t1
|
||||
-- echo #########################################
|
||||
-- connection master
|
||||
-- echo ## assertion: master and slave tables are in sync
|
||||
-- let $diff_table_1=master:test.t1
|
||||
-- let $diff_table_2=slave:test.t1
|
||||
-- source include/diff_tables.inc
|
||||
-- connection master
|
||||
TRUNCATE t1;
|
||||
|
||||
|
||||
-- echo ### insert min signed
|
||||
-- echo ### a) declarative
|
||||
-- eval INSERT INTO t1 VALUES ($min_signed_long, $min_signed_long, $min_signed_long, $min_signed_long, $min_signed_long, $min_signed_long, $min_signed_long,$min_signed_long, $min_signed_long, $min_signed_long, $min_signed_long, $min_signed_long, $min_signed_long, $min_signed_long);
|
||||
|
||||
-- echo #########################################
|
||||
-- echo #### [ on master ]
|
||||
-- query_vertical SELECT * FROM t1
|
||||
-- sync_slave_with_master
|
||||
-- echo #### [ on slave ]
|
||||
-- query_vertical SELECT * FROM t1
|
||||
-- echo #########################################
|
||||
-- connection master
|
||||
-- echo ## assertion: master and slave tables are in sync
|
||||
-- let $diff_table_1=master:test.t1
|
||||
-- let $diff_table_2=slave:test.t1
|
||||
-- source include/diff_tables.inc
|
||||
-- connection master
|
||||
TRUNCATE t1;
|
||||
|
||||
-- echo ### b) user var
|
||||
INSERT INTO t1 VALUES (@negative,
|
||||
@negative,
|
||||
@negative,
|
||||
@negative,
|
||||
@negative,
|
||||
@negative,
|
||||
@negative,
|
||||
@negative,
|
||||
@negative,
|
||||
@negative,
|
||||
@negative,
|
||||
@negative,
|
||||
@negative,
|
||||
@negative);
|
||||
|
||||
-- echo #########################################
|
||||
-- echo #### [ on master ]
|
||||
-- query_vertical SELECT * FROM t1
|
||||
-- sync_slave_with_master
|
||||
-- echo #### [ on slave ]
|
||||
-- query_vertical SELECT * FROM t1
|
||||
-- echo #########################################
|
||||
-- connection master
|
||||
|
||||
-- echo ## assertion: master and slave tables are in sync
|
||||
-- let $diff_table_1=master:test.t1
|
||||
-- let $diff_table_2=slave:test.t1
|
||||
-- source include/diff_tables.inc
|
||||
-- connection master
|
||||
TRUNCATE t1;
|
||||
|
||||
-- echo ## check: contents of both tables master's and slave's
|
||||
-- enable_warnings
|
||||
|
||||
-- echo ## assertion: checks that User_var_log_event::pack_info correctly
|
||||
-- echo ## displays the binlog content by taking into account the
|
||||
-- echo ## unsigned_flag
|
||||
-- source include/show_binlog_events.inc
|
||||
|
||||
## cleanup
|
||||
-- connection master
|
||||
DROP TABLE t1;
|
||||
-- sync_slave_with_master
|
Reference in New Issue
Block a user