Commit a223550f authored by unknown's avatar unknown
Browse files

Merge zippy.(none):/home/cmiller/work/mysql/merge/tmp_merge

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


mysql-test/r/null.result:
  Auto merged
mysql-test/t/null.test:
  Auto merged
sql/sql_table.cc:
  Merge.
parents 53a4e3ee dd68976a
Loading
Loading
Loading
Loading
+42 −0
Original line number Diff line number Diff line
@@ -278,3 +278,45 @@ field('str1', null, 'STR1') as c05,
c01	c02	c03	c04	c05	c08	c09
str	str	0	1	2	1	1
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;
+41 −0
Original line number Diff line number Diff line
@@ -190,4 +190,45 @@ select
# Restore charset to the default value.
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
+39 −10
Original line number Diff line number Diff line
@@ -799,7 +799,7 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
        if (need_to_change_arena)
          thd->restore_active_arena(thd->stmt_arena, &backup_arena);

        if (! sql_field->def)
        if (sql_field->def == NULL)
        {
          /* Could not convert */
          my_error(ER_INVALID_DEFAULT, MYF(0), sql_field->field_name);
@@ -810,15 +810,30 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
      if (sql_field->sql_type == FIELD_TYPE_SET)
      {
        uint32 field_length;
        if (sql_field->def)
        if (sql_field->def != NULL)
        {
          char *not_used;
          uint not_used2;
          bool not_found= 0;
          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 ((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)
          {
            my_error(ER_INVALID_DEFAULT, MYF(0), sql_field->field_name);
@@ -831,16 +846,30 @@ static int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
      else  /* FIELD_TYPE_ENUM */
      {
        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);
          if (def == NULL) /* SQL "NULL" maps to NULL */
          {
            if ((sql_field->flags & NOT_NULL_FLAG) != 0)
            {
              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))
            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);
        sql_field->length= field_length;
      }