Commit 8a34c4bb authored by unknown's avatar unknown
Browse files

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

into  mysql.com:/home/tnurnberg/24660/41-24660


sql/table.cc:
  Auto merged
parents 43ada21f 4dc7c1aa
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -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
+21 −1
Original line number Diff line number Diff line
@@ -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
+0 −11
Original line number Diff line number Diff line
@@ -393,17 +393,6 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
      {
        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;
    }
+40 −21
Original line number Diff line number Diff line
@@ -657,27 +657,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
      }