diff options
author | Mattias Jonsson <mattias.jonsson@sun.com> | 2010-05-25 17:26:48 +0200 |
---|---|---|
committer | Mattias Jonsson <mattias.jonsson@sun.com> | 2010-05-25 17:26:48 +0200 |
commit | e596ae0795f89c316106808b744cfbe749940b74 (patch) | |
tree | fb01d3d95d876af5d2f15e600cf36bc3eaf735df | |
parent | 6ed71b7d1ed00fb3d433b4cab2ba1fdf22426642 (diff) | |
parent | 90c200a216506ed5309d2bc4a20385875eb7d1a8 (diff) | |
download | mariadb-git-e596ae0795f89c316106808b744cfbe749940b74.tar.gz |
merge
-rw-r--r-- | mysql-test/r/partition_error.result | 70 | ||||
-rw-r--r-- | mysql-test/t/partition_error.test | 35 | ||||
-rw-r--r-- | sql/partition_info.cc | 40 |
3 files changed, 130 insertions, 15 deletions
diff --git a/mysql-test/r/partition_error.result b/mysql-test/r/partition_error.result index ce304b136d0..6c7b7127975 100644 --- a/mysql-test/r/partition_error.result +++ b/mysql-test/r/partition_error.result @@ -1,5 +1,75 @@ drop table if exists t1; # +# Bug#42954: SQL MODE 'NO_DIR_IN_CREATE' does not work with +# subpartitions +SET @org_mode=@@sql_mode; +SET @@sql_mode='NO_DIR_IN_CREATE'; +SELECT @@sql_mode; +@@sql_mode +NO_DIR_IN_CREATE +CREATE TABLE t1 (id INT, purchased DATE) +PARTITION BY RANGE(YEAR(purchased)) +SUBPARTITION BY HASH(TO_DAYS(purchased)) +(PARTITION p0 VALUES LESS THAN MAXVALUE +DATA DIRECTORY = '/tmp/not-existing' +INDEX DIRECTORY = '/tmp/not-existing'); +Warnings: +Warning 1618 <DATA DIRECTORY> option ignored +Warning 1618 <INDEX DIRECTORY> option ignored +Warning 1618 <DATA DIRECTORY> option ignored +Warning 1618 <INDEX DIRECTORY> option ignored +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) DEFAULT NULL, + `purchased` date DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +/*!50100 PARTITION BY RANGE (YEAR(purchased)) +SUBPARTITION BY HASH (TO_DAYS(purchased)) +(PARTITION p0 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */ +DROP TABLE t1; +CREATE TABLE t1 (id INT, purchased DATE) +PARTITION BY RANGE(YEAR(purchased)) +SUBPARTITION BY HASH(TO_DAYS(purchased)) SUBPARTITIONS 2 +(PARTITION p0 VALUES LESS THAN MAXVALUE +(SUBPARTITION sp0 +DATA DIRECTORY = '/tmp/not-existing' +INDEX DIRECTORY = '/tmp/not-existing', +SUBPARTITION sp1)); +Warnings: +Warning 1618 <DATA DIRECTORY> option ignored +Warning 1618 <INDEX DIRECTORY> option ignored +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) DEFAULT NULL, + `purchased` date DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +/*!50100 PARTITION BY RANGE (YEAR(purchased)) +SUBPARTITION BY HASH (TO_DAYS(purchased)) +(PARTITION p0 VALUES LESS THAN MAXVALUE + (SUBPARTITION sp0 ENGINE = MyISAM, + SUBPARTITION sp1 ENGINE = MyISAM)) */ +DROP TABLE t1; +CREATE TABLE t1 (id INT, purchased DATE) +PARTITION BY RANGE(YEAR(purchased)) +(PARTITION p0 VALUES LESS THAN MAXVALUE +DATA DIRECTORY = '/tmp/not-existing' +INDEX DIRECTORY = '/tmp/not-existing'); +Warnings: +Warning 1618 <DATA DIRECTORY> option ignored +Warning 1618 <INDEX DIRECTORY> option ignored +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) DEFAULT NULL, + `purchased` date DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +/*!50100 PARTITION BY RANGE (YEAR(purchased)) +(PARTITION p0 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */ +DROP TABLE t1; +SET @@sql_mode= @org_mode; +# # Bug#50392: insert_id is not reset for partitioned tables # auto_increment on duplicate entry CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY); diff --git a/mysql-test/t/partition_error.test b/mysql-test/t/partition_error.test index bfa1206fe2d..d1b152c8799 100644 --- a/mysql-test/t/partition_error.test +++ b/mysql-test/t/partition_error.test @@ -7,7 +7,40 @@ --disable_warnings drop table if exists t1; --enable_warnings - + +--echo # +--echo # Bug#42954: SQL MODE 'NO_DIR_IN_CREATE' does not work with +--echo # subpartitions +SET @org_mode=@@sql_mode; +SET @@sql_mode='NO_DIR_IN_CREATE'; +SELECT @@sql_mode; +CREATE TABLE t1 (id INT, purchased DATE) +PARTITION BY RANGE(YEAR(purchased)) +SUBPARTITION BY HASH(TO_DAYS(purchased)) +(PARTITION p0 VALUES LESS THAN MAXVALUE + DATA DIRECTORY = '/tmp/not-existing' + INDEX DIRECTORY = '/tmp/not-existing'); +SHOW CREATE TABLE t1; +DROP TABLE t1; +CREATE TABLE t1 (id INT, purchased DATE) +PARTITION BY RANGE(YEAR(purchased)) +SUBPARTITION BY HASH(TO_DAYS(purchased)) SUBPARTITIONS 2 +(PARTITION p0 VALUES LESS THAN MAXVALUE + (SUBPARTITION sp0 + DATA DIRECTORY = '/tmp/not-existing' + INDEX DIRECTORY = '/tmp/not-existing', + SUBPARTITION sp1)); +SHOW CREATE TABLE t1; +DROP TABLE t1; +CREATE TABLE t1 (id INT, purchased DATE) +PARTITION BY RANGE(YEAR(purchased)) +(PARTITION p0 VALUES LESS THAN MAXVALUE + DATA DIRECTORY = '/tmp/not-existing' + INDEX DIRECTORY = '/tmp/not-existing'); +SHOW CREATE TABLE t1; +DROP TABLE t1; +SET @@sql_mode= @org_mode; + --echo # --echo # Bug#50392: insert_id is not reset for partitioned tables --echo # auto_increment on duplicate entry diff --git a/sql/partition_info.cc b/sql/partition_info.cc index f42a8ee2312..4a2d457df9c 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -1032,6 +1032,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. @@ -1169,20 +1193,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) @@ -1208,6 +1219,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))) { |