diff --git a/mysql-test/r/alter_table.result b/mysql-test/r/alter_table.result index e01f4fa047b..f0edfc9bb59 100644 --- a/mysql-test/r/alter_table.result +++ b/mysql-test/r/alter_table.result @@ -1240,4 +1240,16 @@ select (@orig_max_data_length > @changed_max_data_length); (@orig_max_data_length > @changed_max_data_length) 1 drop table t1; +CREATE TABLE t1(a INT AUTO_INCREMENT PRIMARY KEY, +b ENUM('a', 'b', 'c') NOT NULL); +INSERT INTO t1 (b) VALUES ('a'), ('c'), ('b'), ('b'), ('a'); +ALTER TABLE t1 MODIFY b ENUM('a', 'z', 'b', 'c') NOT NULL; +SELECT * FROM t1; +a b +1 a +2 c +3 b +4 b +5 a +DROP TABLE t1; End of 5.1 tests diff --git a/mysql-test/r/binlog_format_basic.result b/mysql-test/r/binlog_format_basic.result index 3fee9bade7e..72ba35cd753 100644 --- a/mysql-test/r/binlog_format_basic.result +++ b/mysql-test/r/binlog_format_basic.result @@ -1,3 +1,6 @@ +SELECT @@GLOBAL.binlog_format; +@@GLOBAL.binlog_format +STATEMENT '#---------------------BS_STVARS_002_01----------------------#' SELECT COUNT(@@GLOBAL.binlog_format); COUNT(@@GLOBAL.binlog_format) diff --git a/mysql-test/t/alter_table.test b/mysql-test/t/alter_table.test index 8502ba3f3d3..76d57e76491 100644 --- a/mysql-test/t/alter_table.test +++ b/mysql-test/t/alter_table.test @@ -977,4 +977,14 @@ select (@orig_max_data_length > @changed_max_data_length); drop table t1; +# +# Bug #23113: Different behavior on altering ENUM fields between 5.0 and 5.1 +# +CREATE TABLE t1(a INT AUTO_INCREMENT PRIMARY KEY, + b ENUM('a', 'b', 'c') NOT NULL); +INSERT INTO t1 (b) VALUES ('a'), ('c'), ('b'), ('b'), ('a'); +ALTER TABLE t1 MODIFY b ENUM('a', 'z', 'b', 'c') NOT NULL; +SELECT * FROM t1; +DROP TABLE t1; + --echo End of 5.1 tests diff --git a/mysql-test/t/binlog_format_basic.test b/mysql-test/t/binlog_format_basic.test index e9dfade8f56..819ad047c1b 100644 --- a/mysql-test/t/binlog_format_basic.test +++ b/mysql-test/t/binlog_format_basic.test @@ -22,6 +22,13 @@ # # ############################################################################### +################################################################### +# BUG#39812: Make statement replication default for 5.1 (to match 5.0) +# We just verify that the default binlog_format is STATEMENT in 5.1. +# In 6.0, it should be MIXED. +################################################################### +SELECT @@GLOBAL.binlog_format; + --echo '#---------------------BS_STVARS_002_01----------------------#' #################################################################### # Displaying default value # diff --git a/sql/field.cc b/sql/field.cc index 16bf0fdb070..a03beb4e8af 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -8783,28 +8783,43 @@ bool Field::eq_def(Field *field) return 1; } + /** @return returns 1 if the fields are equally defined */ + bool Field_enum::eq_def(Field *field) { if (!Field::eq_def(field)) return 0; - TYPELIB *from_lib=((Field_enum*) field)->typelib; - - if (typelib->count < from_lib->count) - return 0; - for (uint i=0 ; i < from_lib->count ; i++) - if (my_strnncoll(field_charset, - (const uchar*)typelib->type_names[i], - strlen(typelib->type_names[i]), - (const uchar*)from_lib->type_names[i], - strlen(from_lib->type_names[i]))) - return 0; - return 1; + return compare_enum_values(((Field_enum*) field)->typelib); } + +bool Field_enum::compare_enum_values(TYPELIB *values) +{ + if (typelib->count != values->count) + return FALSE; + for (uint i= 0; i < typelib->count; i++) + if (my_strnncoll(field_charset, + (const uchar*) typelib->type_names[i], + typelib->type_lengths[i], + (const uchar*) values->type_names[i], + values->type_lengths[i])) + return FALSE; + return TRUE; +} + + +uint Field_enum::is_equal(Create_field *new_field) +{ + if (!Field_str::is_equal(new_field)) + return 0; + return compare_enum_values(new_field->interval); +} + + /** @return returns 1 if the fields are equally defined diff --git a/sql/field.h b/sql/field.h index aa69fea6bdd..81905cc64ae 100644 --- a/sql/field.h +++ b/sql/field.h @@ -1853,6 +1853,8 @@ public: CHARSET_INFO *sort_charset(void) const { return &my_charset_bin; } private: int do_save_field_metadata(uchar *first_byte); + bool compare_enum_values(TYPELIB *values); + uint is_equal(Create_field *new_field); };