Commit 21bec199 authored by cmiller@zippy.(none)'s avatar cmiller@zippy.(none)

Merge zippy.(none):/home/cmiller/work/mysql/mysql-5.0

into  zippy.(none):/home/cmiller/work/mysql/mysql-5.1-new
parents b4586b29 6af3f88f
...@@ -278,3 +278,45 @@ field('str1', null, 'STR1') as c05, ...@@ -278,3 +278,45 @@ field('str1', null, 'STR1') as c05,
c01 c02 c03 c04 c05 c08 c09 c01 c02 c03 c04 c05 c08 c09
str str 0 1 2 1 1 str str 0 1 2 1 1
set names latin1; set names latin1;
create table bug19145a (e enum('a','b','c') default 'b' , s set('x', 'y', 'z') default 'y' ) engine=MyISAM;
create table bug19145b (e enum('a','b','c') default null, s set('x', 'y', 'z') default null) engine=MyISAM;
create table bug19145c (e enum('a','b','c') not null default 'b' , s set('x', 'y', 'z') not null default 'y' ) engine=MyISAM;
create table bug19145setnotnulldefaultnull (e enum('a','b','c') default null, s set('x', 'y', 'z') not null default null) engine=MyISAM;
ERROR 42000: Invalid default value for 's'
create table bug19145enumnotnulldefaultnull (e enum('a','b','c') not null default null, s set('x', 'y', 'z') default null) engine=MyISAM;
ERROR 42000: Invalid default value for 'e'
alter table bug19145a alter column e set default null;
alter table bug19145a alter column s set default null;
alter table bug19145a add column (i int);
alter table bug19145b alter column e set default null;
alter table bug19145b alter column s set default null;
alter table bug19145b add column (i int);
alter table bug19145c alter column e set default null;
ERROR 42000: Invalid default value for 'e'
alter table bug19145c alter column s set default null;
ERROR 42000: Invalid default value for 's'
alter table bug19145c add column (i int);
show create table bug19145a;
Table Create Table
bug19145a CREATE TABLE `bug19145a` (
`e` enum('a','b','c') DEFAULT NULL,
`s` set('x','y','z') DEFAULT NULL,
`i` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
show create table bug19145b;
Table Create Table
bug19145b CREATE TABLE `bug19145b` (
`e` enum('a','b','c') DEFAULT NULL,
`s` set('x','y','z') DEFAULT NULL,
`i` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
show create table bug19145c;
Table Create Table
bug19145c CREATE TABLE `bug19145c` (
`e` enum('a','b','c') NOT NULL DEFAULT 'b',
`s` set('x','y','z') NOT NULL DEFAULT 'y',
`i` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table bug19145a;
drop table bug19145b;
drop table bug19145c;
...@@ -190,4 +190,45 @@ select ...@@ -190,4 +190,45 @@ select
# Restore charset to the default value. # Restore charset to the default value.
set names latin1; set names latin1;
#
# Bug#19145: mysqld crashes if you set the default value of an enum field to NULL
#
create table bug19145a (e enum('a','b','c') default 'b' , s set('x', 'y', 'z') default 'y' ) engine=MyISAM;
create table bug19145b (e enum('a','b','c') default null, s set('x', 'y', 'z') default null) engine=MyISAM;
create table bug19145c (e enum('a','b','c') not null default 'b' , s set('x', 'y', 'z') not null default 'y' ) engine=MyISAM;
# Invalid default value for 's'
--error 1067
create table bug19145setnotnulldefaultnull (e enum('a','b','c') default null, s set('x', 'y', 'z') not null default null) engine=MyISAM;
# Invalid default value for 'e'
--error 1067
create table bug19145enumnotnulldefaultnull (e enum('a','b','c') not null default null, s set('x', 'y', 'z') default null) engine=MyISAM;
alter table bug19145a alter column e set default null;
alter table bug19145a alter column s set default null;
alter table bug19145a add column (i int);
alter table bug19145b alter column e set default null;
alter table bug19145b alter column s set default null;
alter table bug19145b add column (i int);
# Invalid default value for 'e'
--error 1067
alter table bug19145c alter column e set default null;
# Invalid default value for 's'
--error 1067
alter table bug19145c alter column s set default null;
alter table bug19145c add column (i int);
show create table bug19145a;
show create table bug19145b;
show create table bug19145c;
drop table bug19145a;
drop table bug19145b;
drop table bug19145c;
# End of 4.1 tests # End of 4.1 tests
...@@ -2184,7 +2184,7 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -2184,7 +2184,7 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
if (need_to_change_arena) if (need_to_change_arena)
thd->restore_active_arena(thd->stmt_arena, &backup_arena); thd->restore_active_arena(thd->stmt_arena, &backup_arena);
if (! sql_field->def) if (sql_field->def == NULL)
{ {
/* Could not convert */ /* Could not convert */
my_error(ER_INVALID_DEFAULT, MYF(0), sql_field->field_name); my_error(ER_INVALID_DEFAULT, MYF(0), sql_field->field_name);
...@@ -2195,15 +2195,30 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -2195,15 +2195,30 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
if (sql_field->sql_type == FIELD_TYPE_SET) if (sql_field->sql_type == FIELD_TYPE_SET)
{ {
uint32 field_length; uint32 field_length;
if (sql_field->def) if (sql_field->def != NULL)
{ {
char *not_used; char *not_used;
uint not_used2; uint not_used2;
bool not_found= 0; bool not_found= 0;
String str, *def= sql_field->def->val_str(&str); String str, *def= sql_field->def->val_str(&str);
def->length(cs->cset->lengthsp(cs, def->ptr(), def->length())); if (def == NULL) /* SQL "NULL" maps to NULL */
(void) find_set(interval, def->ptr(), def->length(), {
cs, &not_used, &not_used2, &not_found); if ((sql_field->flags & NOT_NULL_FLAG) != 0)
{
my_error(ER_INVALID_DEFAULT, MYF(0), sql_field->field_name);
DBUG_RETURN(-1);
}
/* else, NULL is an allowed value */
(void) find_set(interval, NULL, 0,
cs, &not_used, &not_used2, &not_found);
}
else /* not NULL */
{
(void) find_set(interval, def->ptr(), def->length(),
cs, &not_used, &not_used2, &not_found);
}
if (not_found) if (not_found)
{ {
my_error(ER_INVALID_DEFAULT, MYF(0), sql_field->field_name); my_error(ER_INVALID_DEFAULT, MYF(0), sql_field->field_name);
...@@ -2216,14 +2231,28 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info, ...@@ -2216,14 +2231,28 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
else /* FIELD_TYPE_ENUM */ else /* FIELD_TYPE_ENUM */
{ {
uint32 field_length; uint32 field_length;
if (sql_field->def) DBUG_ASSERT(sql_field->sql_type == FIELD_TYPE_ENUM);
if (sql_field->def != NULL)
{ {
String str, *def= sql_field->def->val_str(&str); String str, *def= sql_field->def->val_str(&str);
def->length(cs->cset->lengthsp(cs, def->ptr(), def->length())); if (def == NULL) /* SQL "NULL" maps to NULL */
if (!find_type2(interval, def->ptr(), def->length(), cs))
{ {
my_error(ER_INVALID_DEFAULT, MYF(0), sql_field->field_name); if ((sql_field->flags & NOT_NULL_FLAG) != 0)
DBUG_RETURN(-1); {
my_error(ER_INVALID_DEFAULT, MYF(0), sql_field->field_name);
DBUG_RETURN(-1);
}
/* else, the defaults yield the correct length for NULLs. */
}
else /* not NULL */
{
def->length(cs->cset->lengthsp(cs, def->ptr(), def->length()));
if (find_type2(interval, def->ptr(), def->length(), cs) == 0) /* not found */
{
my_error(ER_INVALID_DEFAULT, MYF(0), sql_field->field_name);
DBUG_RETURN(-1);
}
} }
} }
calculate_interval_lengths(cs, interval, &field_length, &dummy); calculate_interval_lengths(cs, interval, &field_length, &dummy);
......
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