Commit a41b81e3 authored by unknown's avatar unknown
Browse files

Merge sgluhov@bk-internal.mysql.com:/home/bk/mysql-5.0-opt

into  mysql.com:/home/gluh/MySQL/Bugs/5.0.27069


sql/sql_table.cc:
  Auto merged
parents d2667d1a 5ded16c5
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -1386,4 +1386,9 @@ ERROR 01000: Data truncated for column 'a' at row 1
insert into t1 values ('2E3x');
ERROR 01000: Data truncated for column 'a' at row 1
drop table t1;
set sql_mode='traditional';
create table t1 (f1 set('a','a'));
ERROR HY000: Column 'f1' has duplicated value 'a' in SET
create table t1 (f1 enum('a','a'));
ERROR HY000: Column 'f1' has duplicated value 'a' in ENUM
End of 5.0 tests
+9 −0
Original line number Diff line number Diff line
@@ -1249,4 +1249,13 @@ insert into t1 values ('2000a');
insert into t1 values ('2E3x');
drop table t1;

#
# Bug#27069 set with identical elements are created
#
set sql_mode='traditional';
--error 1291
create table t1 (f1 set('a','a'));
--error 1291
create table t1 (f1 enum('a','a'));

--echo End of 5.0 tests
+19 −8
Original line number Diff line number Diff line
@@ -414,10 +414,11 @@ static int sort_keys(KEY *a, KEY *b)
    which has some duplicates on its right

  RETURN VALUES
    void
    0             ok
    1             Error
*/

void check_duplicates_in_interval(const char *set_or_name,
bool check_duplicates_in_interval(const char *set_or_name,
                                  const char *name, TYPELIB *typelib,
                                  CHARSET_INFO *cs, unsigned int *dup_val_count)
{
@@ -433,6 +434,13 @@ void check_duplicates_in_interval(const char *set_or_name,
    tmp.count--;
    if (find_type2(&tmp, (const char*)*cur_value, *cur_length, cs))
    {
      if ((current_thd->variables.sql_mode &
         (MODE_STRICT_TRANS_TABLES | MODE_STRICT_ALL_TABLES)))
      {
        my_error(ER_DUPLICATED_VALUE_IN_TYPE, MYF(0),
                 name,*cur_value,set_or_name);
        return 1;
      }
      push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_NOTE,
			  ER_DUPLICATED_VALUE_IN_TYPE,
			  ER(ER_DUPLICATED_VALUE_IN_TYPE),
@@ -440,6 +448,7 @@ void check_duplicates_in_interval(const char *set_or_name,
      (*dup_val_count)++;
    }
  }
  return 0;
}


@@ -575,9 +584,10 @@ int prepare_create_field(create_field *sql_field,
    if (sql_field->charset->state & MY_CS_BINSORT)
      sql_field->pack_flag|=FIELDFLAG_BINARY;
    sql_field->unireg_check=Field::INTERVAL_FIELD;
    check_duplicates_in_interval("ENUM",sql_field->field_name,
    if (check_duplicates_in_interval("ENUM",sql_field->field_name,
                                     sql_field->interval,
                                 sql_field->charset, &dup_val_count);
                                     sql_field->charset, &dup_val_count))
      DBUG_RETURN(1);
    break;
  case FIELD_TYPE_SET:
    sql_field->pack_flag=pack_length_to_packflag(sql_field->pack_length) |
@@ -585,9 +595,10 @@ int prepare_create_field(create_field *sql_field,
    if (sql_field->charset->state & MY_CS_BINSORT)
      sql_field->pack_flag|=FIELDFLAG_BINARY;
    sql_field->unireg_check=Field::BIT_FIELD;
    check_duplicates_in_interval("SET",sql_field->field_name,
    if (check_duplicates_in_interval("SET",sql_field->field_name,
                                     sql_field->interval,
                                 sql_field->charset, &dup_val_count);
                                     sql_field->charset, &dup_val_count))
      DBUG_RETURN(1);
    /* Check that count of unique members is not more then 64 */
    if (sql_field->interval->count -  dup_val_count > sizeof(longlong)*8)
    {