summaryrefslogtreecommitdiff
path: root/sql/sql_table.cc
diff options
context:
space:
mode:
authorunknown <vva@eagle.mysql.r18.ru>2004-03-13 23:13:31 +0400
committerunknown <vva@eagle.mysql.r18.ru>2004-03-13 23:13:31 +0400
commit5a67c11c1890edd331df70c33df45f791d8aa92a (patch)
treee13473a9ff7e860a9284023ca3cd4d3aaf7c632c /sql/sql_table.cc
parent8b11f1c10620b40c9fa654f3738daeab4369f8b6 (diff)
downloadmariadb-git-5a67c11c1890edd331df70c33df45f791d8aa92a.tar.gz
fixed bug #1427 "enum allows duplicate values in the list"
include/mysqld_error.h: added ER_DUPLICATED_VALUE_IN_TYPE mysql-test/r/create.result: added test for bug #1427 "enum allows duplicate values in the list" mysql-test/t/create.test: added test for bug #1427 "enum allows duplicate values in the list" sql/share/czech/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/danish/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/dutch/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/english/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/estonian/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/french/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/german/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/greek/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/hungarian/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/italian/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/japanese/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/korean/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/norwegian-ny/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/norwegian/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/polish/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/portuguese/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/romanian/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/russian/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/serbian/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/slovak/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/spanish/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/swedish/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/share/ukrainian/errmsg.txt: added message for ER_DUPLICATED_VALUE_IN_TYPE sql/sql_table.cc: added function check_duplicates_in_interval and calling it from mysql_create_table for enum and set
Diffstat (limited to 'sql/sql_table.cc')
-rw-r--r--sql/sql_table.cc48
1 files changed, 48 insertions, 0 deletions
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index ee11b7b9da0..e22d8f022da 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -342,6 +342,50 @@ static int sort_keys(KEY *a, KEY *b)
0);
}
+/*
+ Check TYPELIB (set or enum) for duplicates
+
+ SYNOPSIS
+ check_duplicates_in_interval()
+ set_or_name "SET" or "ENUM" string for warning message
+ name name of the checked column
+ typelib list of values for the column
+
+ DESCRIPTION
+ This function prints an warning for each value in list
+ which has some duplicates on its right
+
+ RETURN VALUES
+ void
+*/
+
+void check_duplicates_in_interval(const char *set_or_name,
+ const char *name, TYPELIB *typelib)
+{
+ unsigned int old_count= typelib->count;
+ const char **old_type_names= typelib->type_names;
+
+ if (typelib->count <= 1)
+ return;
+
+ old_count= typelib->count;
+ old_type_names= typelib->type_names;
+ const char **cur_value= typelib->type_names;
+ for ( ; typelib->count > 1; cur_value++)
+ {
+ typelib->type_names++;
+ typelib->count--;
+ if (find_type((char*)*cur_value,typelib,1))
+ {
+ push_warning_printf(current_thd,MYSQL_ERROR::WARN_LEVEL_ERROR,
+ ER_DUPLICATED_VALUE_IN_TYPE,
+ ER(ER_DUPLICATED_VALUE_IN_TYPE),
+ name,*cur_value,set_or_name);
+ }
+ }
+ typelib->count= old_count;
+ typelib->type_names= old_type_names;
+}
/*
Create a table
@@ -546,6 +590,8 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
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,
+ sql_field->interval);
break;
case FIELD_TYPE_SET:
sql_field->pack_flag=pack_length_to_packflag(sql_field->pack_length) |
@@ -553,6 +599,8 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
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,
+ sql_field->interval);
break;
case FIELD_TYPE_DATE: // Rest of string types
case FIELD_TYPE_NEWDATE: