mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
MDEV-25917 create table like fails if source table is partitioned and engine is myisam or aria with data directory.
Create table like removes data_file_path/index_file_path from the thd->work_partition_info.
This commit is contained in:
@ -177,3 +177,97 @@ partition by key (a)
|
|||||||
(partition p0,
|
(partition p0,
|
||||||
partition p1 DATA DIRECTORY 'part-data' INDEX DIRECTORY 'part-data');
|
partition p1 DATA DIRECTORY 'part-data' INDEX DIRECTORY 'part-data');
|
||||||
Got one of the listed errors
|
Got one of the listed errors
|
||||||
|
#
|
||||||
|
# MDEV-25917 create table like fails if source table is partitioned and engine is myisam or aria with data directory.
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a INT)
|
||||||
|
ENGINE = MyISAM
|
||||||
|
PARTITION BY LIST (a)
|
||||||
|
(PARTITION p0 VALUES IN (0)
|
||||||
|
DATA DIRECTORY 'MYSQLTEST_VARDIR/tmp'
|
||||||
|
INDEX DIRECTORY 'MYSQLTEST_VARDIR/tmp',
|
||||||
|
PARTITION p1 VALUES IN (1)
|
||||||
|
DATA DIRECTORY 'MYSQLTEST_VARDIR/tmp'
|
||||||
|
INDEX DIRECTORY 'MYSQLTEST_VARDIR/tmp',
|
||||||
|
PARTITION p2 VALUES IN (2));
|
||||||
|
CREATE TABLE t2 LIKE t1;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` int(11) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
PARTITION BY LIST (`a`)
|
||||||
|
(PARTITION `p0` VALUES IN (0) DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp' ENGINE = MyISAM,
|
||||||
|
PARTITION `p1` VALUES IN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp' ENGINE = MyISAM,
|
||||||
|
PARTITION `p2` VALUES IN (2) ENGINE = MyISAM)
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
Table Create Table
|
||||||
|
t2 CREATE TABLE `t2` (
|
||||||
|
`a` int(11) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
PARTITION BY LIST (`a`)
|
||||||
|
(PARTITION `p0` VALUES IN (0) ENGINE = MyISAM,
|
||||||
|
PARTITION `p1` VALUES IN (1) ENGINE = MyISAM,
|
||||||
|
PARTITION `p2` VALUES IN (2) ENGINE = MyISAM)
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
ID int(11) NOT NULL,
|
||||||
|
type int(11)) Engine=MyISAM
|
||||||
|
PARTITION BY RANGE(ID)
|
||||||
|
SUBPARTITION BY HASH(type)
|
||||||
|
(
|
||||||
|
PARTITION p01 VALUES LESS THAN(100)
|
||||||
|
(SUBPARTITION s11
|
||||||
|
DATA DIRECTORY 'MYSQLTEST_VARDIR/tmp'
|
||||||
|
INDEX DIRECTORY 'MYSQLTEST_VARDIR/tmp',
|
||||||
|
SUBPARTITION s12
|
||||||
|
DATA DIRECTORY 'MYSQLTEST_VARDIR/tmp'
|
||||||
|
INDEX DIRECTORY 'MYSQLTEST_VARDIR/tmp'
|
||||||
|
),
|
||||||
|
PARTITION p11 VALUES LESS THAN(200)
|
||||||
|
(SUBPARTITION s21, SUBPARTITION s22),
|
||||||
|
PARTITION p21 VALUES LESS THAN MAXVALUE
|
||||||
|
(SUBPARTITION s31
|
||||||
|
DATA DIRECTORY 'MYSQLTEST_VARDIR/tmp'
|
||||||
|
INDEX DIRECTORY 'MYSQLTEST_VARDIR/tmp',
|
||||||
|
SUBPARTITION s32
|
||||||
|
DATA DIRECTORY 'MYSQLTEST_VARDIR/tmp'
|
||||||
|
INDEX DIRECTORY 'MYSQLTEST_VARDIR/tmp'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
CREATE TABLE t2 LIKE t1;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`ID` int(11) NOT NULL,
|
||||||
|
`type` int(11) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
PARTITION BY RANGE (`ID`)
|
||||||
|
SUBPARTITION BY HASH (`type`)
|
||||||
|
(PARTITION `p01` VALUES LESS THAN (100)
|
||||||
|
(SUBPARTITION `s11` DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp' ENGINE = MyISAM,
|
||||||
|
SUBPARTITION `s12` DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp' ENGINE = MyISAM),
|
||||||
|
PARTITION `p11` VALUES LESS THAN (200)
|
||||||
|
(SUBPARTITION `s21` ENGINE = MyISAM,
|
||||||
|
SUBPARTITION `s22` ENGINE = MyISAM),
|
||||||
|
PARTITION `p21` VALUES LESS THAN MAXVALUE
|
||||||
|
(SUBPARTITION `s31` DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp' ENGINE = MyISAM,
|
||||||
|
SUBPARTITION `s32` DATA DIRECTORY = 'MYSQLTEST_VARDIR/tmp' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/tmp' ENGINE = MyISAM))
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
Table Create Table
|
||||||
|
t2 CREATE TABLE `t2` (
|
||||||
|
`ID` int(11) NOT NULL,
|
||||||
|
`type` int(11) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
PARTITION BY RANGE (`ID`)
|
||||||
|
SUBPARTITION BY HASH (`type`)
|
||||||
|
(PARTITION `p01` VALUES LESS THAN (100)
|
||||||
|
(SUBPARTITION `s11` ENGINE = MyISAM,
|
||||||
|
SUBPARTITION `s12` ENGINE = MyISAM),
|
||||||
|
PARTITION `p11` VALUES LESS THAN (200)
|
||||||
|
(SUBPARTITION `s21` ENGINE = MyISAM,
|
||||||
|
SUBPARTITION `s22` ENGINE = MyISAM),
|
||||||
|
PARTITION `p21` VALUES LESS THAN MAXVALUE
|
||||||
|
(SUBPARTITION `s31` ENGINE = MyISAM,
|
||||||
|
SUBPARTITION `s32` ENGINE = MyISAM))
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
@ -220,3 +220,58 @@ ENGINE = MyISAM
|
|||||||
partition by key (a)
|
partition by key (a)
|
||||||
(partition p0,
|
(partition p0,
|
||||||
partition p1 DATA DIRECTORY 'part-data' INDEX DIRECTORY 'part-data');
|
partition p1 DATA DIRECTORY 'part-data' INDEX DIRECTORY 'part-data');
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-25917 create table like fails if source table is partitioned and engine is myisam or aria with data directory.
|
||||||
|
--echo #
|
||||||
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
|
eval CREATE TABLE t1 (a INT)
|
||||||
|
ENGINE = MyISAM
|
||||||
|
PARTITION BY LIST (a)
|
||||||
|
(PARTITION p0 VALUES IN (0)
|
||||||
|
DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp'
|
||||||
|
INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp',
|
||||||
|
PARTITION p1 VALUES IN (1)
|
||||||
|
DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp'
|
||||||
|
INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp',
|
||||||
|
PARTITION p2 VALUES IN (2));
|
||||||
|
|
||||||
|
CREATE TABLE t2 LIKE t1;
|
||||||
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
|
eval CREATE TABLE t1 (
|
||||||
|
ID int(11) NOT NULL,
|
||||||
|
type int(11)) Engine=MyISAM
|
||||||
|
PARTITION BY RANGE(ID)
|
||||||
|
SUBPARTITION BY HASH(type)
|
||||||
|
(
|
||||||
|
PARTITION p01 VALUES LESS THAN(100)
|
||||||
|
(SUBPARTITION s11
|
||||||
|
DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp'
|
||||||
|
INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp',
|
||||||
|
SUBPARTITION s12
|
||||||
|
DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp'
|
||||||
|
INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp'
|
||||||
|
),
|
||||||
|
PARTITION p11 VALUES LESS THAN(200)
|
||||||
|
(SUBPARTITION s21, SUBPARTITION s22),
|
||||||
|
PARTITION p21 VALUES LESS THAN MAXVALUE
|
||||||
|
(SUBPARTITION s31
|
||||||
|
DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp'
|
||||||
|
INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp',
|
||||||
|
SUBPARTITION s32
|
||||||
|
DATA DIRECTORY '$MYSQLTEST_VARDIR/tmp'
|
||||||
|
INDEX DIRECTORY '$MYSQLTEST_VARDIR/tmp'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE t2 LIKE t1;
|
||||||
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
@ -132,7 +132,9 @@ public:
|
|||||||
connect_string(null_lex_str),
|
connect_string(null_lex_str),
|
||||||
part_state(part_elem->part_state),
|
part_state(part_elem->part_state),
|
||||||
nodegroup_id(part_elem->nodegroup_id),
|
nodegroup_id(part_elem->nodegroup_id),
|
||||||
has_null_value(FALSE)
|
has_null_value(FALSE),
|
||||||
|
signed_flag(part_elem->signed_flag),
|
||||||
|
max_value(part_elem->max_value)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
~partition_element() {}
|
~partition_element() {}
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
#include "ha_partition.h"
|
#include "ha_partition.h"
|
||||||
|
|
||||||
|
|
||||||
partition_info *partition_info::get_clone(THD *thd)
|
partition_info *partition_info::get_clone(THD *thd, bool empty_data_and_index_file)
|
||||||
{
|
{
|
||||||
MEM_ROOT *mem_root= thd->mem_root;
|
MEM_ROOT *mem_root= thd->mem_root;
|
||||||
DBUG_ENTER("partition_info::get_clone");
|
DBUG_ENTER("partition_info::get_clone");
|
||||||
@ -57,25 +57,28 @@ partition_info *partition_info::get_clone(THD *thd)
|
|||||||
{
|
{
|
||||||
List_iterator<partition_element> subpart_it(part->subpartitions);
|
List_iterator<partition_element> subpart_it(part->subpartitions);
|
||||||
partition_element *subpart;
|
partition_element *subpart;
|
||||||
partition_element *part_clone= new (mem_root) partition_element();
|
partition_element *part_clone= new (mem_root) partition_element(*part);
|
||||||
if (!part_clone)
|
if (!part_clone)
|
||||||
{
|
{
|
||||||
mem_alloc_error(sizeof(partition_element));
|
mem_alloc_error(sizeof(partition_element));
|
||||||
DBUG_RETURN(NULL);
|
DBUG_RETURN(NULL);
|
||||||
}
|
}
|
||||||
*part_clone= *part;
|
|
||||||
part_clone->subpartitions.empty();
|
part_clone->subpartitions.empty();
|
||||||
while ((subpart= (subpart_it++)))
|
while ((subpart= (subpart_it++)))
|
||||||
{
|
{
|
||||||
partition_element *subpart_clone= new (mem_root) partition_element();
|
partition_element *subpart_clone= new (mem_root) partition_element(*subpart);
|
||||||
if (!subpart_clone)
|
if (!subpart_clone)
|
||||||
{
|
{
|
||||||
mem_alloc_error(sizeof(partition_element));
|
mem_alloc_error(sizeof(partition_element));
|
||||||
DBUG_RETURN(NULL);
|
DBUG_RETURN(NULL);
|
||||||
}
|
}
|
||||||
*subpart_clone= *subpart;
|
if (empty_data_and_index_file)
|
||||||
|
subpart_clone->data_file_name= subpart_clone->index_file_name= NULL;
|
||||||
part_clone->subpartitions.push_back(subpart_clone, mem_root);
|
part_clone->subpartitions.push_back(subpart_clone, mem_root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (empty_data_and_index_file)
|
||||||
|
part_clone->data_file_name= part_clone->index_file_name= NULL;
|
||||||
clone->partitions.push_back(part_clone, mem_root);
|
clone->partitions.push_back(part_clone, mem_root);
|
||||||
part_clone->list_val_list.empty();
|
part_clone->list_val_list.empty();
|
||||||
List_iterator<part_elem_value> list_val_it(part->list_val_list);
|
List_iterator<part_elem_value> list_val_it(part->list_val_list);
|
||||||
|
@ -281,7 +281,7 @@ public:
|
|||||||
}
|
}
|
||||||
~partition_info() {}
|
~partition_info() {}
|
||||||
|
|
||||||
partition_info *get_clone(THD *thd);
|
partition_info *get_clone(THD *thd, bool empty_data_and_index_file= FALSE);
|
||||||
bool set_named_partition_bitmap(const char *part_name, uint length);
|
bool set_named_partition_bitmap(const char *part_name, uint length);
|
||||||
bool set_partition_bitmaps(TABLE_LIST *table_list);
|
bool set_partition_bitmaps(TABLE_LIST *table_list);
|
||||||
/* Answers the question if subpartitioning is used for a certain table */
|
/* Answers the question if subpartitioning is used for a certain table */
|
||||||
|
@ -5547,8 +5547,15 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table,
|
|||||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||||
/* Partition info is not handled by mysql_prepare_alter_table() call. */
|
/* Partition info is not handled by mysql_prepare_alter_table() call. */
|
||||||
if (src_table->table->part_info)
|
if (src_table->table->part_info)
|
||||||
thd->work_part_info= src_table->table->part_info->get_clone(thd);
|
{
|
||||||
#endif
|
/*
|
||||||
|
The CREATE TABLE LIKE should not inherit the DATA DIRECTORY
|
||||||
|
and INDEX DIRECTORY from the base table.
|
||||||
|
So that TRUE argument for the get_clone.
|
||||||
|
*/
|
||||||
|
thd->work_part_info= src_table->table->part_info->get_clone(thd, TRUE);
|
||||||
|
}
|
||||||
|
#endif /*WITH_PARTITION_STORAGE_ENGINE*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Adjust description of source table before using it for creation of
|
Adjust description of source table before using it for creation of
|
||||||
|
Reference in New Issue
Block a user