From b183e7c5a2fd0f70ed72d78a9b3380da291bbb19 Mon Sep 17 00:00:00 2001 From: Mattias Jonsson Date: Thu, 11 Mar 2010 14:00:36 +0100 Subject: Bug#42954: SQL MODE 'NO_DIR_IN_CREATE' does not work with subpartitions There was no check for DATA/INDEX DIRECTORY for subpartitions Added the same check as for partitions. mysql-test/r/partition_error.result: Bug#42954: SQL MODE 'NO_DIR_IN_CREATE' does not work with subpartitions Updated results mysql-test/t/partition_error.test: Bug#42954: SQL MODE 'NO_DIR_IN_CREATE' does not work with subpartitions Added tests sql/partition_info.cc: Bug#42954: SQL MODE 'NO_DIR_IN_CREATE' does not work with subpartitions moved the check for DATA/INDEX DIRECTORY into a function and used it for both partitions as well as subpartitions. (Was not checked at all for subpartitions before) --- sql/partition_info.cc | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) (limited to 'sql/partition_info.cc') diff --git a/sql/partition_info.cc b/sql/partition_info.cc index ba9ea0e876e..7a6250afbad 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -823,6 +823,30 @@ end: DBUG_RETURN(result); } +/** + Check if we allow DATA/INDEX DIRECTORY, if not warn and set them to NULL. + + @param thd THD also containing sql_mode (looks from MODE_NO_DIR_IN_CREATE). + @param part_elem partition_element to check. +*/ +static void warn_if_dir_in_part_elem(THD *thd, partition_element *part_elem) +{ +#ifdef HAVE_READLINK + if (!my_use_symdir || (thd->variables.sql_mode & MODE_NO_DIR_IN_CREATE)) +#endif + { + if (part_elem->data_file_name) + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + WARN_OPTION_IGNORED, ER(WARN_OPTION_IGNORED), + "DATA DIRECTORY"); + if (part_elem->index_file_name) + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + WARN_OPTION_IGNORED, ER(WARN_OPTION_IGNORED), + "INDEX DIRECTORY"); + part_elem->data_file_name= part_elem->index_file_name= NULL; + } +} + /* This code is used early in the CREATE TABLE and ALTER TABLE process. @@ -950,20 +974,7 @@ bool partition_info::check_partition_info(THD *thd, handlerton **eng_type, do { partition_element *part_elem= part_it++; -#ifdef HAVE_READLINK - if (!my_use_symdir || (thd->variables.sql_mode & MODE_NO_DIR_IN_CREATE)) -#endif - { - if (part_elem->data_file_name) - push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, - WARN_OPTION_IGNORED, ER(WARN_OPTION_IGNORED), - "DATA DIRECTORY"); - if (part_elem->index_file_name) - push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, - WARN_OPTION_IGNORED, ER(WARN_OPTION_IGNORED), - "INDEX DIRECTORY"); - part_elem->data_file_name= part_elem->index_file_name= NULL; - } + warn_if_dir_in_part_elem(thd, part_elem); if (!is_sub_partitioned()) { if (part_elem->engine_type == NULL) @@ -989,6 +1000,7 @@ bool partition_info::check_partition_info(THD *thd, handlerton **eng_type, do { sub_elem= sub_it++; + warn_if_dir_in_part_elem(thd, sub_elem); if (check_table_name(sub_elem->partition_name, strlen(sub_elem->partition_name))) { -- cgit v1.2.1