diff --git a/mysql-test/r/ctype_sjis.result b/mysql-test/r/ctype_sjis.result index 26a45dd28e8..b0edbed1a41 100644 --- a/mysql-test/r/ctype_sjis.result +++ b/mysql-test/r/ctype_sjis.result @@ -47,3 +47,16 @@ select hex(a) from t1; hex(a) 878A drop table t1; +create table t1(c enum(0x9353,0x9373) character set sjis); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c` enum('“S','“s') character set sjis default NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +insert into t1 values (0x9353); +insert into t1 values (0x9373); +select hex(c) from t1; +hex(c) +9353 +9373 +drop table t1; diff --git a/mysql-test/r/type_enum.result b/mysql-test/r/type_enum.result index 27539953aa9..da85ffe6495 100644 --- a/mysql-test/r/type_enum.result +++ b/mysql-test/r/type_enum.result @@ -1678,8 +1678,6 @@ a int(11) YES 1 b enum('value','öäü_value','ÊÃÕ') value drop table t1; CREATE TABLE t1 (c enum('a', 'A') BINARY); -Warnings: -Note 1291 Column 'c' has duplicated value 'a' in ENUM INSERT INTO t1 VALUES ('a'),('A'); SELECT * FROM t1; c diff --git a/mysql-test/t/ctype_sjis.test b/mysql-test/t/ctype_sjis.test index 68f4f7010e0..c910812ef8a 100644 --- a/mysql-test/t/ctype_sjis.test +++ b/mysql-test/t/ctype_sjis.test @@ -41,3 +41,13 @@ create table t1 (a char(10) character set sjis); insert into t1 values (0x878A); select hex(a) from t1; drop table t1; + +# +# Bug #6206 ENUMs are not case sensitive even if declared BINARY +# +create table t1(c enum(0x9353,0x9373) character set sjis); +show create table t1; +insert into t1 values (0x9353); +insert into t1 values (0x9373); +select hex(c) from t1; +drop table t1; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index d2de24b0d2a..79cec85927e 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -370,19 +370,19 @@ static int sort_keys(KEY *a, KEY *b) */ void check_duplicates_in_interval(const char *set_or_name, - const char *name, TYPELIB *typelib) + const char *name, TYPELIB *typelib, + CHARSET_INFO *cs) { - unsigned int old_count= typelib->count; - const char **old_type_names= typelib->type_names; - - old_count= typelib->count; - old_type_names= typelib->type_names; + TYPELIB tmp= *typelib; const char **cur_value= typelib->type_names; - for ( ; typelib->count > 1; cur_value++) + unsigned int *cur_length= typelib->type_lengths; + + for ( ; tmp.count > 1; cur_value++, cur_length++) { - typelib->type_names++; - typelib->count--; - if (find_type((char*)*cur_value,typelib,1)) + tmp.type_names++; + tmp.type_lengths++; + tmp.count--; + if (find_type2(&tmp, (const char*)*cur_value, *cur_length, cs)) { push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_NOTE, ER_DUPLICATED_VALUE_IN_TYPE, @@ -390,8 +390,6 @@ void check_duplicates_in_interval(const char *set_or_name, name,*cur_value,set_or_name); } } - typelib->count= old_count; - typelib->type_names= old_type_names; } /* @@ -571,7 +569,8 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, sql_field->pack_flag|=FIELDFLAG_BINARY; sql_field->unireg_check=Field::INTERVAL_FIELD; check_duplicates_in_interval("ENUM",sql_field->field_name, - sql_field->interval); + sql_field->interval, + sql_field->charset); break; case FIELD_TYPE_SET: sql_field->pack_flag=pack_length_to_packflag(sql_field->pack_length) | @@ -580,7 +579,8 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, sql_field->pack_flag|=FIELDFLAG_BINARY; sql_field->unireg_check=Field::BIT_FIELD; check_duplicates_in_interval("SET",sql_field->field_name, - sql_field->interval); + sql_field->interval, + sql_field->charset); break; case FIELD_TYPE_DATE: // Rest of string types case FIELD_TYPE_NEWDATE: