Commit 42d7e8c0 authored by unknown's avatar unknown

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
parent a514095a
...@@ -839,4 +839,21 @@ SHOW TABLE STATUS; ...@@ -839,4 +839,21 @@ SHOW TABLE STATUS;
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
t1 MyISAM 10 Dynamic 0 0 0 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL partitioned t1 MyISAM 10 Dynamic 0 0 0 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL partitioned
DROP TABLE t1; DROP TABLE t1;
create table t1 (a int)
partition by list (a)
(partition `s1 s2` values in (0));
drop table t1;
create table t1 (a int)
partition by list (a)
(partition `7` values in (0));
drop table t1;
create table t1 (a int)
partition by list (a)
(partition `s1 s2 ` values in (0));
ERROR HY000: Incorrect partition name
create table t1 (a int)
partition by list (a)
subpartition by hash (a)
(partition p1 values in (0) (subpartition `p1 p2 `));
ERROR HY000: Incorrect partition name
End of 5.1 tests End of 5.1 tests
...@@ -956,4 +956,28 @@ PARTITION p2 VALUES LESS THAN (30) ENGINE = MyISAM); ...@@ -956,4 +956,28 @@ PARTITION p2 VALUES LESS THAN (30) ENGINE = MyISAM);
SHOW TABLE STATUS; SHOW TABLE STATUS;
DROP TABLE t1; DROP TABLE t1;
#
#BUG 18750 Problems with partition names
#
create table t1 (a int)
partition by list (a)
(partition `s1 s2` values in (0));
drop table t1;
create table t1 (a int)
partition by list (a)
(partition `7` values in (0));
drop table t1;
--error ER_WRONG_PARTITION_NAME
create table t1 (a int)
partition by list (a)
(partition `s1 s2 ` values in (0));
--error ER_WRONG_PARTITION_NAME
create table t1 (a int)
partition by list (a)
subpartition by hash (a)
(partition p1 values in (0) (subpartition `p1 p2 `));
--echo End of 5.1 tests --echo End of 5.1 tests
...@@ -696,6 +696,12 @@ bool partition_info::check_partition_info(handlerton **eng_type, ...@@ -696,6 +696,12 @@ bool partition_info::check_partition_info(handlerton **eng_type,
partition_element *part_elem= part_it++; partition_element *part_elem= part_it++;
if (!is_sub_partitioned()) 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) if (part_elem->engine_type == NULL)
part_elem->engine_type= default_engine_type; part_elem->engine_type= default_engine_type;
DBUG_PRINT("info", ("engine = %d", DBUG_PRINT("info", ("engine = %d",
...@@ -709,6 +715,12 @@ bool partition_info::check_partition_info(handlerton **eng_type, ...@@ -709,6 +715,12 @@ bool partition_info::check_partition_info(handlerton **eng_type,
do do
{ {
part_elem= sub_it++; 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) if (part_elem->engine_type == NULL)
part_elem->engine_type= default_engine_type; part_elem->engine_type= default_engine_type;
DBUG_PRINT("info", ("engine = %u", DBUG_PRINT("info", ("engine = %u",
......
...@@ -5826,3 +5826,6 @@ ER_NDB_CANT_SWITCH_BINLOG_FORMAT ...@@ -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" eng "The NDB cluster engine does not support changing the binlog format on the fly yet"
ER_PARTITION_NO_TEMPORARY ER_PARTITION_NO_TEMPORARY
eng "Cannot create temporary table with partitions" eng "Cannot create temporary table with partitions"
ER_WRONG_PARTITION_NAME
eng "Incorrect partition name"
swe "Felaktigt partitionsnamn"
...@@ -1614,6 +1614,21 @@ static int add_key_partition(File fptr, List<char> field_list) ...@@ -1614,6 +1614,21 @@ static int add_key_partition(File fptr, List<char> field_list)
return err; 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) static int add_int(File fptr, longlong number)
{ {
llstr(number, buff); llstr(number, buff);
...@@ -1912,7 +1927,7 @@ char *generate_partition_syntax(partition_info *part_info, ...@@ -1912,7 +1927,7 @@ char *generate_partition_syntax(partition_info *part_info,
part_info->part_state_len= part_state_id+1; part_info->part_state_len= part_state_id+1;
} }
err+= add_partition(fptr); 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_space(fptr);
err+= add_partition_values(fptr, part_info, part_elem); err+= add_partition_values(fptr, part_info, part_elem);
if (!part_info->is_sub_partitioned()) if (!part_info->is_sub_partitioned())
...@@ -1928,7 +1943,7 @@ char *generate_partition_syntax(partition_info *part_info, ...@@ -1928,7 +1943,7 @@ char *generate_partition_syntax(partition_info *part_info,
{ {
part_elem= sub_it++; part_elem= sub_it++;
err+= add_subpartition(fptr); 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_space(fptr);
err+= add_partition_options(fptr, part_elem); err+= add_partition_options(fptr, part_elem);
if (j != (no_subparts-1)) if (j != (no_subparts-1))
......
...@@ -753,6 +753,7 @@ mysqld_dump_create_info(THD *thd, TABLE_LIST *table_list, int fd) ...@@ -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) static const char *require_quotes(const char *name, uint name_length)
{ {
uint length; uint length;
bool pure_digit= TRUE;
const char *end= name + name_length; const char *end= name + name_length;
for (; name < end ; name++) for (; name < end ; name++)
...@@ -761,7 +762,11 @@ static const char *require_quotes(const char *name, uint name_length) ...@@ -761,7 +762,11 @@ static const char *require_quotes(const char *name, uint name_length)
length= my_mbcharlen(system_charset_info, chr); length= my_mbcharlen(system_charset_info, chr);
if (length == 1 && !system_charset_info->ident_map[chr]) if (length == 1 && !system_charset_info->ident_map[chr])
return name; return name;
if (length == 1 && (chr < '0' || chr > '9'))
pure_digit= FALSE;
} }
if (pure_digit)
return name;
return 0; return 0;
} }
......
...@@ -3639,7 +3639,7 @@ part_definition: ...@@ -3639,7 +3639,7 @@ part_definition:
; ;
part_name: part_name:
ident_or_text ident
{ {
LEX *lex= Lex; LEX *lex= Lex;
partition_info *part_info= lex->part_info; partition_info *part_info= lex->part_info;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment