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);
 }