diff --git a/mysql-test/t/partition_mgm_err.test b/mysql-test/t/partition_mgm_err.test index 4b6b4968bdb..cbecac96afb 100644 --- a/mysql-test/t/partition_mgm_err.test +++ b/mysql-test/t/partition_mgm_err.test @@ -168,6 +168,22 @@ ALTER TABLE t1 DROP PARTITION x0; DROP TABLE t1; +# +# BUG: 14354 Partitions: data directory clause fails +# +--exec rm -rf $MYSQL_TEST_DIR/var/tmp/bug14354 +--exec mkdir $MYSQL_TEST_DIR/var/tmp/bug14354 +disable_query_log; +eval CREATE TABLE t1 (id int) PARTITION BY RANGE(id) ( +PARTITION p1 VALUES LESS THAN (20) ENGINE=myiasm +DATA DIRECTORY="$MYSQL_TEST_DIR/var/tmp/bug14354" +INDEX DIRECTORY="$MYSQL_TEST_DIR/var/tmp/bug14354"); +enable_query_log; +--exec test -f $MYSQL_TEST_DIR/var/tmp/bug14354/t1_p1.MYD +--exec test -f $MYSQL_TEST_DIR/var/tmp/bug14354/t1_p1.MYI +DROP TABLE t1; +--exec rm -rf $MYSQL_TEST_DIR/var/tmp/bug14354 + # # Bug# 16534 - Trying to add multiple partitions crashes server # diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index 61ffa49def2..4bca3365cb2 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -1696,7 +1696,7 @@ uint ha_partition::del_ren_cre_table(const char *from, error= (*file)->delete_table((const char*) from_buff); else { - set_up_table_before_create(table_arg, create_info, i); + set_up_table_before_create(table_arg, from_buff, create_info, i); error= (*file)->create(from_buff, table_arg, create_info); } name_buffer_ptr= strend(name_buffer_ptr) + 1; @@ -1770,8 +1770,9 @@ partition_element *ha_partition::find_partition_element(uint part_id) */ void ha_partition::set_up_table_before_create(TABLE *table, - HA_CREATE_INFO *info, - uint part_id) + const char *partition_name_with_path, + HA_CREATE_INFO *info, + uint part_id) { partition_element *part_elem= find_partition_element(part_id); @@ -1779,6 +1780,15 @@ void ha_partition::set_up_table_before_create(TABLE *table, return; // Fatal error table->s->max_rows= part_elem->part_max_rows; table->s->min_rows= part_elem->part_min_rows; + char *partition_name= strrchr(partition_name_with_path, FN_LIBCHAR); + if (part_elem->index_file_name) + append_file_to_dir(current_thd, + (const char**)&part_elem->index_file_name, + partition_name+1); + if (part_elem->data_file_name) + append_file_to_dir(current_thd, + (const char**)&part_elem->data_file_name, + partition_name+1); info->index_file_name= part_elem->index_file_name; info->data_file_name= part_elem->data_file_name; } diff --git a/sql/ha_partition.h b/sql/ha_partition.h index 60f6a5ca15b..8803b85ffcb 100644 --- a/sql/ha_partition.h +++ b/sql/ha_partition.h @@ -220,8 +220,10 @@ private: bool new_handlers_from_part_info(); bool create_handlers(); void clear_handler_file(); - void set_up_table_before_create(TABLE * table_arg, HA_CREATE_INFO * info, - uint part_id); + void set_up_table_before_create(TABLE *table_arg, + const char *partition_name_with_path, + HA_CREATE_INFO *info, + uint part_id); partition_element *find_partition_element(uint part_id); public: diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 7be9548e6ca..589ca1349c1 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -649,6 +649,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd, char* packet, uint packet_length); void log_slow_statement(THD *thd); bool check_dup(const char *db, const char *name, TABLE_LIST *tables); +bool append_file_to_dir(THD *thd, const char **filename_ptr, + const char *table_name); bool table_cache_init(void); void table_cache_free(void); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index fff7a32b16b..fa69266f5c4 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -68,8 +68,6 @@ static bool check_db_used(THD *thd,TABLE_LIST *tables); static bool check_multi_update_lock(THD *thd); static void remove_escape(char *name); static void refresh_status(THD *thd); -static bool append_file_to_dir(THD *thd, const char **filename_ptr, - const char *table_name); const char *any_db="*any*"; // Special symbol for check_access @@ -6729,8 +6727,8 @@ static void refresh_status(THD *thd) /* If pointer is not a null pointer, append filename to it */ -static bool append_file_to_dir(THD *thd, const char **filename_ptr, - const char *table_name) +bool append_file_to_dir(THD *thd, const char **filename_ptr, + const char *table_name) { char buff[FN_REFLEN],*ptr, *end; if (!*filename_ptr) diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 41531add51c..52d2d61e843 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -2243,6 +2243,7 @@ static int add_int(File fptr, longlong number) } static int add_keyword_string(File fptr, const char *keyword, + bool should_use_quotes, const char *keystr) { int err= add_string(fptr, keyword); @@ -2250,7 +2251,11 @@ static int add_keyword_string(File fptr, const char *keyword, err+= add_space(fptr); err+= add_equal(fptr); err+= add_space(fptr); + if (should_use_quotes) + err+= add_string(fptr, "'"); err+= add_string(fptr, keystr); + if (should_use_quotes) + err+= add_string(fptr, "'"); return err + add_space(fptr); } @@ -2278,7 +2283,8 @@ static int add_partition_options(File fptr, partition_element *p_elem) int err= 0; if (p_elem->tablespace_name) - err+= add_keyword_string(fptr,"TABLESPACE",p_elem->tablespace_name); + err+= add_keyword_string(fptr,"TABLESPACE", FALSE, + p_elem->tablespace_name); if (p_elem->nodegroup_id != UNDEF_NODEGROUP) err+= add_keyword_int(fptr,"NODEGROUP",(longlong)p_elem->nodegroup_id); if (p_elem->part_max_rows) @@ -2286,11 +2292,13 @@ static int add_partition_options(File fptr, partition_element *p_elem) if (p_elem->part_min_rows) err+= add_keyword_int(fptr,"MIN_ROWS",(longlong)p_elem->part_min_rows); if (p_elem->data_file_name) - err+= add_keyword_string(fptr,"DATA DIRECTORY",p_elem->data_file_name); + err+= add_keyword_string(fptr, "DATA DIRECTORY", TRUE, + p_elem->data_file_name); if (p_elem->index_file_name) - err+= add_keyword_string(fptr,"INDEX DIRECTORY",p_elem->index_file_name); + err+= add_keyword_string(fptr, "INDEX DIRECTORY", TRUE, + p_elem->index_file_name); if (p_elem->part_comment) - err+= add_keyword_string(fptr, "COMMENT",p_elem->part_comment); + err+= add_keyword_string(fptr, "COMMENT", FALSE, p_elem->part_comment); return err + add_engine(fptr,p_elem->engine_type); }