mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 10:31:54 +01:00
BUG#21143: mysqld hangs when using wrong number of subpartitions
Rewrote if-statement a bit shorter Added check for subpartitions in REORGANIZE partitions to be of same number as in base table.
This commit is contained in:
parent
a4eb61b88c
commit
79ab9cef27
4 changed files with 38 additions and 11 deletions
|
@ -1,4 +1,14 @@
|
||||||
DROP TABLE IF EXISTS t1;
|
DROP TABLE IF EXISTS t1;
|
||||||
|
create table t1 (a int)
|
||||||
|
partition by range (a)
|
||||||
|
subpartition by key (a)
|
||||||
|
(partition p0 values less than (10) (subpartition sp00, subpartition sp01),
|
||||||
|
partition p1 values less than (20) (subpartition sp10, subpartition sp11));
|
||||||
|
alter table t1 reorganize partition p0 into
|
||||||
|
(partition p0 values less than (10) (subpartition sp00,
|
||||||
|
subpartition sp01, subpartition sp02));
|
||||||
|
ERROR HY000: Wrong number of subpartitions defined, mismatch with previous setting
|
||||||
|
drop table t1;
|
||||||
CREATE TABLE t1 (f_date DATE, f_varchar VARCHAR(30))
|
CREATE TABLE t1 (f_date DATE, f_varchar VARCHAR(30))
|
||||||
PARTITION BY HASH(CAST(YEAR(f_date) AS SIGNED INTEGER)) PARTITIONS 2;
|
PARTITION BY HASH(CAST(YEAR(f_date) AS SIGNED INTEGER)) PARTITIONS 2;
|
||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
|
|
|
@ -2,6 +2,23 @@
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
DROP TABLE IF EXISTS t1;
|
DROP TABLE IF EXISTS t1;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug 21143: mysqld hang when error in number of subparts in
|
||||||
|
# REORGANIZE command
|
||||||
|
#
|
||||||
|
create table t1 (a int)
|
||||||
|
partition by range (a)
|
||||||
|
subpartition by key (a)
|
||||||
|
(partition p0 values less than (10) (subpartition sp00, subpartition sp01),
|
||||||
|
partition p1 values less than (20) (subpartition sp10, subpartition sp11));
|
||||||
|
|
||||||
|
-- error ER_PARTITION_WRONG_NO_SUBPART_ERROR
|
||||||
|
alter table t1 reorganize partition p0 into
|
||||||
|
(partition p0 values less than (10) (subpartition sp00,
|
||||||
|
subpartition sp01, subpartition sp02));
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
CREATE TABLE t1 (f_date DATE, f_varchar VARCHAR(30))
|
CREATE TABLE t1 (f_date DATE, f_varchar VARCHAR(30))
|
||||||
PARTITION BY HASH(CAST(YEAR(f_date) AS SIGNED INTEGER)) PARTITIONS 2;
|
PARTITION BY HASH(CAST(YEAR(f_date) AS SIGNED INTEGER)) PARTITIONS 2;
|
||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
|
|
|
@ -5145,13 +5145,12 @@ void ha_partition::print_error(int error, myf errflag)
|
||||||
DBUG_ENTER("ha_partition::print_error");
|
DBUG_ENTER("ha_partition::print_error");
|
||||||
|
|
||||||
/* Should probably look for my own errors first */
|
/* Should probably look for my own errors first */
|
||||||
/* monty: needs to be called for the last used partition ! */
|
|
||||||
DBUG_PRINT("enter", ("error: %d", error));
|
DBUG_PRINT("enter", ("error: %d", error));
|
||||||
|
|
||||||
if (error == HA_ERR_NO_PARTITION_FOUND)
|
if (error == HA_ERR_NO_PARTITION_FOUND)
|
||||||
m_part_info->print_no_partition_found(table);
|
m_part_info->print_no_partition_found(table);
|
||||||
else
|
else
|
||||||
m_file[0]->print_error(error, errflag);
|
m_file[m_last_part]->print_error(error, errflag);
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5161,8 +5160,7 @@ bool ha_partition::get_error_message(int error, String *buf)
|
||||||
DBUG_ENTER("ha_partition::get_error_message");
|
DBUG_ENTER("ha_partition::get_error_message");
|
||||||
|
|
||||||
/* Should probably look for my own errors first */
|
/* Should probably look for my own errors first */
|
||||||
/* monty: needs to be called for the last used partition ! */
|
DBUG_RETURN(m_file[m_last_part]->get_error_message(error, buf));
|
||||||
DBUG_RETURN(m_file[0]->get_error_message(error, buf));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3471,14 +3471,9 @@ bool mysql_unpack_partition(THD *thd, const uchar *part_buf,
|
||||||
}
|
}
|
||||||
table->part_info= part_info;
|
table->part_info= part_info;
|
||||||
table->file->set_part_info(part_info);
|
table->file->set_part_info(part_info);
|
||||||
if (part_info->default_engine_type == NULL)
|
if (!part_info->default_engine_type)
|
||||||
{
|
|
||||||
part_info->default_engine_type= default_db_type;
|
part_info->default_engine_type= default_db_type;
|
||||||
}
|
DBUG_ASSERT(part_info->default_engine_type == default_db_type);
|
||||||
else
|
|
||||||
{
|
|
||||||
DBUG_ASSERT(part_info->default_engine_type == default_db_type);
|
|
||||||
}
|
|
||||||
part_info->item_free_list= thd->free_list;
|
part_info->item_free_list= thd->free_list;
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -4392,6 +4387,13 @@ state of p1.
|
||||||
my_error(ER_REORG_HASH_ONLY_ON_SAME_NO, MYF(0));
|
my_error(ER_REORG_HASH_ONLY_ON_SAME_NO, MYF(0));
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
|
if (tab_part_info->is_sub_partitioned() &&
|
||||||
|
alt_part_info->no_subparts &&
|
||||||
|
alt_part_info->no_subparts != tab_part_info->no_subparts)
|
||||||
|
{
|
||||||
|
my_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR, MYF(0));
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
|
}
|
||||||
check_total_partitions= tab_part_info->no_parts + no_parts_new;
|
check_total_partitions= tab_part_info->no_parts + no_parts_new;
|
||||||
check_total_partitions-= no_parts_reorged;
|
check_total_partitions-= no_parts_reorged;
|
||||||
if (check_total_partitions > MAX_PARTITIONS)
|
if (check_total_partitions > MAX_PARTITIONS)
|
||||||
|
|
Loading…
Add table
Reference in a new issue