Loading mysql-test/r/type_enum.result +8 −0 Original line number Diff line number Diff line Loading @@ -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; mysql-test/t/type_enum.test +14 −1 Original line number Diff line number Diff line Loading @@ -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; sql/sql_table.cc +26 −24 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 Loading Loading
mysql-test/r/type_enum.result +8 −0 Original line number Diff line number Diff line Loading @@ -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;
mysql-test/t/type_enum.test +14 −1 Original line number Diff line number Diff line Loading @@ -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;
sql/sql_table.cc +26 −24 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 Loading