diff --git a/mysql-test/r/partition_mgm_err.result b/mysql-test/r/partition_mgm_err.result index 01709e726bd98e4754e5135aff7728f653a9fd59..840c9cc72ef72330acef88d965b41f2d528efbff 100644 --- a/mysql-test/r/partition_mgm_err.result +++ b/mysql-test/r/partition_mgm_err.result @@ -107,3 +107,4 @@ ALTER TABLE t1 DROP PARTITION x1; ALTER TABLE t1 DROP PARTITION x0; ERROR HY000: Cannot remove all partitions, use DROP TABLE instead DROP TABLE t1; +DROP TABLE t1; diff --git a/mysql-test/t/partition_mgm_err.test b/mysql-test/t/partition_mgm_err.test index 92848fc135e2ba12388555da160d50aae6e03f72..460171c99b5ba775288288cc6aa13ded90481bcc 100644 --- a/mysql-test/t/partition_mgm_err.test +++ b/mysql-test/t/partition_mgm_err.test @@ -158,3 +158,19 @@ ALTER TABLE t1 DROP PARTITION x1; 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 diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index d7549c1a95b745323ed1b159b7dc729afbd31721..7e580b3b56dacd5c988139f31d5ac86aa660c58d 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -507,7 +507,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; @@ -550,8 +550,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) { /* Set up @@ -565,6 +566,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 03acf217419f9dd037e91e5351fb0390d9b508e0..5491df596e577c53552ff0a6437d9ecc23da5e45 100644 --- a/sql/ha_partition.h +++ b/sql/ha_partition.h @@ -197,8 +197,10 @@ class ha_partition :public handler 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 026234caf340f8493708b73b218b74953919dff4..763afe3da0a6c9dffe2506987eac8eba82cc20ee 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -636,6 +636,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 ecde4d01ae11301bcfd2139b4fd9e2a3472bee4a..95b0ebdeead135c5d8a50f41ec634eb82cf6a95b 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 @@ -6733,8 +6731,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 20d14f5f196741ced875abe5d96e8392b308b7fe..63b8f24a0ccd7f5dbd218f9e656f880c2dff5b3d 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -1936,13 +1936,18 @@ 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); 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); } @@ -1968,7 +1973,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) @@ -1976,11 +1982,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); }