mirror of
https://github.com/MariaDB/server.git
synced 2025-07-18 23:03:28 +03:00
This patch adds functionality to row-based replication to ensure the slave's column sizes are >= to that of the master. It also includes some refactoring for the code from WL#3228. mysql-test/extra/rpl_tests/rpl_extraSlave_Col.test: BUG#22086 : Extra Slave Col: Char(5) on slave and Char(10) on master cause mysqld crash Removed commented out portion of test referenced in bug report. This test supports the original request of the bug report. mysql-test/suite/rpl/r/rpl_extraCol_innodb.result: BUG#22086 : Extra Slave Col: Char(5) on slave and Char(10) on master cause mysqld crash New result file for additional test. mysql-test/suite/rpl/r/rpl_extraCol_myisam.result: BUG#22086 : Extra Slave Col: Char(5) on slave and Char(10) on master cause mysqld crash New result file for additional test. mysql-test/suite/rpl_ndb/r/rpl_ndb_extraCol.result: BUG#22086 : Extra Slave Col: Char(5) on slave and Char(10) on master cause mysqld crash New result file for additional test. sql/field.cc: BUG#22086 : Extra Slave Col: Char(5) on slave and Char(10) on master cause mysqld crash This patch refactors the additions made by this bug patch and those made by WL#3228. The effort consolidates the large switches on type() into functions within the field classes. sql/field.h: BUG#22086 : Extra Slave Col: Char(5) on slave and Char(10) on master cause mysqld crash This patch refactors the additions made by this bug patch and those made by WL#3228. The effort consolidates the large switches on type() into functions within the field classes. sql/log_event.cc: BUG#22086 : Extra Slave Col: Char(5) on slave and Char(10) on master cause mysqld crash This patch refactors the calc_field_size() method to use the new methods implemented in the field classes. It also corrects comments concerning how replication of field metadata works. sql/log_event.h: BUG#22086 : Extra Slave Col: Char(5) on slave and Char(10) on master cause mysqld crash This patch refactors out the calc_field_size() method into the method save_field_metadata(). sql/rpl_utility.cc: BUG#22086 : Extra Slave Col: Char(5) on slave and Char(10) on master cause mysqld crash This patch adds a method to check the size of the field on the master using the field metadata from WL#3228. Each column is checked to ensure the slave's column is >= to the master's column in size. sql/rpl_utility.h: BUG#22086 : Extra Slave Col: Char(5) on slave and Char(10) on master cause mysqld crash This patch changes the table_def class so that it records the size of the metadata. This is a result of refactoring out the calc_field_size() method into the method save_field_metadata(). Prevents access via field_metadata(col) to unitialized memory when there is no metadata transmitted from the master. mysql-test/suite/rpl/r/rpl_row_colSize.result: BUG#22086 : Extra Slave Col: Char(5) on slave and Char(10) on master cause mysqld crash New result file for additional test. mysql-test/suite/rpl/t/rpl_row_colSize.test: BUG#22086 : Extra Slave Col: Char(5) on slave and Char(10) on master cause mysqld crash Added a test file to test each variable type that relies on field metadata from the master. mysql-test/include/test_fieldsize.inc: BUG#22086 : Extra Slave Col: Char(5) on slave and Char(10) on master cause mysqld crash Sub unit file to test each variable type that relies on field metadata from the master.
169 lines
6.4 KiB
Plaintext
169 lines
6.4 KiB
Plaintext
##################################################################
|
|
# rpl_colSize #
|
|
# #
|
|
# This test is designed to test the changes included in WL#3228. #
|
|
# The changes include the ability to replicate with the master #
|
|
# having columns that are smaller (shorter) than the slave. #
|
|
##################################################################
|
|
|
|
-- source include/master-slave.inc
|
|
-- source include/have_binlog_format_row.inc
|
|
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1;
|
|
--enable_warnings
|
|
|
|
|
|
--echo **** Testing WL#3228 changes. ****
|
|
--echo *** Create "wider" table on slave ***
|
|
sync_slave_with_master;
|
|
|
|
#
|
|
# Check each column type to verify error 1532 fires (BUG#22086)
|
|
# This check covers only those fields that require additional
|
|
# metadata from the master to be replicated to the slave. These
|
|
# field types are:
|
|
# MYSQL_TYPE_NEWDECIMAL:
|
|
# MYSQL_TYPE_FLOAT:
|
|
# MYSQL_TYPE_BIT:
|
|
# MYSQL_TYPE_SET:
|
|
# MYSQL_TYPE_STRING:
|
|
# MYSQL_TYPE_ENUM:
|
|
# MYSQL_TYPE_VARCHAR:
|
|
# MYSQL_TYPE_BLOB:
|
|
|
|
#
|
|
# Test: Checking MYSQL_TYPE_NEWDECIMAL fields
|
|
#
|
|
--echo Checking MYSQL_TYPE_NEWDECIMAL fields
|
|
let $test_table_master = CREATE TABLE t1 (a DECIMAL(20, 10));
|
|
let $test_table_slave = CREATE TABLE t1 (a DECIMAL(5,2));
|
|
let $test_insert = INSERT INTO t1 VALUES (901251.90125);
|
|
source include/test_fieldsize.inc;
|
|
|
|
let $test_table_master = CREATE TABLE t1 (a DECIMAL(27, 18));
|
|
let $test_table_slave = CREATE TABLE t1 (a DECIMAL(27, 9));
|
|
let $test_insert = INSERT INTO t1 VALUES (901251.90125);
|
|
source include/test_fieldsize.inc;
|
|
|
|
let $test_table_master = CREATE TABLE t1 (a NUMERIC(20, 10));
|
|
let $test_table_slave = CREATE TABLE t1 (a NUMERIC(5,2));
|
|
let $test_insert = INSERT INTO t1 VALUES (901251.90125);
|
|
source include/test_fieldsize.inc;
|
|
|
|
#
|
|
# Test: Checking MYSQL_TYPE_FLOAT fields
|
|
#
|
|
--echo Checking MYSQL_TYPE_FLOAT fields
|
|
let $test_table_master = CREATE TABLE t1 (a FLOAT(47));
|
|
let $test_table_slave = CREATE TABLE t1 (a FLOAT(20));
|
|
let $test_insert = INSERT INTO t1 VALUES (901251.90125);
|
|
source include/test_fieldsize.inc;
|
|
|
|
#
|
|
# Test: Checking MYSQL_TYPE_BIT fields
|
|
#
|
|
--echo Checking MYSQL_TYPE_BIT fields
|
|
let $test_table_master = CREATE TABLE t1 (a BIT(64));
|
|
let $test_table_slave = CREATE TABLE t1 (a BIT(5));
|
|
let $test_insert = INSERT INTO t1 VALUES (B'10101');
|
|
source include/test_fieldsize.inc;
|
|
|
|
let $test_table_master = CREATE TABLE t1 (a BIT(12));
|
|
let $test_table_slave = CREATE TABLE t1 (a BIT(11));
|
|
let $test_insert = INSERT INTO t1 VALUES (B'10101');
|
|
source include/test_fieldsize.inc;
|
|
|
|
#
|
|
# Test: Checking MYSQL_TYPE_SET fields
|
|
#
|
|
--echo Checking MYSQL_TYPE_SET fields
|
|
let $test_table_master = CREATE TABLE t1 (a SET('1','2','3','4','5','6','7','8','9'));
|
|
let $test_table_slave = CREATE TABLE t1 (a SET('4'));
|
|
let $test_insert = INSERT INTO t1 VALUES ('4');
|
|
source include/test_fieldsize.inc;
|
|
|
|
#
|
|
# Test: Checking MYSQL_TYPE_STRING fields
|
|
#
|
|
--echo Checking MYSQL_TYPE_STRING fields
|
|
let $test_table_master = CREATE TABLE t1 (a CHAR(20));
|
|
let $test_table_slave = CREATE TABLE t1 (a CHAR(10));
|
|
let $test_insert = INSERT INTO t1 VALUES ('This is a test.');
|
|
source include/test_fieldsize.inc;
|
|
|
|
#
|
|
# Test: Checking MYSQL_TYPE_ENUM fields
|
|
#
|
|
--echo Checking MYSQL_TYPE_ENUM fields
|
|
let $test_table_master = CREATE TABLE t1 (a ENUM(
|
|
'01','02','03','04','05','06','07','08','09',
|
|
'11','12','13','14','15','16','17','18','19',
|
|
'21','22','23','24','25','26','27','28','29',
|
|
'31','32','33','34','35','36','37','38','39',
|
|
'41','42','43','44','45','46','47','48','49',
|
|
'51','52','53','54','55','56','57','58','59',
|
|
'61','62','63','64','65','66','67','68','69',
|
|
'71','72','73','74','75','76','77','78','79',
|
|
'81','82','83','84','85','86','87','88','89',
|
|
'91','92','93','94','95','96','97','98','99',
|
|
'101','102','103','104','105','106','107','108','109',
|
|
'111','112','113','114','115','116','117','118','119',
|
|
'121','122','123','124','125','126','127','128','129',
|
|
'131','132','133','134','135','136','137','138','139',
|
|
'141','142','143','144','145','146','147','148','149',
|
|
'151','152','153','154','155','156','157','158','159',
|
|
'161','162','163','164','165','166','167','168','169',
|
|
'171','172','173','174','175','176','177','178','179',
|
|
'181','182','183','184','185','186','187','188','189',
|
|
'191','192','193','194','195','196','197','198','199',
|
|
'201','202','203','204','205','206','207','208','209',
|
|
'211','212','213','214','215','216','217','218','219',
|
|
'221','222','223','224','225','226','227','228','229',
|
|
'231','232','233','234','235','236','237','238','239',
|
|
'241','242','243','244','245','246','247','248','249',
|
|
'251','252','253','254','255','256','257','258','259',
|
|
'261','262','263','264','265','266','267','268','269',
|
|
'271','272','273','274','275','276','277','278','279',
|
|
'281','282','283','284','285','286','287','288','289',
|
|
'291','292','293','294','295','296','297','298','299'
|
|
));
|
|
let $test_table_slave = CREATE TABLE t1 (a ENUM('44','54'));
|
|
let $test_insert = INSERT INTO t1 VALUES ('44');
|
|
source include/test_fieldsize.inc;
|
|
|
|
#
|
|
# Test: Checking MYSQL_TYPE_VARCHAR fields
|
|
#
|
|
--echo Checking MYSQL_TYPE_VARCHAR fields
|
|
let $test_table_master = CREATE TABLE t1 (a VARCHAR(2000));
|
|
let $test_table_slave = CREATE TABLE t1 (a VARCHAR(100));
|
|
let $test_insert = INSERT INTO t1 VALUES ('This is a test.');
|
|
source include/test_fieldsize.inc;
|
|
|
|
let $test_table_master = CREATE TABLE t1 (a VARCHAR(200));
|
|
let $test_table_slave = CREATE TABLE t1 (a VARCHAR(10));
|
|
let $test_insert = INSERT INTO t1 VALUES ('This is a test.');
|
|
source include/test_fieldsize.inc;
|
|
|
|
let $test_table_master = CREATE TABLE t1 (a VARCHAR(2000));
|
|
let $test_table_slave = CREATE TABLE t1 (a VARCHAR(1000));
|
|
let $test_insert = INSERT INTO t1 VALUES ('This is a test.');
|
|
source include/test_fieldsize.inc;
|
|
|
|
#
|
|
# Test: Checking MYSQL_TYPE_BLOB fields
|
|
#
|
|
--echo Checking MYSQL_TYPE_BLOB fields
|
|
let $test_table_master = CREATE TABLE t1 (a LONGBLOB);
|
|
let $test_table_slave = CREATE TABLE t1 (a TINYBLOB);
|
|
let $test_insert = INSERT INTO t1 VALUES ('This is a test.');
|
|
source include/test_fieldsize.inc;
|
|
|
|
--echo *** Cleanup ***
|
|
connection master;
|
|
DROP TABLE IF EXISTS t1;
|
|
sync_slave_with_master;
|
|
# END 5.1 Test Case
|
|
|