Hi Chuck!
Gone through the patch, and I declare the patch OK to push.
Just my few cents,
Mats Kindahl
cbell@stripped wrote:
> Below is the list of changes that have just been committed into a local
> 5.1 repository of cbell. When cbell does a push these changes will
> be propagated to the main repository and, within 24 hours after the
> push, to the public repository.
> For information on how to access the public repository
> see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
>
> ChangeSet@stripped, 2007-08-10 12:48:01-04:00, cbell@mysql_cab_desk. +13 -0
> BUG#22086 : Extra Slave Col: Char(5) on slave and Char(10) on master cause mysqld
> crash
>
> 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@stripped, 2007-08-10 12:46:35-04:00,
> cbell@mysql_cab_desk. +49 -40
> 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/include/test_fieldsize.inc@stripped, 2007-08-10 12:46:42-04:00,
> cbell@mysql_cab_desk. +40 -0
> 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.
>
> mysql-test/include/test_fieldsize.inc@stripped, 2007-08-10 12:46:42-04:00,
> cbell@mysql_cab_desk. +0 -0
>
> mysql-test/suite/rpl/r/rpl_extraCol_innodb.result@stripped, 2007-08-10 12:46:35-04:00,
> cbell@mysql_cab_desk. +99 -32
> 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@stripped, 2007-08-10 12:46:36-04:00,
> cbell@mysql_cab_desk. +99 -32
> 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_row_colSize.result@stripped, 2007-08-10 12:46:41-04:00,
> cbell@mysql_cab_desk. +754 -0
> 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_row_colSize.result@stripped, 2007-08-10 12:46:41-04:00,
> cbell@mysql_cab_desk. +0 -0
>
> mysql-test/suite/rpl/t/rpl_row_colSize.test@stripped, 2007-08-10 12:46:41-04:00,
> cbell@mysql_cab_desk. +168 -0
> 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/suite/rpl/t/rpl_row_colSize.test@stripped, 2007-08-10 12:46:41-04:00,
> cbell@mysql_cab_desk. +0 -0
>
> mysql-test/suite/rpl_ndb/r/rpl_ndb_extraCol.result@stripped, 2007-08-10 12:46:37-04:00,
> cbell@mysql_cab_desk. +99 -32
> 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@stripped, 2007-08-10 12:46:37-04:00, cbell@mysql_cab_desk. +271 -1
> 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@stripped, 2007-08-10 12:46:38-04:00, cbell@mysql_cab_desk. +66 -2
> 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@stripped, 2007-08-10 12:46:39-04:00, cbell@mysql_cab_desk. +29 -126
> 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@stripped, 2007-08-10 12:46:39-04:00, cbell@mysql_cab_desk. +1 -2
> 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@stripped, 2007-08-10 12:46:40-04:00, cbell@mysql_cab_desk. +19 -0
> 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@stripped, 2007-08-10 12:46:40-04:00, cbell@mysql_cab_desk. +3 -2
> 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.
>
> diff -Nrup a/mysql-test/extra/rpl_tests/rpl_extraSlave_Col.test
> b/mysql-test/extra/rpl_tests/rpl_extraSlave_Col.test
> --- a/mysql-test/extra/rpl_tests/rpl_extraSlave_Col.test 2007-06-12 23:50:32 -04:00
> +++ b/mysql-test/extra/rpl_tests/rpl_extraSlave_Col.test 2007-08-10 12:46:35 -04:00
> @@ -71,38 +71,47 @@ sync_slave_with_master;
> ############################################
>
> ## BUG22086
> -#--echo *** Create t2 on slave ***
> -#STOP SLAVE;
> -#RESET SLAVE;
> -#eval CREATE TABLE t2 (a INT, b INT PRIMARY KEY, c CHAR(5),
> -# d FLOAT DEFAULT '2.00',
> -# e CHAR(5) DEFAULT 'TEST2')
> -# ENGINE=$engine_type;
> -#
> -#--echo *** Create t2 on Master ***
> -#connection master;
> -#eval CREATE TABLE t2 (a INT PRIMARY KEY, b INT, c CHAR(10)
> -# ) ENGINE=$engine_type;
> -#RESET MASTER;
> -#
> -#--echo *** Start Slave ***
> -#connection slave;
> -#START SLAVE;
> -#
> -#--echo *** Master Data Insert ***
> -#connection master;
> -#
> -#INSERT INTO t2 () VALUES(1,2,'Kyle, TEX'),(2,1,'JOE AUSTIN'),(3,4,'QA TESTING');
> -#SELECT * FROM t2 ORDER BY a;
> +--echo *** Create t2 on slave ***
> +STOP SLAVE;
> +RESET SLAVE;
> +eval CREATE TABLE t2 (a INT, b INT PRIMARY KEY, c CHAR(5),
> + d FLOAT DEFAULT '2.00',
> + e CHAR(5) DEFAULT 'TEST2')
> + ENGINE=$engine_type;
>
> -#--echo *** Select from slave ***
> -#sync_slave_with_master;
> -#SELECT * FROM t2 ORDER BY a;
> +--echo *** Create t2 on Master ***
> +connection master;
> +eval CREATE TABLE t2 (a INT PRIMARY KEY, b INT, c CHAR(10)
> + ) ENGINE=$engine_type;
> +RESET MASTER;
>
> -#--echo *** Drop t2 ***
> -#connection master;
> -#DROP TABLE t2;
> -#sync_slave_with_master;
> +--echo *** Master Data Insert ***
> +connection master;
> +
> +INSERT INTO t2 () VALUES(1,2,'Kyle, TEX'),(2,1,'JOE AUSTIN'),(3,4,'QA TESTING');
> +SELECT * FROM t2 ORDER BY a;
> +
> +--echo *** Start Slave ***
> +connection slave;
> +START SLAVE;
> +wait_for_slave_to_stop;
> +--replace_result $MASTER_MYPORT MASTER_PORT
> +--replace_column 1 # 4 # 7 # 8 # 9 # 16 # 22 # 23 # 33 # 35 # 36 #
> +--query_vertical SHOW SLAVE STATUS
> +STOP SLAVE;
> +RESET SLAVE;
> +SELECT * FROM t2 ORDER BY a;
> +
> +connection master;
> +RESET MASTER;
> +
> +connection slave;
> +START SLAVE;
> +
> +--echo *** Drop t2 ***
> +connection master;
> +DROP TABLE t2;
> +sync_slave_with_master;
>
> ####################################
> ### Try to replicate BLOB to INT ###
> @@ -140,7 +149,7 @@ INSERT INTO t3 () VALUES(@b1,2,'Kyle, TE
> connection slave;
> --source include/wait_for_slave_sql_to_stop.inc
> --replace_result $MASTER_MYPORT MASTER_PORT
> ---replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 #
> +--replace_column 1 # 4 # 7 # 8 # 9 # 16 # 22 # 23 # 33 # 35 # 36 #
> --query_vertical SHOW SLAVE STATUS
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> START SLAVE;
> @@ -185,7 +194,7 @@ INSERT INTO t4 () VALUES(100.22,2,'Kyle,
> connection slave;
> --source include/wait_for_slave_sql_to_stop.inc
> --replace_result $MASTER_MYPORT MASTER_PORT
> ---replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 #
> +--replace_column 1 # 4 # 7 # 8 # 9 # 16 # 22 # 23 # 33 # 35 # 36 #
> --query_vertical SHOW SLAVE STATUS
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> START SLAVE;
> @@ -230,7 +239,7 @@ INSERT INTO t5 () VALUES(1,'Kyle',200.23
> connection slave;
> --source include/wait_for_slave_sql_to_stop.inc
> --replace_result $MASTER_MYPORT MASTER_PORT
> ---replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 #
> +--replace_column 1 # 4 # 7 # 8 # 9 # 16 # 22 # 23 # 33 # 35 # 36 #
> --query_vertical SHOW SLAVE STATUS
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> START SLAVE;
> @@ -276,7 +285,7 @@ INSERT INTO t6 () VALUES(1,'Kyle',200.23
> connection slave;
> --source include/wait_for_slave_sql_to_stop.inc
> --replace_result $MASTER_MYPORT MASTER_PORT
> ---replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 #
> +--replace_column 1 # 4 # 7 # 8 # 9 # 16 # 22 # 23 # 33 # 35 # 36 #
> --query_vertical SHOW SLAVE STATUS
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=3;
> #START SLAVE;
> @@ -378,7 +387,7 @@ INSERT INTO t8 () VALUES(1,@b1,'Kyle'),(
> #connection slave;
> #wait_for_slave_to_stop;
> #--replace_result $MASTER_MYPORT MASTER_PORT
> -#--replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 #
> +#--replace_column 1 # 4 # 7 # 8 # 9 # 16 # 22 # 23 # 33 # 35 # 36 #
> #--query_vertical SHOW SLAVE STATUS
> #SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> #START SLAVE;
> @@ -429,7 +438,7 @@ sync_slave_with_master;
> #--echo *** Select from T9 ***
> #--source include/wait_for_slave_sql_to_stop.inc
> #--replace_result $MASTER_MYPORT MASTER_PORT
> -#--replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 #
> +#--replace_column 1 # 4 # 7 # 8 # 9 # 16 # 22 # 23 # 33 # 35 # 36 #
> #--query_vertical SHOW SLAVE STATUS
> #SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> #START SLAVE;
> @@ -471,7 +480,7 @@ INSERT INTO t10 () VALUES(1,@b1,'Kyle'),
> connection slave;
> --source include/wait_for_slave_sql_to_stop.inc
> --replace_result $MASTER_MYPORT MASTER_PORT
> ---replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 #
> +--replace_column 1 # 4 # 7 # 8 # 9 # 16 # 22 # 23 # 33 # 35 # 36 #
> --query_vertical SHOW SLAVE STATUS
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> START SLAVE;
> @@ -515,7 +524,7 @@ INSERT INTO t11 () VALUES(1,@b1,'Kyle'),
> connection slave;
> --source include/wait_for_slave_sql_to_stop.inc
> --replace_result $MASTER_MYPORT MASTER_PORT
> ---replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 #
> +--replace_column 1 # 4 # 7 # 8 # 9 # 16 # 22 # 23 # 33 # 35 # 36 #
> --query_vertical SHOW SLAVE STATUS
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> START SLAVE;
> @@ -725,7 +734,7 @@ ALTER TABLE t15 ADD COLUMN c6 INT AFTER
> connection slave;
> --source include/wait_for_slave_sql_to_stop.inc
> --replace_result $MASTER_MYPORT MASTER_PORT
> ---replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 #
> +--replace_column 1 # 4 # 7 # 8 # 9 # 16 # 22 # 23 # 33 # 35 # 36 #
> --query_vertical SHOW SLAVE STATUS
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> START SLAVE;
> @@ -834,7 +843,7 @@ INSERT INTO t17 () VALUES(92233720368547
> connection slave;
> --source include/wait_for_slave_sql_to_stop.inc
> --replace_result $MASTER_MYPORT MASTER_PORT
> ---replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 #
> +--replace_column 1 # 4 # 7 # 8 # 9 # 16 # 22 # 23 # 33 # 35 # 36 #
> --query_vertical SHOW SLAVE STATUS
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> START SLAVE;
> diff -Nrup a/mysql-test/include/test_fieldsize.inc
> b/mysql-test/include/test_fieldsize.inc
> --- /dev/null Wed Dec 31 16:00:00 196900
> +++ b/mysql-test/include/test_fieldsize.inc 2007-08-10 12:46:42 -04:00
> @@ -0,0 +1,40 @@
> +#
> +# include/test_fieldsize.inc
> +#
> +# This include file is designed to create a table with one column
> +# whose size on the master is greater than that on the slave. The
> +# test should fail with an error on the slave.
> +#
> +
> +connection master;
> +DROP TABLE IF EXISTS t1;
> +
> +sync_slave_with_master;
> +STOP SLAVE;
> +RESET SLAVE;
> +eval $test_table_slave;
> +
> +connection master;
> +eval $test_table_master;
> +RESET MASTER;
> +
> +eval $test_insert;
> +
> +connection slave;
> +START SLAVE;
> +wait_for_slave_to_stop;
> +--replace_result $MASTER_MYPORT MASTER_PORT
> +--replace_column 1 # 4 # 7 # 8 # 9 # 16 # 22 # 23 # 33 # 35 # 36 #
> +--query_vertical SHOW SLAVE STATUS
> +
> +# The following should be 0
> +SELECT COUNT(*) FROM t1;
> +STOP SLAVE;
> +RESET SLAVE;
> +
> +connection master;
> +RESET MASTER;
> +
> +connection slave;
> +START SLAVE;
> +
> diff -Nrup a/mysql-test/suite/rpl/r/rpl_extraCol_innodb.result
> b/mysql-test/suite/rpl/r/rpl_extraCol_innodb.result
> --- a/mysql-test/suite/rpl/r/rpl_extraCol_innodb.result 2007-07-09 04:54:16 -04:00
> +++ b/mysql-test/suite/rpl/r/rpl_extraCol_innodb.result 2007-08-10 12:46:35 -04:00
> @@ -33,6 +33,73 @@ a b c d e
> 3 4 QA 2 TEST
> *** Drop t1 ***
> DROP TABLE t1;
> +*** Create t2 on slave ***
> +STOP SLAVE;
> +RESET SLAVE;
> +CREATE TABLE t2 (a INT, b INT PRIMARY KEY, c CHAR(5),
> +d FLOAT DEFAULT '2.00',
> +e CHAR(5) DEFAULT 'TEST2')
> +ENGINE='InnoDB';
> +*** Create t2 on Master ***
> +CREATE TABLE t2 (a INT PRIMARY KEY, b INT, c CHAR(10)
> +) ENGINE='InnoDB';
> +RESET MASTER;
> +*** Master Data Insert ***
> +INSERT INTO t2 () VALUES(1,2,'Kyle, TEX'),(2,1,'JOE AUSTIN'),(3,4,'QA TESTING');
> +SELECT * FROM t2 ORDER BY a;
> +a b c
> +1 2 Kyle, TEX
> +2 1 JOE AUSTIN
> +3 4 QA TESTING
> +*** Start Slave ***
> +START SLAVE;
> +SHOW SLAVE STATUS;
> +Slave_IO_State #
> +Master_Host 127.0.0.1
> +Master_User root
> +Master_Port #
> +Connect_Retry 1
> +Master_Log_File master-bin.000001
> +Read_Master_Log_Pos #
> +Relay_Log_File #
> +Relay_Log_Pos #
> +Relay_Master_Log_File master-bin.000001
> +Slave_IO_Running Yes
> +Slave_SQL_Running No
> +Replicate_Do_DB
> +Replicate_Ignore_DB
> +Replicate_Do_Table
> +Replicate_Ignore_Table #
> +Replicate_Wild_Do_Table
> +Replicate_Wild_Ignore_Table
> +Last_Errno 1532
> +Last_Error Table definition on master and slave does not match: Column 2 size
> mismatch - master has size 10, test.t2 on slave has size 6. Master's column size should be
> <= the slave's column size.
> +Skip_Counter 0
> +Exec_Master_Log_Pos #
> +Relay_Log_Space #
> +Until_Condition None
> +Until_Log_File
> +Until_Log_Pos 0
> +Master_SSL_Allowed No
> +Master_SSL_CA_File
> +Master_SSL_CA_Path
> +Master_SSL_Cert
> +Master_SSL_Cipher
> +Master_SSL_Key
> +Seconds_Behind_Master #
> +Master_SSL_Verify_Server_Cert No
> +Last_IO_Errno #
> +Last_IO_Error #
> +Last_SQL_Errno 1532
> +Last_SQL_Error Table definition on master and slave does not match: Column 2 size
> mismatch - master has size 10, test.t2 on slave has size 6. Master's column size should be
> <= the slave's column size.
> +STOP SLAVE;
> +RESET SLAVE;
> +SELECT * FROM t2 ORDER BY a;
> +a b c d e
> +RESET MASTER;
> +START SLAVE;
> +*** Drop t2 ***
> +DROP TABLE t2;
> *** Create t3 on slave ***
> STOP SLAVE;
> RESET SLAVE;
> @@ -57,7 +124,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -69,7 +136,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -88,8 +155,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 0 type
> mismatch - received type 252, test.t3 has type 3
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -119,7 +186,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -131,7 +198,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -150,8 +217,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 0 type
> mismatch - received type 246, test.t4 has type 3
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -181,7 +248,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -193,7 +260,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -212,8 +279,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 5 type
> mismatch - received type 4, test.t5 has type 246
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -242,7 +309,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -254,7 +321,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -273,8 +340,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 3 type
> mismatch - received type 16, test.t6 has type 3
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=3;
> @@ -354,7 +421,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -366,7 +433,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -385,8 +452,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 2 type
> mismatch - received type 254, test.t10 has type 5
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -415,7 +482,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -427,7 +494,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -446,8 +513,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 2 type
> mismatch - received type 15, test.t11 has type 252
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -605,7 +672,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -617,7 +684,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1060
> @@ -636,8 +703,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1060
> Last_SQL_Error Error 'Duplicate column name 'c6'' on query. Default database:
> 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c6 INT AFTER c5'
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -740,7 +807,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -752,7 +819,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -771,8 +838,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 0 type
> mismatch - received type 8, test.t17 has type 2
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> diff -Nrup a/mysql-test/suite/rpl/r/rpl_extraCol_myisam.result
> b/mysql-test/suite/rpl/r/rpl_extraCol_myisam.result
> --- a/mysql-test/suite/rpl/r/rpl_extraCol_myisam.result 2007-07-09 04:54:16 -04:00
> +++ b/mysql-test/suite/rpl/r/rpl_extraCol_myisam.result 2007-08-10 12:46:36 -04:00
> @@ -33,6 +33,73 @@ a b c d e
> 3 4 QA 2 TEST
> *** Drop t1 ***
> DROP TABLE t1;
> +*** Create t2 on slave ***
> +STOP SLAVE;
> +RESET SLAVE;
> +CREATE TABLE t2 (a INT, b INT PRIMARY KEY, c CHAR(5),
> +d FLOAT DEFAULT '2.00',
> +e CHAR(5) DEFAULT 'TEST2')
> +ENGINE='MyISAM';
> +*** Create t2 on Master ***
> +CREATE TABLE t2 (a INT PRIMARY KEY, b INT, c CHAR(10)
> +) ENGINE='MyISAM';
> +RESET MASTER;
> +*** Master Data Insert ***
> +INSERT INTO t2 () VALUES(1,2,'Kyle, TEX'),(2,1,'JOE AUSTIN'),(3,4,'QA TESTING');
> +SELECT * FROM t2 ORDER BY a;
> +a b c
> +1 2 Kyle, TEX
> +2 1 JOE AUSTIN
> +3 4 QA TESTING
> +*** Start Slave ***
> +START SLAVE;
> +SHOW SLAVE STATUS;
> +Slave_IO_State #
> +Master_Host 127.0.0.1
> +Master_User root
> +Master_Port #
> +Connect_Retry 1
> +Master_Log_File master-bin.000001
> +Read_Master_Log_Pos #
> +Relay_Log_File #
> +Relay_Log_Pos #
> +Relay_Master_Log_File master-bin.000001
> +Slave_IO_Running Yes
> +Slave_SQL_Running No
> +Replicate_Do_DB
> +Replicate_Ignore_DB
> +Replicate_Do_Table
> +Replicate_Ignore_Table #
> +Replicate_Wild_Do_Table
> +Replicate_Wild_Ignore_Table
> +Last_Errno 1532
> +Last_Error Table definition on master and slave does not match: Column 2 size
> mismatch - master has size 10, test.t2 on slave has size 6. Master's column size should be
> <= the slave's column size.
> +Skip_Counter 0
> +Exec_Master_Log_Pos #
> +Relay_Log_Space #
> +Until_Condition None
> +Until_Log_File
> +Until_Log_Pos 0
> +Master_SSL_Allowed No
> +Master_SSL_CA_File
> +Master_SSL_CA_Path
> +Master_SSL_Cert
> +Master_SSL_Cipher
> +Master_SSL_Key
> +Seconds_Behind_Master #
> +Master_SSL_Verify_Server_Cert No
> +Last_IO_Errno #
> +Last_IO_Error #
> +Last_SQL_Errno 1532
> +Last_SQL_Error Table definition on master and slave does not match: Column 2 size
> mismatch - master has size 10, test.t2 on slave has size 6. Master's column size should be
> <= the slave's column size.
> +STOP SLAVE;
> +RESET SLAVE;
> +SELECT * FROM t2 ORDER BY a;
> +a b c d e
> +RESET MASTER;
> +START SLAVE;
> +*** Drop t2 ***
> +DROP TABLE t2;
> *** Create t3 on slave ***
> STOP SLAVE;
> RESET SLAVE;
> @@ -57,7 +124,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -69,7 +136,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -88,8 +155,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 0 type
> mismatch - received type 252, test.t3 has type 3
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -119,7 +186,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -131,7 +198,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -150,8 +217,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 0 type
> mismatch - received type 246, test.t4 has type 3
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -181,7 +248,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -193,7 +260,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -212,8 +279,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 5 type
> mismatch - received type 4, test.t5 has type 246
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -242,7 +309,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -254,7 +321,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -273,8 +340,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 3 type
> mismatch - received type 16, test.t6 has type 3
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=3;
> @@ -354,7 +421,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -366,7 +433,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -385,8 +452,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 2 type
> mismatch - received type 254, test.t10 has type 5
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -415,7 +482,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -427,7 +494,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -446,8 +513,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 2 type
> mismatch - received type 15, test.t11 has type 252
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -605,7 +672,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -617,7 +684,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1060
> @@ -636,8 +703,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1060
> Last_SQL_Error Error 'Duplicate column name 'c6'' on query. Default database:
> 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c6 INT AFTER c5'
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -740,7 +807,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -752,7 +819,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -771,8 +838,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 0 type
> mismatch - received type 8, test.t17 has type 2
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> diff -Nrup a/mysql-test/suite/rpl/r/rpl_row_colSize.result
> b/mysql-test/suite/rpl/r/rpl_row_colSize.result
> --- /dev/null Wed Dec 31 16:00:00 196900
> +++ b/mysql-test/suite/rpl/r/rpl_row_colSize.result 2007-08-10 12:46:41 -04:00
> @@ -0,0 +1,754 @@
> +stop slave;
> +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
> +reset master;
> +reset slave;
> +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
> +start slave;
> +DROP TABLE IF EXISTS t1;
> +**** Testing WL#3228 changes. ****
> +*** Create "wider" table on slave ***
> +Checking MYSQL_TYPE_NEWDECIMAL fields
> +DROP TABLE IF EXISTS t1;
> +Warnings:
> +Note 1051 Unknown table 't1'
> +STOP SLAVE;
> +RESET SLAVE;
> +CREATE TABLE t1 (a DECIMAL(5,2));
> +CREATE TABLE t1 (a DECIMAL(20, 10));
> +RESET MASTER;
> +INSERT INTO t1 VALUES (901251.90125);
> +START SLAVE;
> +SHOW SLAVE STATUS;
> +Slave_IO_State #
> +Master_Host 127.0.0.1
> +Master_User root
> +Master_Port #
> +Connect_Retry 1
> +Master_Log_File master-bin.000001
> +Read_Master_Log_Pos #
> +Relay_Log_File #
> +Relay_Log_Pos #
> +Relay_Master_Log_File master-bin.000001
> +Slave_IO_Running Yes
> +Slave_SQL_Running No
> +Replicate_Do_DB
> +Replicate_Ignore_DB
> +Replicate_Do_Table
> +Replicate_Ignore_Table #
> +Replicate_Wild_Do_Table
> +Replicate_Wild_Ignore_Table
> +Last_Errno 1532
> +Last_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 10, test.t1 on slave has size 3. Master's column size should be
> <= the slave's column size.
> +Skip_Counter 0
> +Exec_Master_Log_Pos #
> +Relay_Log_Space #
> +Until_Condition None
> +Until_Log_File
> +Until_Log_Pos 0
> +Master_SSL_Allowed No
> +Master_SSL_CA_File
> +Master_SSL_CA_Path
> +Master_SSL_Cert
> +Master_SSL_Cipher
> +Master_SSL_Key
> +Seconds_Behind_Master #
> +Master_SSL_Verify_Server_Cert No
> +Last_IO_Errno #
> +Last_IO_Error #
> +Last_SQL_Errno 1532
> +Last_SQL_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 10, test.t1 on slave has size 3. Master's column size should be
> <= the slave's column size.
> +SELECT COUNT(*) FROM t1;
> +COUNT(*)
> +0
> +STOP SLAVE;
> +RESET SLAVE;
> +RESET MASTER;
> +START SLAVE;
> +DROP TABLE IF EXISTS t1;
> +STOP SLAVE;
> +RESET SLAVE;
> +CREATE TABLE t1 (a DECIMAL(27, 9));
> +CREATE TABLE t1 (a DECIMAL(27, 18));
> +RESET MASTER;
> +INSERT INTO t1 VALUES (901251.90125);
> +START SLAVE;
> +SHOW SLAVE STATUS;
> +Slave_IO_State #
> +Master_Host 127.0.0.1
> +Master_User root
> +Master_Port #
> +Connect_Retry 1
> +Master_Log_File master-bin.000001
> +Read_Master_Log_Pos #
> +Relay_Log_File #
> +Relay_Log_Pos #
> +Relay_Master_Log_File master-bin.000001
> +Slave_IO_Running Yes
> +Slave_SQL_Running No
> +Replicate_Do_DB
> +Replicate_Ignore_DB
> +Replicate_Do_Table
> +Replicate_Ignore_Table #
> +Replicate_Wild_Do_Table
> +Replicate_Wild_Ignore_Table
> +Last_Errno 1532
> +Last_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 12, test.t1 on slave has size 12. Master's column size should
> be <= the slave's column size.
> +Skip_Counter 0
> +Exec_Master_Log_Pos #
> +Relay_Log_Space #
> +Until_Condition None
> +Until_Log_File
> +Until_Log_Pos 0
> +Master_SSL_Allowed No
> +Master_SSL_CA_File
> +Master_SSL_CA_Path
> +Master_SSL_Cert
> +Master_SSL_Cipher
> +Master_SSL_Key
> +Seconds_Behind_Master #
> +Master_SSL_Verify_Server_Cert No
> +Last_IO_Errno #
> +Last_IO_Error #
> +Last_SQL_Errno 1532
> +Last_SQL_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 12, test.t1 on slave has size 12. Master's column size should
> be <= the slave's column size.
> +SELECT COUNT(*) FROM t1;
> +COUNT(*)
> +0
> +STOP SLAVE;
> +RESET SLAVE;
> +RESET MASTER;
> +START SLAVE;
> +DROP TABLE IF EXISTS t1;
> +STOP SLAVE;
> +RESET SLAVE;
> +CREATE TABLE t1 (a NUMERIC(5,2));
> +CREATE TABLE t1 (a NUMERIC(20, 10));
> +RESET MASTER;
> +INSERT INTO t1 VALUES (901251.90125);
> +START SLAVE;
> +SHOW SLAVE STATUS;
> +Slave_IO_State #
> +Master_Host 127.0.0.1
> +Master_User root
> +Master_Port #
> +Connect_Retry 1
> +Master_Log_File master-bin.000001
> +Read_Master_Log_Pos #
> +Relay_Log_File #
> +Relay_Log_Pos #
> +Relay_Master_Log_File master-bin.000001
> +Slave_IO_Running Yes
> +Slave_SQL_Running No
> +Replicate_Do_DB
> +Replicate_Ignore_DB
> +Replicate_Do_Table
> +Replicate_Ignore_Table #
> +Replicate_Wild_Do_Table
> +Replicate_Wild_Ignore_Table
> +Last_Errno 1532
> +Last_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 10, test.t1 on slave has size 3. Master's column size should be
> <= the slave's column size.
> +Skip_Counter 0
> +Exec_Master_Log_Pos #
> +Relay_Log_Space #
> +Until_Condition None
> +Until_Log_File
> +Until_Log_Pos 0
> +Master_SSL_Allowed No
> +Master_SSL_CA_File
> +Master_SSL_CA_Path
> +Master_SSL_Cert
> +Master_SSL_Cipher
> +Master_SSL_Key
> +Seconds_Behind_Master #
> +Master_SSL_Verify_Server_Cert No
> +Last_IO_Errno #
> +Last_IO_Error #
> +Last_SQL_Errno 1532
> +Last_SQL_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 10, test.t1 on slave has size 3. Master's column size should be
> <= the slave's column size.
> +SELECT COUNT(*) FROM t1;
> +COUNT(*)
> +0
> +STOP SLAVE;
> +RESET SLAVE;
> +RESET MASTER;
> +START SLAVE;
> +Checking MYSQL_TYPE_FLOAT fields
> +DROP TABLE IF EXISTS t1;
> +STOP SLAVE;
> +RESET SLAVE;
> +CREATE TABLE t1 (a FLOAT(20));
> +CREATE TABLE t1 (a FLOAT(47));
> +RESET MASTER;
> +INSERT INTO t1 VALUES (901251.90125);
> +START SLAVE;
> +SHOW SLAVE STATUS;
> +Slave_IO_State #
> +Master_Host 127.0.0.1
> +Master_User root
> +Master_Port #
> +Connect_Retry 1
> +Master_Log_File master-bin.000001
> +Read_Master_Log_Pos #
> +Relay_Log_File #
> +Relay_Log_Pos #
> +Relay_Master_Log_File master-bin.000001
> +Slave_IO_Running Yes
> +Slave_SQL_Running No
> +Replicate_Do_DB
> +Replicate_Ignore_DB
> +Replicate_Do_Table
> +Replicate_Ignore_Table #
> +Replicate_Wild_Do_Table
> +Replicate_Wild_Ignore_Table
> +Last_Errno 1532
> +Last_Error Table definition on master and slave does not match: Column 0 type
> mismatch - received type 5, test.t1 has type 4
> +Skip_Counter 0
> +Exec_Master_Log_Pos #
> +Relay_Log_Space #
> +Until_Condition None
> +Until_Log_File
> +Until_Log_Pos 0
> +Master_SSL_Allowed No
> +Master_SSL_CA_File
> +Master_SSL_CA_Path
> +Master_SSL_Cert
> +Master_SSL_Cipher
> +Master_SSL_Key
> +Seconds_Behind_Master #
> +Master_SSL_Verify_Server_Cert No
> +Last_IO_Errno #
> +Last_IO_Error #
> +Last_SQL_Errno 1532
> +Last_SQL_Error Table definition on master and slave does not match: Column 0 type
> mismatch - received type 5, test.t1 has type 4
> +SELECT COUNT(*) FROM t1;
> +COUNT(*)
> +0
> +STOP SLAVE;
> +RESET SLAVE;
> +RESET MASTER;
> +START SLAVE;
> +Checking MYSQL_TYPE_BIT fields
> +DROP TABLE IF EXISTS t1;
> +STOP SLAVE;
> +RESET SLAVE;
> +CREATE TABLE t1 (a BIT(5));
> +CREATE TABLE t1 (a BIT(64));
> +RESET MASTER;
> +INSERT INTO t1 VALUES (B'10101');
> +START SLAVE;
> +SHOW SLAVE STATUS;
> +Slave_IO_State #
> +Master_Host 127.0.0.1
> +Master_User root
> +Master_Port #
> +Connect_Retry 1
> +Master_Log_File master-bin.000001
> +Read_Master_Log_Pos #
> +Relay_Log_File #
> +Relay_Log_Pos #
> +Relay_Master_Log_File master-bin.000001
> +Slave_IO_Running Yes
> +Slave_SQL_Running No
> +Replicate_Do_DB
> +Replicate_Ignore_DB
> +Replicate_Do_Table
> +Replicate_Ignore_Table #
> +Replicate_Wild_Do_Table
> +Replicate_Wild_Ignore_Table
> +Last_Errno 1532
> +Last_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 8, test.t1 on slave has size 1. Master's column size should be
> <= the slave's column size.
> +Skip_Counter 0
> +Exec_Master_Log_Pos #
> +Relay_Log_Space #
> +Until_Condition None
> +Until_Log_File
> +Until_Log_Pos 0
> +Master_SSL_Allowed No
> +Master_SSL_CA_File
> +Master_SSL_CA_Path
> +Master_SSL_Cert
> +Master_SSL_Cipher
> +Master_SSL_Key
> +Seconds_Behind_Master #
> +Master_SSL_Verify_Server_Cert No
> +Last_IO_Errno #
> +Last_IO_Error #
> +Last_SQL_Errno 1532
> +Last_SQL_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 8, test.t1 on slave has size 1. Master's column size should be
> <= the slave's column size.
> +SELECT COUNT(*) FROM t1;
> +COUNT(*)
> +0
> +STOP SLAVE;
> +RESET SLAVE;
> +RESET MASTER;
> +START SLAVE;
> +DROP TABLE IF EXISTS t1;
> +STOP SLAVE;
> +RESET SLAVE;
> +CREATE TABLE t1 (a BIT(11));
> +CREATE TABLE t1 (a BIT(12));
> +RESET MASTER;
> +INSERT INTO t1 VALUES (B'10101');
> +START SLAVE;
> +SHOW SLAVE STATUS;
> +Slave_IO_State #
> +Master_Host 127.0.0.1
> +Master_User root
> +Master_Port #
> +Connect_Retry 1
> +Master_Log_File master-bin.000001
> +Read_Master_Log_Pos #
> +Relay_Log_File #
> +Relay_Log_Pos #
> +Relay_Master_Log_File master-bin.000001
> +Slave_IO_Running Yes
> +Slave_SQL_Running No
> +Replicate_Do_DB
> +Replicate_Ignore_DB
> +Replicate_Do_Table
> +Replicate_Ignore_Table #
> +Replicate_Wild_Do_Table
> +Replicate_Wild_Ignore_Table
> +Last_Errno 1532
> +Last_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 2, test.t1 on slave has size 2. Master's column size should be
> <= the slave's column size.
> +Skip_Counter 0
> +Exec_Master_Log_Pos #
> +Relay_Log_Space #
> +Until_Condition None
> +Until_Log_File
> +Until_Log_Pos 0
> +Master_SSL_Allowed No
> +Master_SSL_CA_File
> +Master_SSL_CA_Path
> +Master_SSL_Cert
> +Master_SSL_Cipher
> +Master_SSL_Key
> +Seconds_Behind_Master #
> +Master_SSL_Verify_Server_Cert No
> +Last_IO_Errno #
> +Last_IO_Error #
> +Last_SQL_Errno 1532
> +Last_SQL_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 2, test.t1 on slave has size 2. Master's column size should be
> <= the slave's column size.
> +SELECT COUNT(*) FROM t1;
> +COUNT(*)
> +0
> +STOP SLAVE;
> +RESET SLAVE;
> +RESET MASTER;
> +START SLAVE;
> +Checking MYSQL_TYPE_SET fields
> +DROP TABLE IF EXISTS t1;
> +STOP SLAVE;
> +RESET SLAVE;
> +CREATE TABLE t1 (a SET('4'));
> +CREATE TABLE t1 (a SET('1','2','3','4','5','6','7','8','9'));
> +RESET MASTER;
> +INSERT INTO t1 VALUES ('4');
> +START SLAVE;
> +SHOW SLAVE STATUS;
> +Slave_IO_State #
> +Master_Host 127.0.0.1
> +Master_User root
> +Master_Port #
> +Connect_Retry 1
> +Master_Log_File master-bin.000001
> +Read_Master_Log_Pos #
> +Relay_Log_File #
> +Relay_Log_Pos #
> +Relay_Master_Log_File master-bin.000001
> +Slave_IO_Running Yes
> +Slave_SQL_Running No
> +Replicate_Do_DB
> +Replicate_Ignore_DB
> +Replicate_Do_Table
> +Replicate_Ignore_Table #
> +Replicate_Wild_Do_Table
> +Replicate_Wild_Ignore_Table
> +Last_Errno 1532
> +Last_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 2, test.t1 on slave has size 1. Master's column size should be
> <= the slave's column size.
> +Skip_Counter 0
> +Exec_Master_Log_Pos #
> +Relay_Log_Space #
> +Until_Condition None
> +Until_Log_File
> +Until_Log_Pos 0
> +Master_SSL_Allowed No
> +Master_SSL_CA_File
> +Master_SSL_CA_Path
> +Master_SSL_Cert
> +Master_SSL_Cipher
> +Master_SSL_Key
> +Seconds_Behind_Master #
> +Master_SSL_Verify_Server_Cert No
> +Last_IO_Errno #
> +Last_IO_Error #
> +Last_SQL_Errno 1532
> +Last_SQL_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 2, test.t1 on slave has size 1. Master's column size should be
> <= the slave's column size.
> +SELECT COUNT(*) FROM t1;
> +COUNT(*)
> +0
> +STOP SLAVE;
> +RESET SLAVE;
> +RESET MASTER;
> +START SLAVE;
> +Checking MYSQL_TYPE_STRING fields
> +DROP TABLE IF EXISTS t1;
> +STOP SLAVE;
> +RESET SLAVE;
> +CREATE TABLE t1 (a CHAR(10));
> +CREATE TABLE t1 (a CHAR(20));
> +RESET MASTER;
> +INSERT INTO t1 VALUES ('This is a test.');
> +START SLAVE;
> +SHOW SLAVE STATUS;
> +Slave_IO_State #
> +Master_Host 127.0.0.1
> +Master_User root
> +Master_Port #
> +Connect_Retry 1
> +Master_Log_File master-bin.000001
> +Read_Master_Log_Pos #
> +Relay_Log_File #
> +Relay_Log_Pos #
> +Relay_Master_Log_File master-bin.000001
> +Slave_IO_Running Yes
> +Slave_SQL_Running No
> +Replicate_Do_DB
> +Replicate_Ignore_DB
> +Replicate_Do_Table
> +Replicate_Ignore_Table #
> +Replicate_Wild_Do_Table
> +Replicate_Wild_Ignore_Table
> +Last_Errno 1532
> +Last_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 20, test.t1 on slave has size 11. Master's column size should
> be <= the slave's column size.
> +Skip_Counter 0
> +Exec_Master_Log_Pos #
> +Relay_Log_Space #
> +Until_Condition None
> +Until_Log_File
> +Until_Log_Pos 0
> +Master_SSL_Allowed No
> +Master_SSL_CA_File
> +Master_SSL_CA_Path
> +Master_SSL_Cert
> +Master_SSL_Cipher
> +Master_SSL_Key
> +Seconds_Behind_Master #
> +Master_SSL_Verify_Server_Cert No
> +Last_IO_Errno #
> +Last_IO_Error #
> +Last_SQL_Errno 1532
> +Last_SQL_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 20, test.t1 on slave has size 11. Master's column size should
> be <= the slave's column size.
> +SELECT COUNT(*) FROM t1;
> +COUNT(*)
> +0
> +STOP SLAVE;
> +RESET SLAVE;
> +RESET MASTER;
> +START SLAVE;
> +Checking MYSQL_TYPE_ENUM fields
> +DROP TABLE IF EXISTS t1;
> +STOP SLAVE;
> +RESET SLAVE;
> +CREATE TABLE t1 (a ENUM('44','54'));
> +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'
> + ));
> +RESET MASTER;
> +INSERT INTO t1 VALUES ('44');
> +START SLAVE;
> +SHOW SLAVE STATUS;
> +Slave_IO_State #
> +Master_Host 127.0.0.1
> +Master_User root
> +Master_Port #
> +Connect_Retry 1
> +Master_Log_File master-bin.000001
> +Read_Master_Log_Pos #
> +Relay_Log_File #
> +Relay_Log_Pos #
> +Relay_Master_Log_File master-bin.000001
> +Slave_IO_Running Yes
> +Slave_SQL_Running No
> +Replicate_Do_DB
> +Replicate_Ignore_DB
> +Replicate_Do_Table
> +Replicate_Ignore_Table #
> +Replicate_Wild_Do_Table
> +Replicate_Wild_Ignore_Table
> +Last_Errno 1532
> +Last_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 2, test.t1 on slave has size 1. Master's column size should be
> <= the slave's column size.
> +Skip_Counter 0
> +Exec_Master_Log_Pos #
> +Relay_Log_Space #
> +Until_Condition None
> +Until_Log_File
> +Until_Log_Pos 0
> +Master_SSL_Allowed No
> +Master_SSL_CA_File
> +Master_SSL_CA_Path
> +Master_SSL_Cert
> +Master_SSL_Cipher
> +Master_SSL_Key
> +Seconds_Behind_Master #
> +Master_SSL_Verify_Server_Cert No
> +Last_IO_Errno #
> +Last_IO_Error #
> +Last_SQL_Errno 1532
> +Last_SQL_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 2, test.t1 on slave has size 1. Master's column size should be
> <= the slave's column size.
> +SELECT COUNT(*) FROM t1;
> +COUNT(*)
> +0
> +STOP SLAVE;
> +RESET SLAVE;
> +RESET MASTER;
> +START SLAVE;
> +Checking MYSQL_TYPE_VARCHAR fields
> +DROP TABLE IF EXISTS t1;
> +STOP SLAVE;
> +RESET SLAVE;
> +CREATE TABLE t1 (a VARCHAR(100));
> +CREATE TABLE t1 (a VARCHAR(2000));
> +RESET MASTER;
> +INSERT INTO t1 VALUES ('This is a test.');
> +START SLAVE;
> +SHOW SLAVE STATUS;
> +Slave_IO_State #
> +Master_Host 127.0.0.1
> +Master_User root
> +Master_Port #
> +Connect_Retry 1
> +Master_Log_File master-bin.000001
> +Read_Master_Log_Pos #
> +Relay_Log_File #
> +Relay_Log_Pos #
> +Relay_Master_Log_File master-bin.000001
> +Slave_IO_Running Yes
> +Slave_SQL_Running No
> +Replicate_Do_DB
> +Replicate_Ignore_DB
> +Replicate_Do_Table
> +Replicate_Ignore_Table #
> +Replicate_Wild_Do_Table
> +Replicate_Wild_Ignore_Table
> +Last_Errno 1532
> +Last_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 2000, test.t1 on slave has size 100. Master's column size
> should be <= the slave's column size.
> +Skip_Counter 0
> +Exec_Master_Log_Pos #
> +Relay_Log_Space #
> +Until_Condition None
> +Until_Log_File
> +Until_Log_Pos 0
> +Master_SSL_Allowed No
> +Master_SSL_CA_File
> +Master_SSL_CA_Path
> +Master_SSL_Cert
> +Master_SSL_Cipher
> +Master_SSL_Key
> +Seconds_Behind_Master #
> +Master_SSL_Verify_Server_Cert No
> +Last_IO_Errno #
> +Last_IO_Error #
> +Last_SQL_Errno 1532
> +Last_SQL_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 2000, test.t1 on slave has size 100. Master's column size
> should be <= the slave's column size.
> +SELECT COUNT(*) FROM t1;
> +COUNT(*)
> +0
> +STOP SLAVE;
> +RESET SLAVE;
> +RESET MASTER;
> +START SLAVE;
> +DROP TABLE IF EXISTS t1;
> +STOP SLAVE;
> +RESET SLAVE;
> +CREATE TABLE t1 (a VARCHAR(10));
> +CREATE TABLE t1 (a VARCHAR(200));
> +RESET MASTER;
> +INSERT INTO t1 VALUES ('This is a test.');
> +START SLAVE;
> +SHOW SLAVE STATUS;
> +Slave_IO_State #
> +Master_Host 127.0.0.1
> +Master_User root
> +Master_Port #
> +Connect_Retry 1
> +Master_Log_File master-bin.000001
> +Read_Master_Log_Pos #
> +Relay_Log_File #
> +Relay_Log_Pos #
> +Relay_Master_Log_File master-bin.000001
> +Slave_IO_Running Yes
> +Slave_SQL_Running No
> +Replicate_Do_DB
> +Replicate_Ignore_DB
> +Replicate_Do_Table
> +Replicate_Ignore_Table #
> +Replicate_Wild_Do_Table
> +Replicate_Wild_Ignore_Table
> +Last_Errno 1532
> +Last_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 200, test.t1 on slave has size 10. Master's column size should
> be <= the slave's column size.
> +Skip_Counter 0
> +Exec_Master_Log_Pos #
> +Relay_Log_Space #
> +Until_Condition None
> +Until_Log_File
> +Until_Log_Pos 0
> +Master_SSL_Allowed No
> +Master_SSL_CA_File
> +Master_SSL_CA_Path
> +Master_SSL_Cert
> +Master_SSL_Cipher
> +Master_SSL_Key
> +Seconds_Behind_Master #
> +Master_SSL_Verify_Server_Cert No
> +Last_IO_Errno #
> +Last_IO_Error #
> +Last_SQL_Errno 1532
> +Last_SQL_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 200, test.t1 on slave has size 10. Master's column size should
> be <= the slave's column size.
> +SELECT COUNT(*) FROM t1;
> +COUNT(*)
> +0
> +STOP SLAVE;
> +RESET SLAVE;
> +RESET MASTER;
> +START SLAVE;
> +DROP TABLE IF EXISTS t1;
> +STOP SLAVE;
> +RESET SLAVE;
> +CREATE TABLE t1 (a VARCHAR(1000));
> +CREATE TABLE t1 (a VARCHAR(2000));
> +RESET MASTER;
> +INSERT INTO t1 VALUES ('This is a test.');
> +START SLAVE;
> +SHOW SLAVE STATUS;
> +Slave_IO_State #
> +Master_Host 127.0.0.1
> +Master_User root
> +Master_Port #
> +Connect_Retry 1
> +Master_Log_File master-bin.000001
> +Read_Master_Log_Pos #
> +Relay_Log_File #
> +Relay_Log_Pos #
> +Relay_Master_Log_File master-bin.000001
> +Slave_IO_Running Yes
> +Slave_SQL_Running No
> +Replicate_Do_DB
> +Replicate_Ignore_DB
> +Replicate_Do_Table
> +Replicate_Ignore_Table #
> +Replicate_Wild_Do_Table
> +Replicate_Wild_Ignore_Table
> +Last_Errno 1532
> +Last_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 2000, test.t1 on slave has size 1000. Master's column size
> should be <= the slave's column size.
> +Skip_Counter 0
> +Exec_Master_Log_Pos #
> +Relay_Log_Space #
> +Until_Condition None
> +Until_Log_File
> +Until_Log_Pos 0
> +Master_SSL_Allowed No
> +Master_SSL_CA_File
> +Master_SSL_CA_Path
> +Master_SSL_Cert
> +Master_SSL_Cipher
> +Master_SSL_Key
> +Seconds_Behind_Master #
> +Master_SSL_Verify_Server_Cert No
> +Last_IO_Errno #
> +Last_IO_Error #
> +Last_SQL_Errno 1532
> +Last_SQL_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 2000, test.t1 on slave has size 1000. Master's column size
> should be <= the slave's column size.
> +SELECT COUNT(*) FROM t1;
> +COUNT(*)
> +0
> +STOP SLAVE;
> +RESET SLAVE;
> +RESET MASTER;
> +START SLAVE;
> +Checking MYSQL_TYPE_BLOB fields
> +DROP TABLE IF EXISTS t1;
> +STOP SLAVE;
> +RESET SLAVE;
> +CREATE TABLE t1 (a TINYBLOB);
> +CREATE TABLE t1 (a LONGBLOB);
> +RESET MASTER;
> +INSERT INTO t1 VALUES ('This is a test.');
> +START SLAVE;
> +SHOW SLAVE STATUS;
> +Slave_IO_State #
> +Master_Host 127.0.0.1
> +Master_User root
> +Master_Port #
> +Connect_Retry 1
> +Master_Log_File master-bin.000001
> +Read_Master_Log_Pos #
> +Relay_Log_File #
> +Relay_Log_Pos #
> +Relay_Master_Log_File master-bin.000001
> +Slave_IO_Running Yes
> +Slave_SQL_Running No
> +Replicate_Do_DB
> +Replicate_Ignore_DB
> +Replicate_Do_Table
> +Replicate_Ignore_Table #
> +Replicate_Wild_Do_Table
> +Replicate_Wild_Ignore_Table
> +Last_Errno 1532
> +Last_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 4, test.t1 on slave has size 1. Master's column size should be
> <= the slave's column size.
> +Skip_Counter 0
> +Exec_Master_Log_Pos #
> +Relay_Log_Space #
> +Until_Condition None
> +Until_Log_File
> +Until_Log_Pos 0
> +Master_SSL_Allowed No
> +Master_SSL_CA_File
> +Master_SSL_CA_Path
> +Master_SSL_Cert
> +Master_SSL_Cipher
> +Master_SSL_Key
> +Seconds_Behind_Master #
> +Master_SSL_Verify_Server_Cert No
> +Last_IO_Errno #
> +Last_IO_Error #
> +Last_SQL_Errno 1532
> +Last_SQL_Error Table definition on master and slave does not match: Column 0 size
> mismatch - master has size 4, test.t1 on slave has size 1. Master's column size should be
> <= the slave's column size.
> +SELECT COUNT(*) FROM t1;
> +COUNT(*)
> +0
> +STOP SLAVE;
> +RESET SLAVE;
> +RESET MASTER;
> +START SLAVE;
> +*** Cleanup ***
> +DROP TABLE IF EXISTS t1;
> diff -Nrup a/mysql-test/suite/rpl/t/rpl_row_colSize.test
> b/mysql-test/suite/rpl/t/rpl_row_colSize.test
> --- /dev/null Wed Dec 31 16:00:00 196900
> +++ b/mysql-test/suite/rpl/t/rpl_row_colSize.test 2007-08-10 12:46:41 -04:00
> @@ -0,0 +1,168 @@
> +##################################################################
> +# 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
> +
> diff -Nrup a/mysql-test/suite/rpl_ndb/r/rpl_ndb_extraCol.result
> b/mysql-test/suite/rpl_ndb/r/rpl_ndb_extraCol.result
> --- a/mysql-test/suite/rpl_ndb/r/rpl_ndb_extraCol.result 2007-07-09 04:54:16 -04:00
> +++ b/mysql-test/suite/rpl_ndb/r/rpl_ndb_extraCol.result 2007-08-10 12:46:37 -04:00
> @@ -33,6 +33,73 @@ a b c d e
> 3 4 QA NULL NULL
> *** Drop t1 ***
> DROP TABLE t1;
> +*** Create t2 on slave ***
> +STOP SLAVE;
> +RESET SLAVE;
> +CREATE TABLE t2 (a INT, b INT PRIMARY KEY, c CHAR(5),
> +d FLOAT DEFAULT '2.00',
> +e CHAR(5) DEFAULT 'TEST2')
> +ENGINE='NDB';
> +*** Create t2 on Master ***
> +CREATE TABLE t2 (a INT PRIMARY KEY, b INT, c CHAR(10)
> +) ENGINE='NDB';
> +RESET MASTER;
> +*** Master Data Insert ***
> +INSERT INTO t2 () VALUES(1,2,'Kyle, TEX'),(2,1,'JOE AUSTIN'),(3,4,'QA TESTING');
> +SELECT * FROM t2 ORDER BY a;
> +a b c
> +1 2 Kyle, TEX
> +2 1 JOE AUSTIN
> +3 4 QA TESTING
> +*** Start Slave ***
> +START SLAVE;
> +SHOW SLAVE STATUS;
> +Slave_IO_State #
> +Master_Host 127.0.0.1
> +Master_User root
> +Master_Port #
> +Connect_Retry 1
> +Master_Log_File master-bin.000001
> +Read_Master_Log_Pos #
> +Relay_Log_File #
> +Relay_Log_Pos #
> +Relay_Master_Log_File master-bin.000001
> +Slave_IO_Running Yes
> +Slave_SQL_Running No
> +Replicate_Do_DB
> +Replicate_Ignore_DB
> +Replicate_Do_Table
> +Replicate_Ignore_Table #
> +Replicate_Wild_Do_Table
> +Replicate_Wild_Ignore_Table
> +Last_Errno 1532
> +Last_Error Table definition on master and slave does not match: Column 2 size
> mismatch - master has size 10, test.t2 on slave has size 6. Master's column size should be
> <= the slave's column size.
> +Skip_Counter 0
> +Exec_Master_Log_Pos #
> +Relay_Log_Space #
> +Until_Condition None
> +Until_Log_File
> +Until_Log_Pos 0
> +Master_SSL_Allowed No
> +Master_SSL_CA_File
> +Master_SSL_CA_Path
> +Master_SSL_Cert
> +Master_SSL_Cipher
> +Master_SSL_Key
> +Seconds_Behind_Master #
> +Master_SSL_Verify_Server_Cert No
> +Last_IO_Errno #
> +Last_IO_Error #
> +Last_SQL_Errno 1532
> +Last_SQL_Error Table definition on master and slave does not match: Column 2 size
> mismatch - master has size 10, test.t2 on slave has size 6. Master's column size should be
> <= the slave's column size.
> +STOP SLAVE;
> +RESET SLAVE;
> +SELECT * FROM t2 ORDER BY a;
> +a b c d e
> +RESET MASTER;
> +START SLAVE;
> +*** Drop t2 ***
> +DROP TABLE t2;
> *** Create t3 on slave ***
> STOP SLAVE;
> RESET SLAVE;
> @@ -57,7 +124,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -69,7 +136,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -88,8 +155,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 0 type
> mismatch - received type 252, test.t3 has type 3
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -119,7 +186,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -131,7 +198,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -150,8 +217,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 0 type
> mismatch - received type 246, test.t4 has type 3
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -181,7 +248,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -193,7 +260,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -212,8 +279,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 5 type
> mismatch - received type 4, test.t5 has type 246
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -242,7 +309,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -254,7 +321,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -273,8 +340,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 3 type
> mismatch - received type 16, test.t6 has type 3
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=3;
> @@ -354,7 +421,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -366,7 +433,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -385,8 +452,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 2 type
> mismatch - received type 254, test.t10 has type 5
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -415,7 +482,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -427,7 +494,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -446,8 +513,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 2 type
> mismatch - received type 15, test.t11 has type 252
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -605,7 +672,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -617,7 +684,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1060
> @@ -636,8 +703,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1060
> Last_SQL_Error Error 'Duplicate column name 'c6'' on query. Default database:
> 'test'. Query: 'ALTER TABLE t15 ADD COLUMN c6 INT AFTER c5'
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> @@ -741,7 +808,7 @@ SHOW SLAVE STATUS;
> Slave_IO_State #
> Master_Host 127.0.0.1
> Master_User root
> -Master_Port MASTER_PORT
> +Master_Port #
> Connect_Retry 1
> Master_Log_File master-bin.000001
> Read_Master_Log_Pos #
> @@ -753,7 +820,7 @@ Slave_SQL_Running No
> Replicate_Do_DB
> Replicate_Ignore_DB
> Replicate_Do_Table
> -Replicate_Ignore_Table
> +Replicate_Ignore_Table #
> Replicate_Wild_Do_Table
> Replicate_Wild_Ignore_Table
> Last_Errno 1532
> @@ -772,8 +839,8 @@ Master_SSL_Cipher
> Master_SSL_Key
> Seconds_Behind_Master #
> Master_SSL_Verify_Server_Cert No
> -Last_IO_Errno 0
> -Last_IO_Error
> +Last_IO_Errno #
> +Last_IO_Error #
> Last_SQL_Errno 1532
> Last_SQL_Error Table definition on master and slave does not match: Column 0 type
> mismatch - received type 8, test.t17 has type 2
> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
> diff -Nrup a/sql/field.cc b/sql/field.cc
> --- a/sql/field.cc 2007-07-29 18:10:23 -04:00
> +++ b/sql/field.cc 2007-08-10 12:46:37 -04:00
> @@ -1360,6 +1360,27 @@ bool Field::send_binary(Protocol *protoc
> }
>
>
> +/**
> + Check to see if field size is compatible with destination.
> +
> + This method is used in row-based replication to verify that the slave's
> + field size is less than or equal to the master's field size. The
> + encoded field metadata (from the master or source) is decoded and compared
> + to the size of this field (the slave or destination).
> +
> + @param field_metadata Encoded size in field metadata
> +
> + @retval 0 if this field's size is < the source field's size
> + @retval 1 if this field's size is >= the source field's size
> +*/
> +int Field::compatible_field_size(uint field_metadata)
> +{
> + uint const source_size= pack_length_from_metadata(field_metadata);
> + uint const destination_size= row_pack_length();
> + return (source_size <= destination_size);
> +}
> +
> +
> int Field::store(const char *to, uint length, CHARSET_INFO *cs,
> enum_check_fields check_level)
> {
> @@ -2690,6 +2711,76 @@ void Field_new_decimal::sql_type(String
> }
>
>
> +/**
> + Save the field metadata for new decimal fields.
> +
> + Saves the precision in the first byte and decimals() in the second
> + byte of the field metadata array at index of *metadata_ptr and
> + *(metadata_ptr + 1).
> +
> + @param metadata_ptr First byte of field metadata
> +
> + @returns number of bytes written to metadata_ptr
> +*/
> +int Field_new_decimal::do_save_field_metadata(uchar *metadata_ptr)
> +{
> + *metadata_ptr= precision;
> + *(metadata_ptr + 1)= decimals();
> + return 2;
> +}
> +
> +
> +/**
> + Returns the number of bytes field uses in row-based replication
> + row packed size.
> +
> + This method is used in row-based replication to determine the number
> + of bytes that the field consumes in the row record format. This is
> + used to skip fields in the master that do not exist on the slave.
> +
> + @param field_metadata Encoded size in field metadata
> +
> + @returns The size of the field based on the field metadata.
> +*/
> +uint Field_new_decimal::pack_length_from_metadata(uint field_metadata)
> +{
> + uint const source_precision= (field_metadata >> 8U) & 0x00ff;
> + uint const source_decimal= field_metadata & 0x00ff;
> + uint const source_size= my_decimal_get_binary_size(source_precision,
> + source_decimal);
> + return (source_size);
> +}
> +
> +
> +/**
> + Check to see if field size is compatible with destination.
> +
> + This method is used in row-based replication to verify that the slave's
> + field size is less than or equal to the master's field size. The
> + encoded field metadata (from the master or source) is decoded and compared
> + to the size of this field (the slave or destination).
> +
> + @param field_metadata Encoded size in field metadata
> +
> + @retval 0 if this field's size is < the source field's size
> + @retval 1 if this field's size is >= the source field's size
> +*/
> +int Field_new_decimal::compatible_field_size(uint field_metadata)
> +{
> + int compatible= 0;
> + uint const source_precision= (field_metadata >> 8U) & 0x00ff;
> + uint const source_decimal= field_metadata & 0x00ff;
> + uint const source_size= my_decimal_get_binary_size(source_precision,
> + source_decimal);
> + uint const destination_size= row_pack_length();
> + compatible= (source_size <= destination_size);
> + if (compatible)
> + compatible= (source_precision <= precision) &&
> + (source_decimal <= decimals());
> + return (compatible);
>
In general, returning constants makes the code more efficient, so the
following code is faster:
if (source_size <= destination_size)
return (source_precision <= precision) && (source_decimal <=
decimals());
else
return FALSE;
No need to change it though.
> +}
> +
> +
> uint Field_new_decimal::is_equal(Create_field *new_field)
> {
> return ((new_field->sql_type == real_type()) &&
> @@ -2724,7 +2815,9 @@ const uchar *Field_new_decimal::unpack(u
> uint from_pack_len= my_decimal_get_binary_size(from_precision, from_decimal);
> uint len= (param_data && (from_pack_len < length)) ?
> from_pack_len : length;
> - if (from_pack_len && (from_pack_len < length))
> + if ((from_pack_len && (from_pack_len < length)) ||
> + (from_precision < precision) ||
> + (from_decimal < decimals()))
> {
> /*
> If the master's data is smaller than the slave, we need to convert
> @@ -4087,6 +4180,22 @@ bool Field_float::send_binary(Protocol *
> }
>
>
> +/**
> + Save the field metadata for float fields.
> +
> + Saves the pack length in the first byte.
> +
> + @param metadata_ptr First byte of field metadata
> +
> + @returns number of bytes written to metadata_ptr
> +*/
> +int Field_float::do_save_field_metadata(uchar *metadata_ptr)
> +{
> + *metadata_ptr= pack_length();
> + return 1;
> +}
> +
> +
> void Field_float::sql_type(String &res) const
> {
> if (dec == NOT_FIXED_DEC)
> @@ -4404,6 +4513,23 @@ void Field_double::sort_string(uchar *to
> }
>
>
> +/**
> + Save the field metadata for double fields.
> +
> + Saves the pack length in the first byte of the field metadata array
> + at index of *metadata_ptr.
> +
> + @param metadata_ptr First byte of field metadata
> +
> + @returns number of bytes written to metadata_ptr
> +*/
> +int Field_double::do_save_field_metadata(uchar *metadata_ptr)
> +{
> + *metadata_ptr= pack_length();
> + return 1;
> +}
> +
> +
> void Field_double::sql_type(String &res) const
> {
> CHARSET_INFO *cs=res.charset();
> @@ -6445,6 +6571,25 @@ const uchar *Field_string::unpack(uchar
> }
>
>
> +/**
> + Save the field metadata for string fields.
> +
> + Saves the real type in the first byte and the field length in the
> + second byte of the field metadata array at index of *metadata_ptr and
> + *(metadata_ptr + 1).
> +
> + @param metadata_ptr First byte of field metadata
> +
> + @returns number of bytes written to metadata_ptr
> +*/
> +int Field_string::do_save_field_metadata(uchar *metadata_ptr)
> +{
> + *metadata_ptr= real_type();
> + *(metadata_ptr + 1)= field_length;
> + return 2;
> +}
> +
> +
> /*
> Compare two packed keys
>
> @@ -6597,6 +6742,24 @@ Field *Field_string::new_field(MEM_ROOT
>
> const uint Field_varstring::MAX_SIZE= UINT_MAX16;
>
> +/**
> + Save the field metadata for varstring fields.
> +
> + Saves the field length in the first byte. Note: may consume
> + 2 bytes. Caller must ensure second byte is contiguous with
> + first byte (e.g. array index 0,1).
> +
> + @param metadata_ptr First byte of field metadata
> +
> + @returns number of bytes written to metadata_ptr
> +*/
> +int Field_varstring::do_save_field_metadata(uchar *metadata_ptr)
> +{
> + char *ptr= (char *)metadata_ptr;
> + int2store(ptr, field_length);
> + return 2;
> +}
> +
> int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs)
> {
> ASSERT_COLUMN_MARKED_FOR_WRITE;
> @@ -7560,6 +7723,23 @@ int Field_blob::key_cmp(const uchar *a,c
> }
>
>
> +/**
> + Save the field metadata for blob fields.
> +
> + Saves the pack length in the first byte of the field metadata array
> + at index of *metadata_ptr.
> +
> + @param metadata_ptr First byte of field metadata
> +
> + @returns number of bytes written to metadata_ptr
> +*/
> +int Field_blob::do_save_field_metadata(uchar *metadata_ptr)
> +{
> + *metadata_ptr= pack_length_no_ptr();
> + return 1;
> +}
> +
> +
> uint32 Field_blob::sort_length() const
> {
> return (uint32) (current_thd->variables.max_sort_length +
> @@ -8145,6 +8325,25 @@ longlong Field_enum::val_int(void)
> }
>
>
> +/**
> + Save the field metadata for enum fields.
> +
> + Saves the real type in the first byte and the pack length in the
> + second byte of the field metadata array at index of *metadata_ptr and
> + *(metadata_ptr + 1).
> +
> + @param metadata_ptr First byte of field metadata
> +
> + @returns number of bytes written to metadata_ptr
> +*/
> +int Field_enum::do_save_field_metadata(uchar *metadata_ptr)
> +{
> + *metadata_ptr= real_type();
> + *(metadata_ptr + 1)= pack_length();
> + return 2;
> +}
> +
> +
> String *Field_enum::val_str(String *val_buffer __attribute__((unused)),
> String *val_ptr)
> {
> @@ -8679,6 +8878,77 @@ uint Field_bit::get_key_image(uchar *buf
> memcpy(buff, ptr, data_length);
> return data_length + 1;
> }
> +
> +
> +/**
> + Save the field metadata for bit fields.
> +
> + Saves the bit length in the first byte and bytes in record in the
> + second byte of the field metadata array at index of *metadata_ptr and
> + *(metadata_ptr + 1).
> +
> + @param metadata_ptr First byte of field metadata
> +
> + @returns number of bytes written to metadata_ptr
> +*/
> +int Field_bit::do_save_field_metadata(uchar *metadata_ptr)
> +{
> + *metadata_ptr= bit_len;
> + *(metadata_ptr + 1)= bytes_in_rec;
> + return 2;
> +}
> +
> +
> +/**
> + Returns the number of bytes field uses in row-based replication
> + row packed size.
> +
> + This method is used in row-based replication to determine the number
> + of bytes that the field consumes in the row record format. This is
> + used to skip fields in the master that do not exist on the slave.
> +
> + @param field_metadata Encoded size in field metadata
> +
> + @returns The size of the field based on the field metadata.
> +*/
> +uint Field_bit::pack_length_from_metadata(uint field_metadata)
> +{
> + uint const from_len= (field_metadata >> 8U) & 0x00ff;
> + uint const from_bit_len= field_metadata & 0x00ff;
> + uint const source_size= from_len + ((from_bit_len > 0) ? 1 : 0);
> + return (source_size);
> +}
> +
> +
> +/**
> + Check to see if field size is compatible with destination.
> +
> + This method is used in row-based replication to verify that the slave's
> + field size is less than or equal to the master's field size. The
> + encoded field metadata (from the master or source) is decoded and compared
> + to the size of this field (the slave or destination).
> +
> + @param field_metadata Encoded size in field metadata
> +
> + @retval 0 if this field's size is < the source field's size
> + @retval 1 if this field's size is >= the source field's size
> +*/
> +int Field_bit::compatible_field_size(uint field_metadata)
> +{
> + int compatible= 0;
> + uint const source_size= pack_length_from_metadata(field_metadata);
> + uint const destination_size= row_pack_length();
> + uint const from_bit_len= field_metadata & 0x00ff;
> + uint const from_len= (field_metadata >> 8U) & 0x00ff;
> + if ((bit_len == 0) || (from_bit_len == 0))
> + compatible= (source_size <= destination_size);
> + else if (from_bit_len > bit_len)
> + compatible= (from_len < bytes_in_rec);
> + else
> + compatible= ((from_bit_len <= bit_len) && (from_len <=
> bytes_in_rec));
> + return (compatible);
> +}
> +
>
>
> void Field_bit::sql_type(String &res) const
> diff -Nrup a/sql/field.h b/sql/field.h
> --- a/sql/field.h 2007-07-29 18:10:24 -04:00
> +++ b/sql/field.h 2007-08-10 12:46:38 -04:00
> @@ -151,6 +151,24 @@ public:
> table, which is located on disk).
> */
> virtual uint32 pack_length_in_rec() const { return pack_length(); }
> + virtual int compatible_field_size(uint field_metadata);
> + virtual uint pack_length_from_metadata(uint field_metadata)
> + { return field_metadata; }
> + /*
> + This method is used to return the size of the data in a row-based
> + replication row record. The default implementation of returning 0 is
> + designed to allow fields that do not use metadata to return TRUE (1)
> + from compatible_field_size() which uses this function in the comparison.
> + The default value for field metadata for fields that do not have
> + metadata is 0. Thus, 0 == 0 means the fields are compatible in size.
> +
> + Note: While most classes that override this method return pack_length(),
> + the classes Field_string, Field_varstring, and Field_blob return
> + field_length + 1, field_length, and pack_length_no_ptr() respectfully.
> + */
> + virtual uint row_pack_length() { return 0; }
> + virtual int save_field_metadata(uchar *first_byte)
> + { return do_save_field_metadata(first_byte); }
>
> /*
> data_length() return the "real size" of the data in memory.
> @@ -463,6 +481,19 @@ private:
> overridden by subclasses.
> */
> virtual size_t do_last_null_byte() const;
> +
> +/**
> + Retrieve the field metadata for fields.
> +
> + This default implementation returns 0 and saves 0 in the metadata_ptr
> + value.
> +
> + @param metadata_ptr First byte of field metadata
> +
> + @returns 0 no bytes written.
> +*/
> + virtual int do_save_field_metadata(uchar *metadata_ptr)
> + { return 0; }
> };
>
>
> @@ -589,6 +620,8 @@ public:
>
> /* New decimal/numeric field which use fixed point arithmetic */
> class Field_new_decimal :public Field_num {
> +private:
> + int do_save_field_metadata(uchar *first_byte);
> public:
> /* The maximum number of decimal digits can be stored */
> uint precision;
> @@ -628,6 +661,9 @@ public:
> uint32 max_display_length() { return field_length; }
> uint size_of() const { return sizeof(*this); }
> uint32 pack_length() const { return (uint32) bin_size; }
> + uint pack_length_from_metadata(uint field_metadata);
> + uint row_pack_length() { return pack_length(); }
> + int compatible_field_size(uint field_metadata);
> uint is_equal(Create_field *new_field);
> virtual const uchar *unpack(uchar* to, const uchar *from, uint param_data);
> };
> @@ -834,7 +870,10 @@ public:
> int cmp(const uchar *,const uchar *);
> void sort_string(uchar *buff,uint length);
> uint32 pack_length() const { return sizeof(float); }
> + uint row_pack_length() { return pack_length(); }
> void sql_type(String &str) const;
> +private:
> + int do_save_field_metadata(uchar *first_byte);
> };
>
>
> @@ -871,7 +910,10 @@ public:
> int cmp(const uchar *,const uchar *);
> void sort_string(uchar *buff,uint length);
> uint32 pack_length() const { return sizeof(double); }
> + uint row_pack_length() { return pack_length(); }
> void sql_type(String &str) const;
> +private:
> + int do_save_field_metadata(uchar *first_byte);
> };
>
>
> @@ -1168,6 +1210,9 @@ public:
> uchar *pack(uchar *to, const uchar *from, uint max_length=~(uint) 0);
> virtual const uchar *unpack(uchar* to, const uchar *from, uint param_data);
> const uchar *unpack(uchar* to, const uchar *from);
> + uint pack_length_from_metadata(uint field_metadata)
> + { return (field_metadata & 0x00ff); }
> + uint row_pack_length() { return (field_length + 1); }
> int pack_cmp(const uchar *a,const uchar *b,uint key_length,
> my_bool insert_or_update);
> int pack_cmp(const uchar *b,uint key_length,my_bool insert_or_update);
> @@ -1179,6 +1224,8 @@ public:
> { return charset() == &my_charset_bin ? FALSE : TRUE; }
> Field *new_field(MEM_ROOT *root, struct st_table *new_table, bool keep_type);
> virtual uint get_key_image(uchar *buff,uint length, imagetype type);
> +private:
> + int do_save_field_metadata(uchar *first_byte);
> };
>
>
> @@ -1214,6 +1261,7 @@ public:
>
> enum_field_types type() const { return MYSQL_TYPE_VARCHAR; }
> enum ha_base_keytype key_type() const;
> + uint row_pack_length() { return field_length; }
> bool zero_pack() const { return 0; }
> int reset(void) { bzero(ptr,field_length+length_bytes); return 0; }
> uint32 pack_length() const { return (uint32) field_length+length_bytes; }
> @@ -1265,6 +1313,8 @@ public:
> uint new_null_bit);
> uint is_equal(Create_field *new_field);
> void hash(ulong *nr, ulong *nr2);
> +private:
> + int do_save_field_metadata(uchar *first_byte);
> };
>
>
> @@ -1330,10 +1380,11 @@ public:
> This is used to determine the size of the actual data in the row
> buffer.
>
> - @retval The length of the raw data itself without the pointer.
> + @returns The length of the raw data itself without the pointer.
> */
> uint32 pack_length_no_ptr() const
> { return (uint32) (packlength); }
> + uint row_pack_length() { return pack_length_no_ptr(); }
> uint32 sort_length() const;
> inline uint32 max_data_length() const
> {
> @@ -1356,7 +1407,7 @@ public:
> This is used to determine the size of the data plus the
> packed length portion in the row data.
>
> - @retval The length in the row plus the size of the data.
> + @returns The length in the row plus the size of the data.
> */
> uint32 get_packed_size(const uchar *ptr)
> {return packlength + get_length((const uchar *)ptr);}
> @@ -1424,6 +1475,8 @@ public:
> { return charset() == &my_charset_bin ? FALSE : TRUE; }
> uint32 max_display_length();
> uint is_equal(Create_field *new_field);
> +private:
> + int do_save_field_metadata(uchar *first_byte);
> };
>
>
> @@ -1493,12 +1546,17 @@ public:
> void sql_type(String &str) const;
> uint size_of() const { return sizeof(*this); }
> enum_field_types real_type() const { return MYSQL_TYPE_ENUM; }
> + uint pack_length_from_metadata(uint field_metadata)
> + { return (field_metadata & 0x00ff); }
> + uint row_pack_length() { return pack_length(); }
> virtual bool zero_pack() const { return 0; }
> bool optimize_range(uint idx, uint part) { return 0; }
> bool eq_def(Field *field);
> bool has_charset(void) const { return TRUE; }
> /* enum and set are sorted as integers */
> CHARSET_INFO *sort_charset(void) const { return &my_charset_bin; }
> +private:
> + int do_save_field_metadata(uchar *first_byte);
> };
>
>
> @@ -1519,6 +1577,7 @@ public:
> int store(const char *to,uint length,CHARSET_INFO *charset);
> int store(double nr) { return Field_set::store((longlong) nr, FALSE); }
> int store(longlong nr, bool unsigned_val);
> +
> virtual bool zero_pack() const { return 1; }
> String *val_str(String*,String *);
> void sql_type(String &str) const;
> @@ -1582,6 +1641,10 @@ public:
> { get_key_image(buff, length, itRAW); }
> uint32 pack_length() const { return (uint32) (field_length + 7) / 8; }
> uint32 pack_length_in_rec() const { return bytes_in_rec; }
> + uint pack_length_from_metadata(uint field_metadata);
> + uint row_pack_length()
> + { return (bytes_in_rec + ((bit_len > 0) ? 1 : 0)); }
> + int compatible_field_size(uint field_metadata);
> void sql_type(String &str) const;
> uchar *pack(uchar *to, const uchar *from, uint max_length=~(uint) 0);
> virtual const uchar *unpack(uchar *to, const uchar *from, uint param_data);
> @@ -1612,6 +1675,7 @@ public:
>
> private:
> virtual size_t do_last_null_byte() const;
> + int do_save_field_metadata(uchar *first_byte);
> };
>
>
> diff -Nrup a/sql/log_event.cc b/sql/log_event.cc
> --- a/sql/log_event.cc 2007-07-30 17:39:48 -04:00
> +++ b/sql/log_event.cc 2007-08-10 12:46:39 -04:00
> @@ -6383,63 +6383,18 @@ void Rows_log_event::print_helper(FILE *
> **************************************************************************/
>
> /**
> - * Calculate field metadata size based on the real_type of the field.
> - *
> - * @returns int Size of field metadata.
> - */
> -#if !defined(MYSQL_CLIENT)
> -const int Table_map_log_event::calc_field_metadata_size()
> -{
> - DBUG_ENTER("Table_map_log_event::calc_field_metadata_size");
> - int size= 0;
> - for (unsigned int i= 0 ; i < m_table->s->fields ; i++)
> - {
> - switch (m_table->s->field[i]->real_type()) {
> - case MYSQL_TYPE_TINY_BLOB:
> - case MYSQL_TYPE_BLOB:
> - case MYSQL_TYPE_MEDIUM_BLOB:
> - case MYSQL_TYPE_LONG_BLOB:
> - case MYSQL_TYPE_DOUBLE:
> - case MYSQL_TYPE_FLOAT:
> - {
> - size++; // Store one byte here.
> - break;
> - }
> - case MYSQL_TYPE_BIT:
> - case MYSQL_TYPE_NEWDECIMAL:
> - case MYSQL_TYPE_ENUM:
> - case MYSQL_TYPE_STRING:
> - case MYSQL_TYPE_VARCHAR:
> - case MYSQL_TYPE_SET:
> - {
> - size= size + 2; // Store short int here.
> - break;
> - }
> - default:
> - break;
> - }
> - }
> - m_field_metadata_size= size;
> - DBUG_PRINT("info", ("Table_map_log_event: %d bytes in field metadata.",
> - (int)m_field_metadata_size));
> - DBUG_RETURN(m_field_metadata_size);
> -}
> -#endif /* !defined(MYSQL_CLIENT) */
> -
> -/**
> @page How replication of field metadata works.
>
> When a table map is created, the master first calls
> - Table_map_log_event::get_field_metadata_size() which calculates how many
> + Table_map_log_event::save_field_metadata() which calculates how many
> values will be in the field metadata. Only those fields that require the
> - extra data are added (see table above). The master then loops through all
> - of the fields in the table calling the method
> - Table_map_log_event::get_field_metadata() which returns the values for the
> - field that will be saved in the metadata and replicated to the slave. Once
> - all fields have been processed, the table map is written to the binlog
> - adding the size of the field metadata and the field metadata to the end of
> - the body of the table map.
> -
> + extra data are added. The method also loops through all of the fields in
> + the table calling the method Field::save_field_metadata() which returns the
> + values for the field that will be saved in the metadata and replicated to
> + the slave. Once all fields have been processed, the table map is written to
> + the binlog adding the size of the field metadata and the field metadata to
> + the end of the body of the table map.
> +
> When a table map is read on the slave, the field metadata is read from the
> table map and passed to the table_def class constructor which saves the
> field metadata from the table map into an array based on the type of the
> @@ -6478,64 +6433,8 @@ int Table_map_log_event::save_field_meta
> DBUG_ENTER("Table_map_log_event::save_field_metadata");
> int index= 0;
> for (unsigned int i= 0 ; i < m_table->s->fields ; i++)
> - {
> - switch (m_table->s->field[i]->real_type()) {
> - case MYSQL_TYPE_NEWDECIMAL:
> - {
> - m_field_metadata[index++]=
> - (uchar)((Field_new_decimal *)m_table->s->field[i])->precision;
> - m_field_metadata[index++]=
> - (uchar)((Field_new_decimal *)m_table->s->field[i])->decimals();
> - break;
> - }
> - case MYSQL_TYPE_TINY_BLOB:
> - case MYSQL_TYPE_BLOB:
> - case MYSQL_TYPE_MEDIUM_BLOB:
> - case MYSQL_TYPE_LONG_BLOB:
> - {
> - m_field_metadata[index++]=
> - (uchar)((Field_blob *)m_table->s->field[i])->pack_length_no_ptr();
> - break;
> - }
> - case MYSQL_TYPE_DOUBLE:
> - case MYSQL_TYPE_FLOAT:
> - {
> - m_field_metadata[index++]=
> (uchar)m_table->s->field[i]->pack_length();
> - break;
> - }
> - case MYSQL_TYPE_BIT:
> - {
> - m_field_metadata[index++]=
> - (uchar)((Field_bit *)m_table->s->field[i])->bit_len;
> - m_field_metadata[index++]=
> - (uchar)((Field_bit *)m_table->s->field[i])->bytes_in_rec;
> - break;
> - }
> - case MYSQL_TYPE_VARCHAR:
> - {
> - char *ptr= (char *)&m_field_metadata[index];
> - int2store(ptr, m_table->s->field[i]->field_length);
> - index= index + 2;
> - break;
> - }
> - case MYSQL_TYPE_STRING:
> - {
> - m_field_metadata[index++]= (uchar)m_table->s->field[i]->real_type();
> - m_field_metadata[index++]= m_table->s->field[i]->field_length;
> - break;
> - }
> - case MYSQL_TYPE_ENUM:
> - case MYSQL_TYPE_SET:
> - {
> - m_field_metadata[index++]= (uchar)m_table->s->field[i]->real_type();
> - m_field_metadata[index++]= m_table->s->field[i]->pack_length();
> - break;
> - }
> - default:
> - break;
> - }
> - }
> - DBUG_RETURN(0);
> + index+=
> m_table->s->field[i]->save_field_metadata(&m_field_metadata[index]);
> + DBUG_RETURN(index);
> }
> #endif /* !defined(MYSQL_CLIENT) */
>
> @@ -6573,16 +6472,6 @@ Table_map_log_event::Table_map_log_event
> m_data_size+= m_dblen + 2; // Include length and terminating \0
> m_data_size+= m_tbllen + 2; // Include length and terminating \0
> m_data_size+= 1 + m_colcnt; // COLCNT and column types
> - m_field_metadata_size= calc_field_metadata_size();
> -
> - /*
> - Now set the size of the data to the size of the field metadata array
> - plus one or two bytes for number of elements in the field metadata array.
> - */
> - if (m_field_metadata_size > 255)
> - m_data_size+= m_field_metadata_size + 2;
> - else
> - m_data_size+= m_field_metadata_size + 1;
>
> /* If malloc fails, catched in is_valid() */
> if ((m_memory= (uchar*) my_malloc(m_colcnt, MYF(MY_WME))))
> @@ -6602,17 +6491,31 @@ Table_map_log_event::Table_map_log_event
> m_data_size+= num_null_bytes;
> m_meta_memory= (uchar *)my_multi_malloc(MYF(MY_WME),
> &m_null_bits, num_null_bytes,
> - &m_field_metadata, m_field_metadata_size,
> + &m_field_metadata, (m_colcnt * 2),
> NULL);
> +
> + bzero(m_field_metadata, (m_colcnt * 2));
> +
> + /*
> + Create an array for the field metadata and store it.
> + */
> + m_field_metadata_size= save_field_metadata();
> + DBUG_ASSERT(m_field_metadata_size <= (m_colcnt * 2));
> +
> + /*
> + Now set the size of the data to the size of the field metadata array
> + plus one or two bytes for number of elements in the field metadata array.
> + */
> + if (m_field_metadata_size > 255)
> + m_data_size+= m_field_metadata_size + 2;
> + else
> + m_data_size+= m_field_metadata_size + 1;
> +
> bzero(m_null_bits, num_null_bytes);
> for (unsigned int i= 0 ; i < m_table->s->fields ; ++i)
> if (m_table->field[i]->maybe_null())
> m_null_bits[(i / 8)]+= 1 << (i % 8);
>
> - /*
> - Create an array for the field metadata and store it.
> - */
> - save_field_metadata();
> }
> #endif /* !defined(MYSQL_CLIENT) */
>
> diff -Nrup a/sql/log_event.h b/sql/log_event.h
> --- a/sql/log_event.h 2007-07-29 18:10:25 -04:00
> +++ b/sql/log_event.h 2007-08-10 12:46:39 -04:00
> @@ -2049,7 +2049,6 @@ public:
>
> virtual int get_data_size() { return m_data_size; }
> #ifndef MYSQL_CLIENT
> - virtual const int calc_field_metadata_size();
> virtual int save_field_metadata();
> virtual bool write_data_header(IO_CACHE *file);
> virtual bool write_data_body(IO_CACHE *file);
> @@ -2090,7 +2089,7 @@ private:
>
> uchar *m_field_metadata; // buffer for field metadata
> /*
> - The size of field metadata buffer set by calling calc_field_metadata_size()
> + The size of field metadata buffer set by calling save_field_metadata()
> */
> ulong m_field_metadata_size;
> uchar *m_null_bits;
> diff -Nrup a/sql/rpl_utility.cc b/sql/rpl_utility.cc
> --- a/sql/rpl_utility.cc 2007-07-30 17:39:49 -04:00
> +++ b/sql/rpl_utility.cc 2007-08-10 12:46:40 -04:00
> @@ -156,6 +156,25 @@ table_def::compatible_with(RELAY_LOG_INF
> rli->report(ERROR_LEVEL, ER_BINLOG_ROW_WRONG_TABLE_DEF,
> ER(ER_BINLOG_ROW_WRONG_TABLE_DEF), buf);
> }
> + /*
> + Check the slave's field size against that of the master.
> + */
> + if (!error &&
> + !table->field[col]->compatible_field_size(field_metadata(col)))
> + {
> + error= 1;
> + char buf[256];
> + my_snprintf(buf, sizeof(buf), "Column %d size mismatch - "
> + "master has size %d, %s.%s on slave has size %d."
> + " Master's column size should be <= the slave's "
> + "column size.", col,
> + table->field[col]->pack_length_from_metadata(
> + m_field_metadata[col]),
> + tsh->db.str, tsh->table_name.str,
> + table->field[col]->row_pack_length());
> + rli->report(ERROR_LEVEL, ER_BINLOG_ROW_WRONG_TABLE_DEF,
> + ER(ER_BINLOG_ROW_WRONG_TABLE_DEF), buf);
> + }
> }
>
> return error;
> diff -Nrup a/sql/rpl_utility.h b/sql/rpl_utility.h
> --- a/sql/rpl_utility.h 2007-07-30 17:39:49 -04:00
> +++ b/sql/rpl_utility.h 2007-08-10 12:46:40 -04:00
> @@ -61,7 +61,7 @@ public:
> */
> table_def(field_type *types, ulong size, uchar *field_metadata,
> int metadata_size, uchar *null_bitmap)
> - : m_size(size), m_type(0),
> + : m_size(size), m_type(0), m_field_metadata_size(metadata_size),
> m_field_metadata(0), m_null_bits(0), m_memory(NULL)
> {
> m_memory= (uchar *)my_multi_malloc(MYF(MY_WME),
> @@ -190,7 +190,7 @@ public:
> uint16 field_metadata(uint index) const
> {
> DBUG_ASSERT(index < m_size);
> - if (m_field_metadata)
> + if (m_field_metadata_size)
> return m_field_metadata[index];
> else
> return 0;
> @@ -239,6 +239,7 @@ private:
> ulong m_size; // Number of elements in the types array
> field_type *m_type; // Array of type descriptors
> uint16 *m_field_metadata;
> + uint m_field_metadata_size;
> uchar *m_null_bits;
> uchar *m_memory;
> };
>
>
>
--
Mats Kindahl
Lead Software Developer
Replication Team
MySQL AB, www.mysql.com