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.
This commit is contained in:
parent
2e9045c8fd
commit
90c200a216
@ -1,4 +1,74 @@
|
|||||||
drop table if exists t1;
|
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;
|
||||||
CREATE TABLE t1 (a INTEGER NOT NULL, PRIMARY KEY (a));
|
CREATE TABLE t1 (a INTEGER NOT NULL, PRIMARY KEY (a));
|
||||||
INSERT INTO t1 VALUES (1),(1);
|
INSERT INTO t1 VALUES (1),(1);
|
||||||
ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
|
ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
|
||||||
|
@ -8,6 +8,40 @@
|
|||||||
drop table if exists t1;
|
drop table if exists t1;
|
||||||
--enable_warnings
|
--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;
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug#38719: Partitioning returns a different error code for a
|
# Bug#38719: Partitioning returns a different error code for a
|
||||||
# duplicate key error
|
# duplicate key error
|
||||||
|
@ -823,6 +823,30 @@ end:
|
|||||||
DBUG_RETURN(result);
|
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.
|
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
|
do
|
||||||
{
|
{
|
||||||
partition_element *part_elem= part_it++;
|
partition_element *part_elem= part_it++;
|
||||||
#ifdef HAVE_READLINK
|
warn_if_dir_in_part_elem(thd, part_elem);
|
||||||
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;
|
|
||||||
}
|
|
||||||
if (!is_sub_partitioned())
|
if (!is_sub_partitioned())
|
||||||
{
|
{
|
||||||
if (part_elem->engine_type == NULL)
|
if (part_elem->engine_type == NULL)
|
||||||
@ -989,6 +1000,7 @@ bool partition_info::check_partition_info(THD *thd, handlerton **eng_type,
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
sub_elem= sub_it++;
|
sub_elem= sub_it++;
|
||||||
|
warn_if_dir_in_part_elem(thd, sub_elem);
|
||||||
if (check_table_name(sub_elem->partition_name,
|
if (check_table_name(sub_elem->partition_name,
|
||||||
strlen(sub_elem->partition_name)))
|
strlen(sub_elem->partition_name)))
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user