Commit 9f48eedb authored by unknown's avatar unknown
Browse files

Fix for bug #6840: Default value is not checked in ALTER column SET DEFAULT 'x'

parent 0d8d061f
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -1737,3 +1737,11 @@ def test t1 t1 c c 254 3 0 Y 384 0 8
a	b	c
Y	NULL	NULL
drop table t1;
create table t1 (a enum('x','y') default 'x');
alter table t1 alter a set default 'z';
ERROR 42000: Invalid default value for 'a'
drop table t1;
create table t1 (a set('x','y') default 'x');
alter table t1 alter a set default 'z';
ERROR 42000: Invalid default value for 'a'
drop table t1;
+14 −1
Original line number Diff line number Diff line
@@ -111,5 +111,18 @@ alter table t1 add b set ('Y','N') CHARACTER SET utf8 COLLATE utf8_bin;
alter table t1 add c enum ('Y','N') CHARACTER SET utf8 COLLATE utf8_bin;
--enable_metadata
select * from t1;
--disable metadata
--disable_metadata
drop table t1;

#
# Bug #6840  Default value is not checked in ALTER column SET DEFAULT 'x'
#
create table t1 (a enum('x','y') default 'x');
--error 1067
alter table t1 alter a set default 'z';
drop table t1;

create table t1 (a set('x','y') default 'x');
--error 1067
alter table t1 alter a set default 'z';
drop table t1;
+26 −24
Original line number Diff line number Diff line
@@ -485,25 +485,27 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
      DBUG_RETURN(-1);
    }

    if ((sql_field->sql_type == FIELD_TYPE_SET ||
         sql_field->sql_type == FIELD_TYPE_ENUM) && !sql_field->interval)
    if (sql_field->sql_type == FIELD_TYPE_SET ||
        sql_field->sql_type == FIELD_TYPE_ENUM)
    {
      uint32 dummy;
      CHARSET_INFO *cs= sql_field->charset;
      TYPELIB *interval;
      TYPELIB *interval= sql_field->interval;

      /*
        Create typelib from interval_list, and if necessary
        convert strings from client character set to the
        column character set.
      */

      if (!interval)
      {
        interval= sql_field->interval= typelib(sql_field->interval_list);
        List_iterator<String> it(sql_field->interval_list);
        String conv, *tmp;
        for (uint i= 0; (tmp= it++); i++)
        {
        if (String::needs_conversion(tmp->length(), tmp->charset(), cs, &dummy))
          if (String::needs_conversion(tmp->length(), tmp->charset(),
                                       cs, &dummy))
          {
            uint cnv_errs;
            conv.copy(tmp->ptr(), tmp->length(), tmp->charset(), cs, &cnv_errs);
@@ -521,7 +523,7 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
          ((uchar *)interval->type_names[i])[lengthsp]= '\0';
        }
        sql_field->interval_list.empty(); // Don't need interval_list anymore

      }

      /*
        Convert the default value from client character