Commit 50e66db0 authored by Alexey Botchkov's avatar Alexey Botchkov

MDEV-25917 create table like fails if source table is partitioned and engine...

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.
parent ebc77c6d
......@@ -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 @@ class partition_element :public Sql_alloc {
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 @@ class partition_info : public Sql_alloc
}
~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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment