Loading mysql-test/r/type_enum.result +25 −0 Original line number Diff line number Diff line Loading @@ -1754,3 +1754,28 @@ t1 CREATE TABLE `t1` ( `f2` enum('') default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; create table t1(russian enum('E','F','EF','FE') NOT NULL DEFAULT'E'); show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `russian` enum('E','F','EF','FE') NOT NULL default 'E' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; create table t1(denormal enum('E','F','E,F','F,E') NOT NULL DEFAULT'E'); show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `denormal` enum('E','F','E,F','F,E') NOT NULL default 'E' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; create table t1(russian_deviant enum('E','F','EF','F,E') NOT NULL DEFAULT'E'); show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `russian_deviant` enum('E','F','EF','F,E') NOT NULL default 'E' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; create table t1(exhausting_charset enum('ABCDEFGHIJKLMNOPQRSTUVWXYZ',' !"','#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~','xx\','yy\','zz')); ERROR 42000: Field separator argument is not what is expected; check the manual End of 4.1 tests Loading mysql-test/t/type_enum.test +21 −1 Original line number Diff line number Diff line Loading @@ -136,4 +136,24 @@ alter table t1 add f2 enum(0xFFFF); show create table t1; drop table t1; # End of 4.1 tests # # Bug#24660 "enum" field type definition problem # create table t1(russian enum('E','F','EF','FE') NOT NULL DEFAULT'E'); show create table t1; drop table t1; create table t1(denormal enum('E','F','E,F','F,E') NOT NULL DEFAULT'E'); show create table t1; drop table t1; create table t1(russian_deviant enum('E','F','EF','F,E') NOT NULL DEFAULT'E'); show create table t1; drop table t1; # ER_WRONG_FIELD_TERMINATORS --error 1083 create table t1(exhausting_charset enum('ABCDEFGHIJKLMNOPQRSTUVWXYZ',' !"','#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~','xx\','yy\','zz')); --echo End of 4.1 tests Loading sql/table.cc +0 −11 Original line number Diff line number Diff line Loading @@ -472,17 +472,6 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat, { char *val= (char*) interval->type_names[count]; interval->type_lengths[count]= strlen(val); /* Replace all ',' symbols with NAMES_SEP_CHAR. See the comment in unireg.cc, pack_fields() function for details. */ for (uint cnt= 0 ; cnt < interval->type_lengths[count] ; cnt++) { char c= val[cnt]; if (c == ',') val[cnt]= NAMES_SEP_CHAR; } } interval->type_lengths[count]= 0; } Loading sql/unireg.cc +40 −21 Original line number Diff line number Diff line Loading @@ -713,27 +713,46 @@ static bool pack_fields(File file, List<create_field> &create_fields, { if (field->interval_id > int_count) { int_count=field->interval_id; tmp.append(NAMES_SEP_CHAR); for (const char **pos=field->interval->type_names ; *pos ; pos++) unsigned char sep= 0; unsigned char occ[256]; uint i; unsigned char *val= NULL; bzero(occ, sizeof(occ)); for (i=0; (val= (unsigned char*) field->interval->type_names[i]); i++) for (uint j = 0; j < field->interval->type_lengths[i]; j++) occ[(unsigned int) (val[j])]= 1; if (!occ[(unsigned char)NAMES_SEP_CHAR]) sep= (unsigned char) NAMES_SEP_CHAR; else if (!occ[(unsigned int)',']) sep= ','; else { char *val= (char*) *pos; uint str_len= strlen(val); /* Note, hack: in old frm NAMES_SEP_CHAR is used to separate names in the interval (ENUM/SET). To allow names to contain NAMES_SEP_CHAR, we replace it with a comma before writing frm. Backward conversion is done during frm file opening, See table.cc, openfrm() function */ for (uint cnt= 0 ; cnt < str_len ; cnt++) for (uint i=1; i<256; i++) { char c= val[cnt]; if (c == NAMES_SEP_CHAR) val[cnt]= ','; if(!occ[i]) { sep= i; break; } } if(!sep) /* disaster, enum uses all characters, none left as separator */ { my_message(ER_WRONG_FIELD_TERMINATORS,ER(ER_WRONG_FIELD_TERMINATORS), MYF(0)); DBUG_RETURN(1); } } int_count= field->interval_id; tmp.append(sep); for (const char **pos=field->interval->type_names ; *pos ; pos++) { tmp.append(*pos); tmp.append(NAMES_SEP_CHAR); tmp.append(sep); } tmp.append('\0'); // End of intervall } Loading Loading
mysql-test/r/type_enum.result +25 −0 Original line number Diff line number Diff line Loading @@ -1754,3 +1754,28 @@ t1 CREATE TABLE `t1` ( `f2` enum('') default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; create table t1(russian enum('E','F','EF','FE') NOT NULL DEFAULT'E'); show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `russian` enum('E','F','EF','FE') NOT NULL default 'E' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; create table t1(denormal enum('E','F','E,F','F,E') NOT NULL DEFAULT'E'); show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `denormal` enum('E','F','E,F','F,E') NOT NULL default 'E' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; create table t1(russian_deviant enum('E','F','EF','F,E') NOT NULL DEFAULT'E'); show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `russian_deviant` enum('E','F','EF','F,E') NOT NULL default 'E' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; create table t1(exhausting_charset enum('ABCDEFGHIJKLMNOPQRSTUVWXYZ',' !"','#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~','xx\','yy\','zz')); ERROR 42000: Field separator argument is not what is expected; check the manual End of 4.1 tests Loading
mysql-test/t/type_enum.test +21 −1 Original line number Diff line number Diff line Loading @@ -136,4 +136,24 @@ alter table t1 add f2 enum(0xFFFF); show create table t1; drop table t1; # End of 4.1 tests # # Bug#24660 "enum" field type definition problem # create table t1(russian enum('E','F','EF','FE') NOT NULL DEFAULT'E'); show create table t1; drop table t1; create table t1(denormal enum('E','F','E,F','F,E') NOT NULL DEFAULT'E'); show create table t1; drop table t1; create table t1(russian_deviant enum('E','F','EF','F,E') NOT NULL DEFAULT'E'); show create table t1; drop table t1; # ER_WRONG_FIELD_TERMINATORS --error 1083 create table t1(exhausting_charset enum('ABCDEFGHIJKLMNOPQRSTUVWXYZ',' !"','#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~','xx\','yy\','zz')); --echo End of 4.1 tests Loading
sql/table.cc +0 −11 Original line number Diff line number Diff line Loading @@ -472,17 +472,6 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat, { char *val= (char*) interval->type_names[count]; interval->type_lengths[count]= strlen(val); /* Replace all ',' symbols with NAMES_SEP_CHAR. See the comment in unireg.cc, pack_fields() function for details. */ for (uint cnt= 0 ; cnt < interval->type_lengths[count] ; cnt++) { char c= val[cnt]; if (c == ',') val[cnt]= NAMES_SEP_CHAR; } } interval->type_lengths[count]= 0; } Loading
sql/unireg.cc +40 −21 Original line number Diff line number Diff line Loading @@ -713,27 +713,46 @@ static bool pack_fields(File file, List<create_field> &create_fields, { if (field->interval_id > int_count) { int_count=field->interval_id; tmp.append(NAMES_SEP_CHAR); for (const char **pos=field->interval->type_names ; *pos ; pos++) unsigned char sep= 0; unsigned char occ[256]; uint i; unsigned char *val= NULL; bzero(occ, sizeof(occ)); for (i=0; (val= (unsigned char*) field->interval->type_names[i]); i++) for (uint j = 0; j < field->interval->type_lengths[i]; j++) occ[(unsigned int) (val[j])]= 1; if (!occ[(unsigned char)NAMES_SEP_CHAR]) sep= (unsigned char) NAMES_SEP_CHAR; else if (!occ[(unsigned int)',']) sep= ','; else { char *val= (char*) *pos; uint str_len= strlen(val); /* Note, hack: in old frm NAMES_SEP_CHAR is used to separate names in the interval (ENUM/SET). To allow names to contain NAMES_SEP_CHAR, we replace it with a comma before writing frm. Backward conversion is done during frm file opening, See table.cc, openfrm() function */ for (uint cnt= 0 ; cnt < str_len ; cnt++) for (uint i=1; i<256; i++) { char c= val[cnt]; if (c == NAMES_SEP_CHAR) val[cnt]= ','; if(!occ[i]) { sep= i; break; } } if(!sep) /* disaster, enum uses all characters, none left as separator */ { my_message(ER_WRONG_FIELD_TERMINATORS,ER(ER_WRONG_FIELD_TERMINATORS), MYF(0)); DBUG_RETURN(1); } } int_count= field->interval_id; tmp.append(sep); for (const char **pos=field->interval->type_names ; *pos ; pos++) { tmp.append(*pos); tmp.append(NAMES_SEP_CHAR); tmp.append(sep); } tmp.append('\0'); // End of intervall } Loading