mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
- Check ENUM/SET duplicate values taking in account charset/collation.
This commit is contained in:
@ -47,3 +47,16 @@ select hex(a) from t1;
|
|||||||
hex(a)
|
hex(a)
|
||||||
878A
|
878A
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1(c enum(0x9353,0x9373) character set sjis);
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`c` enum('<27>S','<27>s') character set sjis default NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
insert into t1 values (0x9353);
|
||||||
|
insert into t1 values (0x9373);
|
||||||
|
select hex(c) from t1;
|
||||||
|
hex(c)
|
||||||
|
9353
|
||||||
|
9373
|
||||||
|
drop table t1;
|
||||||
|
@ -1678,8 +1678,6 @@ a int(11) YES 1
|
|||||||
b enum('value','<27><><EFBFBD>_value','<27><><EFBFBD>') value
|
b enum('value','<27><><EFBFBD>_value','<27><><EFBFBD>') value
|
||||||
drop table t1;
|
drop table t1;
|
||||||
CREATE TABLE t1 (c enum('a', 'A') BINARY);
|
CREATE TABLE t1 (c enum('a', 'A') BINARY);
|
||||||
Warnings:
|
|
||||||
Note 1291 Column 'c' has duplicated value 'a' in ENUM
|
|
||||||
INSERT INTO t1 VALUES ('a'),('A');
|
INSERT INTO t1 VALUES ('a'),('A');
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
c
|
c
|
||||||
|
@ -41,3 +41,13 @@ create table t1 (a char(10) character set sjis);
|
|||||||
insert into t1 values (0x878A);
|
insert into t1 values (0x878A);
|
||||||
select hex(a) from t1;
|
select hex(a) from t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #6206 ENUMs are not case sensitive even if declared BINARY
|
||||||
|
#
|
||||||
|
create table t1(c enum(0x9353,0x9373) character set sjis);
|
||||||
|
show create table t1;
|
||||||
|
insert into t1 values (0x9353);
|
||||||
|
insert into t1 values (0x9373);
|
||||||
|
select hex(c) from t1;
|
||||||
|
drop table t1;
|
||||||
|
@ -370,19 +370,19 @@ static int sort_keys(KEY *a, KEY *b)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void check_duplicates_in_interval(const char *set_or_name,
|
void check_duplicates_in_interval(const char *set_or_name,
|
||||||
const char *name, TYPELIB *typelib)
|
const char *name, TYPELIB *typelib,
|
||||||
|
CHARSET_INFO *cs)
|
||||||
{
|
{
|
||||||
unsigned int old_count= typelib->count;
|
TYPELIB tmp= *typelib;
|
||||||
const char **old_type_names= typelib->type_names;
|
|
||||||
|
|
||||||
old_count= typelib->count;
|
|
||||||
old_type_names= typelib->type_names;
|
|
||||||
const char **cur_value= typelib->type_names;
|
const char **cur_value= typelib->type_names;
|
||||||
for ( ; typelib->count > 1; cur_value++)
|
unsigned int *cur_length= typelib->type_lengths;
|
||||||
|
|
||||||
|
for ( ; tmp.count > 1; cur_value++, cur_length++)
|
||||||
{
|
{
|
||||||
typelib->type_names++;
|
tmp.type_names++;
|
||||||
typelib->count--;
|
tmp.type_lengths++;
|
||||||
if (find_type((char*)*cur_value,typelib,1))
|
tmp.count--;
|
||||||
|
if (find_type2(&tmp, (const char*)*cur_value, *cur_length, cs))
|
||||||
{
|
{
|
||||||
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_NOTE,
|
push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_NOTE,
|
||||||
ER_DUPLICATED_VALUE_IN_TYPE,
|
ER_DUPLICATED_VALUE_IN_TYPE,
|
||||||
@ -390,8 +390,6 @@ void check_duplicates_in_interval(const char *set_or_name,
|
|||||||
name,*cur_value,set_or_name);
|
name,*cur_value,set_or_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
typelib->count= old_count;
|
|
||||||
typelib->type_names= old_type_names;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -571,7 +569,8 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
sql_field->pack_flag|=FIELDFLAG_BINARY;
|
sql_field->pack_flag|=FIELDFLAG_BINARY;
|
||||||
sql_field->unireg_check=Field::INTERVAL_FIELD;
|
sql_field->unireg_check=Field::INTERVAL_FIELD;
|
||||||
check_duplicates_in_interval("ENUM",sql_field->field_name,
|
check_duplicates_in_interval("ENUM",sql_field->field_name,
|
||||||
sql_field->interval);
|
sql_field->interval,
|
||||||
|
sql_field->charset);
|
||||||
break;
|
break;
|
||||||
case FIELD_TYPE_SET:
|
case FIELD_TYPE_SET:
|
||||||
sql_field->pack_flag=pack_length_to_packflag(sql_field->pack_length) |
|
sql_field->pack_flag=pack_length_to_packflag(sql_field->pack_length) |
|
||||||
@ -580,7 +579,8 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
sql_field->pack_flag|=FIELDFLAG_BINARY;
|
sql_field->pack_flag|=FIELDFLAG_BINARY;
|
||||||
sql_field->unireg_check=Field::BIT_FIELD;
|
sql_field->unireg_check=Field::BIT_FIELD;
|
||||||
check_duplicates_in_interval("SET",sql_field->field_name,
|
check_duplicates_in_interval("SET",sql_field->field_name,
|
||||||
sql_field->interval);
|
sql_field->interval,
|
||||||
|
sql_field->charset);
|
||||||
break;
|
break;
|
||||||
case FIELD_TYPE_DATE: // Rest of string types
|
case FIELD_TYPE_DATE: // Rest of string types
|
||||||
case FIELD_TYPE_NEWDATE:
|
case FIELD_TYPE_NEWDATE:
|
||||||
|
Reference in New Issue
Block a user