From b524f272d471735c5d5fab709e1f9011c0d828d0 Mon Sep 17 00:00:00 2001 From: Mats Kindahl Date: Fri, 18 Dec 2009 11:12:27 +0100 Subject: [PATCH] WL#5151: Conversion between different types when replicating The function create_virtual_tmp_table does not set db_low_byte_first in the same way as create_tmp_table does, causing copying from the virtual table to a real table to get strange values for SET types on big-endian machines. --- .../extra/rpl_tests/type_conversions.test | 28 +++++++++++++++++++ mysql-test/suite/rpl/r/rpl_typeconv.result | 16 +++++++++++ sql/sql_select.cc | 1 + 3 files changed, 45 insertions(+) diff --git a/mysql-test/extra/rpl_tests/type_conversions.test b/mysql-test/extra/rpl_tests/type_conversions.test index 2be1f6c0bec..6e52da59201 100644 --- a/mysql-test/extra/rpl_tests/type_conversions.test +++ b/mysql-test/extra/rpl_tests/type_conversions.test @@ -75,6 +75,34 @@ let $target_value = 'master,slave'; let $can_convert = 1; source extra/rpl_tests/check_type.inc; +let $source_type = SET('0','1','2','3','4','5','6'); +let $target_type = SET('0','1','2','3','4','5','6'); +let $source_value = '5'; +let $target_value = '5'; +let $can_convert = 1; +source extra/rpl_tests/check_type.inc; + +let $source_type = SET('0','1','2','3','4','5','6'); +let $target_type = SET('0','1','2','3','4','5','6','7','8','9','10'); +let $source_value = '5'; +let $target_value = '5'; +let $can_convert = $if_is_non_lossy; +source extra/rpl_tests/check_type.inc; + +let $source_type = SET('0','1','2','3','4','5','6','7','8','9','10'); +let $target_type = SET('0','1','2','3','4','5','6'); +let $source_value = '5'; +let $target_value = '5'; +let $can_convert = $if_is_lossy; +source extra/rpl_tests/check_type.inc; + +let $source_type = SET('0','1','2','3','4','5','6','7','8','9','10'); +let $target_type = SET('0','1','2','3','4','5','6'); +let $source_value = '7'; +let $target_value = ''; +let $can_convert = $if_is_lossy; +source extra/rpl_tests/check_type.inc; + let $source_type = TINYINT; let $target_type = TINYINT; let $source_value = 1; diff --git a/mysql-test/suite/rpl/r/rpl_typeconv.result b/mysql-test/suite/rpl/r/rpl_typeconv.result index 716956cf2cf..90451759406 100644 --- a/mysql-test/suite/rpl/r/rpl_typeconv.result +++ b/mysql-test/suite/rpl/r/rpl_typeconv.result @@ -78,6 +78,10 @@ ENUM('master',' CHAR(10) SET('master','s CHAR(10) SET('master','s SET('master','s SET('master','s SET('master','s +SET('0','1','2' SET('0','1','2' +SET('0','1','2' SET('0','1','2' +SET('0','1','2' SET('0','1','2' +SET('0','1','2' SET('0','1','2' TINYINT TINYINT TINYINT SMALLINT TINYINT MEDIUMINT @@ -176,6 +180,10 @@ ENUM('master',' CHAR(10) ALL_NON_LOSSY SET('master','s CHAR(10) ALL_NON_LOSSY SET('master','s SET('master','s ALL_NON_LOSSY SET('master','s SET('master','s ALL_NON_LOSSY +SET('0','1','2' SET('0','1','2' ALL_NON_LOSSY +SET('0','1','2' SET('0','1','2' ALL_NON_LOSSY +SET('0','1','2' SET('0','1','2' ALL_NON_LOSSY +SET('0','1','2' SET('0','1','2' ALL_NON_LOSSY TINYINT TINYINT ALL_NON_LOSSY TINYINT SMALLINT ALL_NON_LOSSY TINYINT MEDIUMINT ALL_NON_LOSSY @@ -274,6 +282,10 @@ ENUM('master',' CHAR(10) ALL_LOSSY SET('master','s CHAR(10) ALL_LOSSY SET('master','s SET('master','s ALL_LOSSY SET('master','s SET('master','s ALL_LOSSY +SET('0','1','2' SET('0','1','2' ALL_LOSSY +SET('0','1','2' SET('0','1','2' ALL_LOSSY +SET('0','1','2' SET('0','1','2' ALL_LOSSY +SET('0','1','2' SET('0','1','2' ALL_LOSSY TINYINT TINYINT ALL_LOSSY TINYINT SMALLINT ALL_LOSSY TINYINT MEDIUMINT ALL_LOSSY @@ -372,6 +384,10 @@ ENUM('master',' CHAR(10) ALL_LOSSY,ALL_NON_LOSSY SET('master','s CHAR(10) ALL_LOSSY,ALL_NON_LOSSY SET('master','s SET('master','s ALL_LOSSY,ALL_NON_LOSSY SET('master','s SET('master','s ALL_LOSSY,ALL_NON_LOSSY +SET('0','1','2' SET('0','1','2' ALL_LOSSY,ALL_NON_LOSSY +SET('0','1','2' SET('0','1','2' ALL_LOSSY,ALL_NON_LOSSY +SET('0','1','2' SET('0','1','2' ALL_LOSSY,ALL_NON_LOSSY +SET('0','1','2' SET('0','1','2' ALL_LOSSY,ALL_NON_LOSSY TINYINT TINYINT ALL_LOSSY,ALL_NON_LOSSY TINYINT SMALLINT ALL_LOSSY,ALL_NON_LOSSY TINYINT MEDIUMINT ALL_LOSSY,ALL_NON_LOSSY diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 3e57d384192..ef055202eae 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -10398,6 +10398,7 @@ TABLE *create_virtual_tmp_table(THD *thd, List &field_list) share->blob_field= blob_field; share->fields= field_count; share->blob_ptr_size= portable_sizeof_char_ptr; + share->db_low_byte_first=1; // True for HEAP and MyISAM setup_tmp_table_column_bitmaps(table, bitmaps); /* Create all fields and calculate the total length of record */