summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <mikael@c-4908e253.1238-1-64736c10.cust.bredbandsbolaget.se>2006-04-10 13:48:58 -0400
committerunknown <mikael@c-4908e253.1238-1-64736c10.cust.bredbandsbolaget.se>2006-04-10 13:48:58 -0400
commit42d7e8c08770dc87c20a61d7dc0f49649ef28704 (patch)
tree2ebeada669ea1a82c5fcb8c90497f7bf13acc11d /sql
parenta514095a5d306fead8d22d03a39c83db18d98ef8 (diff)
downloadmariadb-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.cc12
-rw-r--r--sql/share/errmsg.txt3
-rw-r--r--sql/sql_partition.cc19
-rw-r--r--sql/sql_show.cc5
-rw-r--r--sql/sql_yacc.yy2
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;