mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 10:14:19 +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;
|
||||
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))
|
||||
PARTITION BY HASH(CAST(YEAR(f_date) AS SIGNED INTEGER)) PARTITIONS 2;
|
||||
SHOW CREATE TABLE t1;
|
||||
|
|
|
@ -2,6 +2,23 @@
|
|||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--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))
|
||||
PARTITION BY HASH(CAST(YEAR(f_date) AS SIGNED INTEGER)) PARTITIONS 2;
|
||||
SHOW CREATE TABLE t1;
|
||||
|
|
|
@ -5145,13 +5145,12 @@ void ha_partition::print_error(int error, myf errflag)
|
|||
DBUG_ENTER("ha_partition::print_error");
|
||||
|
||||
/* Should probably look for my own errors first */
|
||||
/* monty: needs to be called for the last used partition ! */
|
||||
DBUG_PRINT("enter", ("error: %d", error));
|
||||
|
||||
if (error == HA_ERR_NO_PARTITION_FOUND)
|
||||
m_part_info->print_no_partition_found(table);
|
||||
else
|
||||
m_file[0]->print_error(error, errflag);
|
||||
m_file[m_last_part]->print_error(error, errflag);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
@ -5161,8 +5160,7 @@ bool ha_partition::get_error_message(int error, String *buf)
|
|||
DBUG_ENTER("ha_partition::get_error_message");
|
||||
|
||||
/* Should probably look for my own errors first */
|
||||
/* monty: needs to be called for the last used partition ! */
|
||||
DBUG_RETURN(m_file[0]->get_error_message(error, buf));
|
||||
DBUG_RETURN(m_file[m_last_part]->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->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;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBUG_ASSERT(part_info->default_engine_type == default_db_type);
|
||||
}
|
||||
DBUG_ASSERT(part_info->default_engine_type == default_db_type);
|
||||
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));
|
||||
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-= no_parts_reorged;
|
||||
if (check_total_partitions > MAX_PARTITIONS)
|
||||
|
|
Loading…
Add table
Reference in a new issue