mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +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 p1 DATA DIRECTORY 'part-data' INDEX DIRECTORY 'part-data');
|
||||
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 p0,
|
||||
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),
|
||||
part_state(part_elem->part_state),
|
||||
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() {}
|
||||
|
@ -35,7 +35,7 @@
|
||||
#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;
|
||||
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);
|
||||
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)
|
||||
{
|
||||
mem_alloc_error(sizeof(partition_element));
|
||||
DBUG_RETURN(NULL);
|
||||
}
|
||||
*part_clone= *part;
|
||||
part_clone->subpartitions.empty();
|
||||
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)
|
||||
{
|
||||
mem_alloc_error(sizeof(partition_element));
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
part_clone->list_val_list.empty();
|
||||
List_iterator<part_elem_value> list_val_it(part->list_val_list);
|
||||
|
@ -281,7 +281,7 @@ public:
|
||||
}
|
||||
~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_partition_bitmaps(TABLE_LIST *table_list);
|
||||
/* 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
|
||||
/* Partition info is not handled by mysql_prepare_alter_table() call. */
|
||||
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
|
||||
|
Reference in New Issue
Block a user