diff options
author | unknown <mikael@c-4908e253.1238-1-64736c10.cust.bredbandsbolaget.se> | 2006-04-10 13:48:58 -0400 |
---|---|---|
committer | unknown <mikael@c-4908e253.1238-1-64736c10.cust.bredbandsbolaget.se> | 2006-04-10 13:48:58 -0400 |
commit | 42d7e8c08770dc87c20a61d7dc0f49649ef28704 (patch) | |
tree | 2ebeada669ea1a82c5fcb8c90497f7bf13acc11d /sql | |
parent | a514095a5d306fead8d22d03a39c83db18d98ef8 (diff) | |
download | mariadb-git-42d7e8c08770dc87c20a61d7dc0f49649ef28704.tar.gz |
BUG#18750: Various problems with partition names, quotation marks
mysql-test/r/partition.result:
Added new test cases
mysql-test/t/partition.test:
Added new test cases
sql/partition_info.cc:
Check partition names that they don't have trailing spaces
sql/share/errmsg.txt:
Added error code for wrong partition names
sql/sql_partition.cc:
New method to add partition name strings, ignore OPTION_SHOW_QUOTE_CREATE
sql/sql_show.cc:
require_quotes had a bug with identifiers that consisted of only digits,
these are allowed identifiers but must be quoted and require_quote didn't
tell this.
sql/sql_yacc.yy:
Partition names should identifers and not ident_or_text
Diffstat (limited to 'sql')
-rw-r--r-- | sql/partition_info.cc | 12 | ||||
-rw-r--r-- | sql/share/errmsg.txt | 3 | ||||
-rw-r--r-- | sql/sql_partition.cc | 19 | ||||
-rw-r--r-- | sql/sql_show.cc | 5 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 2 |
5 files changed, 38 insertions, 3 deletions
diff --git a/sql/partition_info.cc b/sql/partition_info.cc index ad0aa053ae2..e2bf37d6ef3 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -696,6 +696,12 @@ bool partition_info::check_partition_info(handlerton **eng_type, partition_element *part_elem= part_it++; if (!is_sub_partitioned()) { + if (check_table_name(part_elem->partition_name, + strlen(part_elem->partition_name))) + { + my_error(ER_WRONG_PARTITION_NAME, MYF(0)); + goto end; + } if (part_elem->engine_type == NULL) part_elem->engine_type= default_engine_type; DBUG_PRINT("info", ("engine = %d", @@ -709,6 +715,12 @@ bool partition_info::check_partition_info(handlerton **eng_type, do { part_elem= sub_it++; + if (check_table_name(part_elem->partition_name, + strlen(part_elem->partition_name))) + { + my_error(ER_WRONG_PARTITION_NAME, MYF(0)); + goto end; + } if (part_elem->engine_type == NULL) part_elem->engine_type= default_engine_type; DBUG_PRINT("info", ("engine = %u", diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt index e8766b3d882..0d3ba97f8e9 100644 --- a/sql/share/errmsg.txt +++ b/sql/share/errmsg.txt @@ -5826,3 +5826,6 @@ ER_NDB_CANT_SWITCH_BINLOG_FORMAT eng "The NDB cluster engine does not support changing the binlog format on the fly yet" ER_PARTITION_NO_TEMPORARY eng "Cannot create temporary table with partitions" +ER_WRONG_PARTITION_NAME + eng "Incorrect partition name" + swe "Felaktigt partitionsnamn" diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 5cae38f2773..aae80f07b71 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -1614,6 +1614,21 @@ static int add_key_partition(File fptr, List<char> field_list) return err; } +static int add_name_string(File fptr, const char *name) +{ + int err; + String name_string("", 0, system_charset_info); + THD *thd= current_thd; + ulonglong save_options= thd->options; + + thd->options= 0; + append_identifier(thd, &name_string, name, + strlen(name)); + thd->options= save_options; + err= add_string_object(fptr, &name_string); + return err; +} + static int add_int(File fptr, longlong number) { llstr(number, buff); @@ -1912,7 +1927,7 @@ char *generate_partition_syntax(partition_info *part_info, part_info->part_state_len= part_state_id+1; } err+= add_partition(fptr); - err+= add_string(fptr, part_elem->partition_name); + err+= add_name_string(fptr, part_elem->partition_name); err+= add_space(fptr); err+= add_partition_values(fptr, part_info, part_elem); if (!part_info->is_sub_partitioned()) @@ -1928,7 +1943,7 @@ char *generate_partition_syntax(partition_info *part_info, { part_elem= sub_it++; err+= add_subpartition(fptr); - err+= add_string(fptr, part_elem->partition_name); + err+= add_name_string(fptr, part_elem->partition_name); err+= add_space(fptr); err+= add_partition_options(fptr, part_elem); if (j != (no_subparts-1)) diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 19535f3182a..95433828a1e 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -753,6 +753,7 @@ mysqld_dump_create_info(THD *thd, TABLE_LIST *table_list, int fd) static const char *require_quotes(const char *name, uint name_length) { uint length; + bool pure_digit= TRUE; const char *end= name + name_length; for (; name < end ; name++) @@ -761,7 +762,11 @@ static const char *require_quotes(const char *name, uint name_length) length= my_mbcharlen(system_charset_info, chr); if (length == 1 && !system_charset_info->ident_map[chr]) return name; + if (length == 1 && (chr < '0' || chr > '9')) + pure_digit= FALSE; } + if (pure_digit) + return name; return 0; } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index e48748bcfa5..f570cbcd782 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -3639,7 +3639,7 @@ part_definition: ; part_name: - ident_or_text + ident { LEX *lex= Lex; partition_info *part_info= lex->part_info; |