Merge tnurnberg@bk-internal.mysql.com:/home/bk/mysql-4.1-maint

into  mysql.com:/home/tnurnberg/24660/41-24660
parents 4579445b db7ac2c0
...@@ -1754,3 +1754,28 @@ t1 CREATE TABLE `t1` ( ...@@ -1754,3 +1754,28 @@ t1 CREATE TABLE `t1` (
`f2` enum('') default NULL `f2` enum('') default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; 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
......
...@@ -136,4 +136,24 @@ alter table t1 add f2 enum(0xFFFF); ...@@ -136,4 +136,24 @@ alter table t1 add f2 enum(0xFFFF);
show create table t1; show create table t1;
drop 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
......
...@@ -393,17 +393,6 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, ...@@ -393,17 +393,6 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
{ {
char *val= (char*) interval->type_names[count]; char *val= (char*) interval->type_names[count];
interval->type_lengths[count]= strlen(val); 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; interval->type_lengths[count]= 0;
} }
......
...@@ -657,27 +657,46 @@ static bool pack_fields(File file, List<create_field> &create_fields, ...@@ -657,27 +657,46 @@ static bool pack_fields(File file, List<create_field> &create_fields,
{ {
if (field->interval_id > int_count) if (field->interval_id > int_count)
{ {
int_count=field->interval_id; unsigned char sep= 0;
tmp.append(NAMES_SEP_CHAR); unsigned char occ[256];
for (const char **pos=field->interval->type_names ; *pos ; pos++) 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; for (uint i=1; i<256; i++)
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++)
{ {
char c= val[cnt]; if(!occ[i])
if (c == NAMES_SEP_CHAR) {
val[cnt]= ','; 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(*pos);
tmp.append(NAMES_SEP_CHAR); tmp.append(sep);
} }
tmp.append('\0'); // End of intervall tmp.append('\0'); // End of intervall
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment