diff --git a/mysql-test/extra/rpl_tests/rpl_typeconv.inc b/mysql-test/extra/rpl_tests/rpl_typeconv.inc index 0f078854ec2..a26455fd97b 100644 --- a/mysql-test/extra/rpl_tests/rpl_typeconv.inc +++ b/mysql-test/extra/rpl_tests/rpl_typeconv.inc @@ -14,9 +14,9 @@ CREATE TABLE type_conversions ( Source TEXT, Target TEXT, Flags TEXT, - On_Master TEXT, - On_Slave TEXT, - Expected TEXT, + On_Master LONGTEXT, + On_Slave LONGTEXT, + Expected LONGTEXT, Compare INT, Error TEXT); diff --git a/mysql-test/extra/rpl_tests/type_conversions.test b/mysql-test/extra/rpl_tests/type_conversions.test index 0096fda3174..9004cb00c24 100644 --- a/mysql-test/extra/rpl_tests/type_conversions.test +++ b/mysql-test/extra/rpl_tests/type_conversions.test @@ -876,5 +876,136 @@ let $can_convert = $if_is_lossy; source extra/rpl_tests/check_type.inc; +--echo # +--echo # MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values +--echo # + +# TINYBLOB + +let $source_type= TINYBLOB; +let $target_type= BLOB; +let $source_value= REPEAT('a',250); +let $target_value= REPEAT('a',250); +let $can_convert = $if_is_non_lossy; +source extra/rpl_tests/check_type.inc; + +let $source_type= TINYBLOB; +let $target_type= MEDIUMBLOB; +let $source_value= REPEAT('a',250); +let $target_value= REPEAT('a',250); +let $can_convert = $if_is_non_lossy; +source extra/rpl_tests/check_type.inc; + +let $source_type= TINYBLOB; +let $target_type= LONGBLOB; +let $source_value= REPEAT('a',250); +let $target_value= REPEAT('a',250); +let $can_convert = $if_is_non_lossy; +source extra/rpl_tests/check_type.inc; + +let $source_type= TINYBLOB; +let $target_type= VARBINARY(255); +let $source_value= REPEAT('a',250); +let $target_value= REPEAT('a',250); +let $can_convert = $if_is_non_lossy; +source extra/rpl_tests/check_type.inc; + + +# BLOB + +let $source_type= BLOB; +let $target_type= TINYBLOB; +let $source_value= REPEAT('a',64000); +let $target_value= REPEAT('a',255); +let $can_convert = $if_is_lossy; +source extra/rpl_tests/check_type.inc; + +let $source_type= BLOB; +let $target_type= MEDIUMBLOB; +let $source_value= REPEAT('a',64000); +let $target_value= REPEAT('a',64000); +let $can_convert = $if_is_non_lossy; +source extra/rpl_tests/check_type.inc; + +let $source_type= BLOB; +let $target_type= LONGBLOB; +let $source_value= REPEAT('a',64000); +let $target_value= REPEAT('a',64000); +let $can_convert = $if_is_non_lossy; +source extra/rpl_tests/check_type.inc; + +let $source_type= BLOB; +let $target_type= VARBINARY(65500); +let $source_value= REPEAT('a',65535); +let $target_value= REPEAT('a',65500); +let $can_convert = $if_is_lossy; +source extra/rpl_tests/check_type.inc; + + +# MEDIUMBLOB + +let $source_type= MEDIUMBLOB; +let $target_type= TINYBLOB; +let $source_value= REPEAT('a',66000); +let $target_value= REPEAT('a',255); +let $can_convert = $if_is_lossy; +source extra/rpl_tests/check_type.inc; + +let $source_type= MEDIUMBLOB; +let $target_type= BLOB; +let $source_value= REPEAT('a',66000); +let $target_value= REPEAT('a',65535); +let $can_convert = $if_is_lossy; +source extra/rpl_tests/check_type.inc; + +# This failed before the fix +#let $source_type= MEDIUMBLOB; +#let $target_type= LONGBLOB; +#let $source_value= REPEAT('a',66000); +#let $target_value= REPEAT('a',66000); +#let $can_convert = $if_is_non_lossy; +#source extra/rpl_tests/check_type.inc; + +let $source_type= MEDIUMBLOB; +let $target_type= VARBINARY(65500); +let $source_value= REPEAT('a',66000); +let $target_value= REPEAT('a',65500); +let $can_convert = $if_is_lossy; +source extra/rpl_tests/check_type.inc; + + +# LONGBLOB + +let $source_type= LONGBLOB; +let $target_type= TINYBLOB; +let $source_value= REPEAT('a',66000); +let $target_value= REPEAT('a',255); +let $can_convert = $if_is_lossy; +source extra/rpl_tests/check_type.inc; + +let $source_type= LONGBLOB; +let $target_type= BLOB; +let $source_value= REPEAT('a',66000); +let $target_value= REPEAT('a',65535); +let $can_convert = $if_is_lossy; +source extra/rpl_tests/check_type.inc; + +# This failed before the fix +#let $source_type= LONGBLOB; +#let $target_type= BLOB; +#let $source_value= REPEAT('a',66000); +#let $target_value= REPEAT('a',66000); +#let $can_convert = $if_is_lossy; +#source extra/rpl_tests/check_type.inc; + +let $source_type= LONGBLOB; +let $target_type= VARBINARY(65500); +let $source_value= REPEAT('a',66000); +let $target_value= REPEAT('a',65500); +let $can_convert = $if_is_lossy; +source extra/rpl_tests/check_type.inc; + +--echo # End of MDEV-15833 + --source include/rpl_reset.inc enable_query_log; diff --git a/mysql-test/suite/binlog_encryption/rpl_typeconv.result b/mysql-test/suite/binlog_encryption/rpl_typeconv.result index 988962ff6f0..46e68de6764 100644 --- a/mysql-test/suite/binlog_encryption/rpl_typeconv.result +++ b/mysql-test/suite/binlog_encryption/rpl_typeconv.result @@ -7,9 +7,9 @@ TestNo INT AUTO_INCREMENT PRIMARY KEY, Source TEXT, Target TEXT, Flags TEXT, -On_Master TEXT, -On_Slave TEXT, -Expected TEXT, +On_Master LONGTEXT, +On_Slave LONGTEXT, +Expected LONGTEXT, Compare INT, Error TEXT); SELECT @@global.slave_type_conversions; @@ -39,18 +39,34 @@ ALL_LOSSY,ALL_NON_LOSSY connection slave; SET GLOBAL SLAVE_TYPE_CONVERSIONS=''; **** Running tests with @@SLAVE_TYPE_CONVERSIONS = '' **** +# +# MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values +# +# End of MDEV-15833 include/rpl_reset.inc connection slave; SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_NON_LOSSY'; **** Running tests with @@SLAVE_TYPE_CONVERSIONS = 'ALL_NON_LOSSY' **** +# +# MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values +# +# End of MDEV-15833 include/rpl_reset.inc connection slave; SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_LOSSY'; **** Running tests with @@SLAVE_TYPE_CONVERSIONS = 'ALL_LOSSY' **** +# +# MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values +# +# End of MDEV-15833 include/rpl_reset.inc connection slave; SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_LOSSY,ALL_NON_LOSSY'; **** Running tests with @@SLAVE_TYPE_CONVERSIONS = 'ALL_LOSSY,ALL_NON_LOSSY' **** +# +# MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values +# +# End of MDEV-15833 include/rpl_reset.inc connection slave; **** Result of conversions **** @@ -176,6 +192,20 @@ BIT(5) BIT(6) BIT(6) BIT(5) BIT(5) BIT(12) BIT(12) BIT(5) +TINYBLOB BLOB +TINYBLOB MEDIUMBLOB +TINYBLOB LONGBLOB +TINYBLOB VARBINARY(255) +BLOB TINYBLOB +BLOB MEDIUMBLOB +BLOB LONGBLOB +BLOB VARBINARY(65500 +MEDIUMBLOB TINYBLOB +MEDIUMBLOB BLOB +MEDIUMBLOB VARBINARY(65500 +LONGBLOB TINYBLOB +LONGBLOB BLOB +LONGBLOB VARBINARY(65500 TINYBLOB TINYBLOB ALL_NON_LOSSY TINYBLOB BLOB ALL_NON_LOSSY TINYBLOB MEDIUMBLOB ALL_NON_LOSSY @@ -297,6 +327,20 @@ BIT(5) BIT(6) ALL_NON_LOSSY BIT(6) BIT(5) ALL_NON_LOSSY BIT(5) BIT(12) ALL_NON_LOSSY BIT(12) BIT(5) ALL_NON_LOSSY +TINYBLOB BLOB ALL_NON_LOSSY +TINYBLOB MEDIUMBLOB ALL_NON_LOSSY +TINYBLOB LONGBLOB ALL_NON_LOSSY +TINYBLOB VARBINARY(255) ALL_NON_LOSSY +BLOB TINYBLOB ALL_NON_LOSSY +BLOB MEDIUMBLOB ALL_NON_LOSSY +BLOB LONGBLOB ALL_NON_LOSSY +BLOB VARBINARY(65500 ALL_NON_LOSSY +MEDIUMBLOB TINYBLOB ALL_NON_LOSSY +MEDIUMBLOB BLOB ALL_NON_LOSSY +MEDIUMBLOB VARBINARY(65500 ALL_NON_LOSSY +LONGBLOB TINYBLOB ALL_NON_LOSSY +LONGBLOB BLOB ALL_NON_LOSSY +LONGBLOB VARBINARY(65500 ALL_NON_LOSSY TINYBLOB TINYBLOB ALL_LOSSY TINYBLOB BLOB ALL_LOSSY TINYBLOB MEDIUMBLOB ALL_LOSSY @@ -418,6 +462,20 @@ BIT(5) BIT(6) ALL_LOSSY BIT(6) BIT(5) ALL_LOSSY BIT(5) BIT(12) ALL_LOSSY BIT(12) BIT(5) ALL_LOSSY +TINYBLOB BLOB ALL_LOSSY +TINYBLOB MEDIUMBLOB ALL_LOSSY +TINYBLOB LONGBLOB ALL_LOSSY +TINYBLOB VARBINARY(255) ALL_LOSSY +BLOB TINYBLOB ALL_LOSSY +BLOB MEDIUMBLOB ALL_LOSSY +BLOB LONGBLOB ALL_LOSSY +BLOB VARBINARY(65500 ALL_LOSSY +MEDIUMBLOB TINYBLOB ALL_LOSSY +MEDIUMBLOB BLOB ALL_LOSSY +MEDIUMBLOB VARBINARY(65500 ALL_LOSSY +LONGBLOB TINYBLOB ALL_LOSSY +LONGBLOB BLOB ALL_LOSSY +LONGBLOB VARBINARY(65500 ALL_LOSSY TINYBLOB TINYBLOB ALL_LOSSY,ALL_NON_LOSSY TINYBLOB BLOB ALL_LOSSY,ALL_NON_LOSSY TINYBLOB MEDIUMBLOB ALL_LOSSY,ALL_NON_LOSSY @@ -539,6 +597,20 @@ BIT(5) BIT(6) ALL_LOSSY,ALL_NON_LOSSY BIT(6) BIT(5) ALL_LOSSY,ALL_NON_LOSSY BIT(5) BIT(12) ALL_LOSSY,ALL_NON_LOSSY BIT(12) BIT(5) ALL_LOSSY,ALL_NON_LOSSY +TINYBLOB BLOB ALL_LOSSY,ALL_NON_LOSSY +TINYBLOB MEDIUMBLOB ALL_LOSSY,ALL_NON_LOSSY +TINYBLOB LONGBLOB ALL_LOSSY,ALL_NON_LOSSY +TINYBLOB VARBINARY(255) ALL_LOSSY,ALL_NON_LOSSY +BLOB TINYBLOB ALL_LOSSY,ALL_NON_LOSSY +BLOB MEDIUMBLOB ALL_LOSSY,ALL_NON_LOSSY +BLOB LONGBLOB ALL_LOSSY,ALL_NON_LOSSY +BLOB VARBINARY(65500 ALL_LOSSY,ALL_NON_LOSSY +MEDIUMBLOB TINYBLOB ALL_LOSSY,ALL_NON_LOSSY +MEDIUMBLOB BLOB ALL_LOSSY,ALL_NON_LOSSY +MEDIUMBLOB VARBINARY(65500 ALL_LOSSY,ALL_NON_LOSSY +LONGBLOB TINYBLOB ALL_LOSSY,ALL_NON_LOSSY +LONGBLOB BLOB ALL_LOSSY,ALL_NON_LOSSY +LONGBLOB VARBINARY(65500 ALL_LOSSY,ALL_NON_LOSSY DROP TABLE type_conversions; call mtr.add_suppression("Slave SQL.*Column 1 of table .test.t1. cannot be converted from type.* error.* 1677"); connection master; diff --git a/mysql-test/suite/rpl/r/rpl_typeconv.result b/mysql-test/suite/rpl/r/rpl_typeconv.result index 988962ff6f0..46e68de6764 100644 --- a/mysql-test/suite/rpl/r/rpl_typeconv.result +++ b/mysql-test/suite/rpl/r/rpl_typeconv.result @@ -7,9 +7,9 @@ TestNo INT AUTO_INCREMENT PRIMARY KEY, Source TEXT, Target TEXT, Flags TEXT, -On_Master TEXT, -On_Slave TEXT, -Expected TEXT, +On_Master LONGTEXT, +On_Slave LONGTEXT, +Expected LONGTEXT, Compare INT, Error TEXT); SELECT @@global.slave_type_conversions; @@ -39,18 +39,34 @@ ALL_LOSSY,ALL_NON_LOSSY connection slave; SET GLOBAL SLAVE_TYPE_CONVERSIONS=''; **** Running tests with @@SLAVE_TYPE_CONVERSIONS = '' **** +# +# MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values +# +# End of MDEV-15833 include/rpl_reset.inc connection slave; SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_NON_LOSSY'; **** Running tests with @@SLAVE_TYPE_CONVERSIONS = 'ALL_NON_LOSSY' **** +# +# MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values +# +# End of MDEV-15833 include/rpl_reset.inc connection slave; SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_LOSSY'; **** Running tests with @@SLAVE_TYPE_CONVERSIONS = 'ALL_LOSSY' **** +# +# MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values +# +# End of MDEV-15833 include/rpl_reset.inc connection slave; SET GLOBAL SLAVE_TYPE_CONVERSIONS='ALL_LOSSY,ALL_NON_LOSSY'; **** Running tests with @@SLAVE_TYPE_CONVERSIONS = 'ALL_LOSSY,ALL_NON_LOSSY' **** +# +# MDEV-15833 Row format replication between LONGBLOB and MEDIUMBLOB does not work for long values +# +# End of MDEV-15833 include/rpl_reset.inc connection slave; **** Result of conversions **** @@ -176,6 +192,20 @@ BIT(5) BIT(6) BIT(6) BIT(5) BIT(5) BIT(12) BIT(12) BIT(5) +TINYBLOB BLOB +TINYBLOB MEDIUMBLOB +TINYBLOB LONGBLOB +TINYBLOB VARBINARY(255) +BLOB TINYBLOB +BLOB MEDIUMBLOB +BLOB LONGBLOB +BLOB VARBINARY(65500 +MEDIUMBLOB TINYBLOB +MEDIUMBLOB BLOB +MEDIUMBLOB VARBINARY(65500 +LONGBLOB TINYBLOB +LONGBLOB BLOB +LONGBLOB VARBINARY(65500 TINYBLOB TINYBLOB ALL_NON_LOSSY TINYBLOB BLOB ALL_NON_LOSSY TINYBLOB MEDIUMBLOB ALL_NON_LOSSY @@ -297,6 +327,20 @@ BIT(5) BIT(6) ALL_NON_LOSSY BIT(6) BIT(5) ALL_NON_LOSSY BIT(5) BIT(12) ALL_NON_LOSSY BIT(12) BIT(5) ALL_NON_LOSSY +TINYBLOB BLOB ALL_NON_LOSSY +TINYBLOB MEDIUMBLOB ALL_NON_LOSSY +TINYBLOB LONGBLOB ALL_NON_LOSSY +TINYBLOB VARBINARY(255) ALL_NON_LOSSY +BLOB TINYBLOB ALL_NON_LOSSY +BLOB MEDIUMBLOB ALL_NON_LOSSY +BLOB LONGBLOB ALL_NON_LOSSY +BLOB VARBINARY(65500 ALL_NON_LOSSY +MEDIUMBLOB TINYBLOB ALL_NON_LOSSY +MEDIUMBLOB BLOB ALL_NON_LOSSY +MEDIUMBLOB VARBINARY(65500 ALL_NON_LOSSY +LONGBLOB TINYBLOB ALL_NON_LOSSY +LONGBLOB BLOB ALL_NON_LOSSY +LONGBLOB VARBINARY(65500 ALL_NON_LOSSY TINYBLOB TINYBLOB ALL_LOSSY TINYBLOB BLOB ALL_LOSSY TINYBLOB MEDIUMBLOB ALL_LOSSY @@ -418,6 +462,20 @@ BIT(5) BIT(6) ALL_LOSSY BIT(6) BIT(5) ALL_LOSSY BIT(5) BIT(12) ALL_LOSSY BIT(12) BIT(5) ALL_LOSSY +TINYBLOB BLOB ALL_LOSSY +TINYBLOB MEDIUMBLOB ALL_LOSSY +TINYBLOB LONGBLOB ALL_LOSSY +TINYBLOB VARBINARY(255) ALL_LOSSY +BLOB TINYBLOB ALL_LOSSY +BLOB MEDIUMBLOB ALL_LOSSY +BLOB LONGBLOB ALL_LOSSY +BLOB VARBINARY(65500 ALL_LOSSY +MEDIUMBLOB TINYBLOB ALL_LOSSY +MEDIUMBLOB BLOB ALL_LOSSY +MEDIUMBLOB VARBINARY(65500 ALL_LOSSY +LONGBLOB TINYBLOB ALL_LOSSY +LONGBLOB BLOB ALL_LOSSY +LONGBLOB VARBINARY(65500 ALL_LOSSY TINYBLOB TINYBLOB ALL_LOSSY,ALL_NON_LOSSY TINYBLOB BLOB ALL_LOSSY,ALL_NON_LOSSY TINYBLOB MEDIUMBLOB ALL_LOSSY,ALL_NON_LOSSY @@ -539,6 +597,20 @@ BIT(5) BIT(6) ALL_LOSSY,ALL_NON_LOSSY BIT(6) BIT(5) ALL_LOSSY,ALL_NON_LOSSY BIT(5) BIT(12) ALL_LOSSY,ALL_NON_LOSSY BIT(12) BIT(5) ALL_LOSSY,ALL_NON_LOSSY +TINYBLOB BLOB ALL_LOSSY,ALL_NON_LOSSY +TINYBLOB MEDIUMBLOB ALL_LOSSY,ALL_NON_LOSSY +TINYBLOB LONGBLOB ALL_LOSSY,ALL_NON_LOSSY +TINYBLOB VARBINARY(255) ALL_LOSSY,ALL_NON_LOSSY +BLOB TINYBLOB ALL_LOSSY,ALL_NON_LOSSY +BLOB MEDIUMBLOB ALL_LOSSY,ALL_NON_LOSSY +BLOB LONGBLOB ALL_LOSSY,ALL_NON_LOSSY +BLOB VARBINARY(65500 ALL_LOSSY,ALL_NON_LOSSY +MEDIUMBLOB TINYBLOB ALL_LOSSY,ALL_NON_LOSSY +MEDIUMBLOB BLOB ALL_LOSSY,ALL_NON_LOSSY +MEDIUMBLOB VARBINARY(65500 ALL_LOSSY,ALL_NON_LOSSY +LONGBLOB TINYBLOB ALL_LOSSY,ALL_NON_LOSSY +LONGBLOB BLOB ALL_LOSSY,ALL_NON_LOSSY +LONGBLOB VARBINARY(65500 ALL_LOSSY,ALL_NON_LOSSY DROP TABLE type_conversions; call mtr.add_suppression("Slave SQL.*Column 1 of table .test.t1. cannot be converted from type.* error.* 1677"); connection master; diff --git a/sql/sql_type.cc b/sql/sql_type.cc index d85664568a1..d172dee56b6 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -548,47 +548,17 @@ Field *Type_handler_varchar::make_conversion_table_field(TABLE *table, } -Field *Type_handler_tiny_blob::make_conversion_table_field(TABLE *table, - uint metadata, - const Field *target) - const +Field *Type_handler_blob_common::make_conversion_table_field(TABLE *table, + uint metadata, + const Field *target) + const { + uint pack_length= metadata & 0x00ff; + if (pack_length < 1 || pack_length > 4) + return NULL; // Broken binary log? return new(table->in_use->mem_root) Field_blob(NULL, (uchar *) "", 1, Field::NONE, TMPNAME, - table->s, 1, target->charset()); -} - - -Field *Type_handler_blob::make_conversion_table_field(TABLE *table, - uint metadata, - const Field *target) - const -{ - return new(table->in_use->mem_root) - Field_blob(NULL, (uchar *) "", 1, Field::NONE, TMPNAME, - table->s, 2, target->charset()); -} - - -Field *Type_handler_medium_blob::make_conversion_table_field(TABLE *table, - uint metadata, - const Field *target) - const -{ - return new(table->in_use->mem_root) - Field_blob(NULL, (uchar *) "", 1, Field::NONE, TMPNAME, - table->s, 3, target->charset()); -} - - -Field *Type_handler_long_blob::make_conversion_table_field(TABLE *table, - uint metadata, - const Field *target) - const -{ - return new(table->in_use->mem_root) - Field_blob(NULL, (uchar *) "", 1, Field::NONE, TMPNAME, - table->s, 4, target->charset()); + table->s, pack_length, target->charset()); } diff --git a/sql/sql_type.h b/sql/sql_type.h index 596c338720e..8141b7ef45f 100644 --- a/sql/sql_type.h +++ b/sql/sql_type.h @@ -416,43 +416,44 @@ public: }; -class Type_handler_tiny_blob: public Type_handler_string_result +class Type_handler_blob_common: public Type_handler_string_result +{ +public: + virtual ~Type_handler_blob_common() { } + Field *make_conversion_table_field(TABLE *, uint metadata, + const Field *target) const; +}; + + +class Type_handler_tiny_blob: public Type_handler_blob_common { public: virtual ~Type_handler_tiny_blob() {} enum_field_types field_type() const { return MYSQL_TYPE_TINY_BLOB; } - Field *make_conversion_table_field(TABLE *, uint metadata, - const Field *target) const; }; -class Type_handler_medium_blob: public Type_handler_string_result +class Type_handler_medium_blob: public Type_handler_blob_common { public: virtual ~Type_handler_medium_blob() {} enum_field_types field_type() const { return MYSQL_TYPE_MEDIUM_BLOB; } - Field *make_conversion_table_field(TABLE *, uint metadata, - const Field *target) const; }; -class Type_handler_long_blob: public Type_handler_string_result +class Type_handler_long_blob: public Type_handler_blob_common { public: virtual ~Type_handler_long_blob() {} enum_field_types field_type() const { return MYSQL_TYPE_LONG_BLOB; } - Field *make_conversion_table_field(TABLE *, uint metadata, - const Field *target) const; }; -class Type_handler_blob: public Type_handler_string_result +class Type_handler_blob: public Type_handler_blob_common { public: virtual ~Type_handler_blob() {} enum_field_types field_type() const { return MYSQL_TYPE_BLOB; } - Field *make_conversion_table_field(TABLE *, uint metadata, - const Field *target) const; };