BUG#20310212 PARTITION DDL- CRASH AFTER THD::NOCHECK_REGISTER_ITEM_
Problem : --------- Issue-1: The root cause for the issues is that (col1 > 1) is not a valid partition function and we should have thrown error at much early stage [partition_info::check_partition_info]. We are not checking sub-partition expression when partition expression is NULL. Issue-2: Potential issue for future if any partition function needs to change item tree during open/fix_fields. We should release changed items, if any, before doing closefrm when we open the partitioned table during creation in create_table_impl. Solution : ---------- 1.check_partition_info() - Check for sub-partition expression even if no partition expression. [partition by ... columns(...) subpartition by hash(<expr>)] 2.create_table_impl() - Assert that the change list is empty before doing closefrm for partitioned table. Currently no supported partition function seems to be changing item tree during open. Reviewed-by: Mattias Jonsson <mattias.jonsson@oracle.com> RB: 9345
This commit is contained in:
parent
1b1161a02b
commit
0eadadad25
@ -1089,7 +1089,7 @@ partition by key (a)
|
||||
subpartition by hash (sin(a+b))
|
||||
(partition x1 (subpartition x11, subpartition x12),
|
||||
partition x2 (subpartition x21, subpartition x22));
|
||||
ERROR HY000: It is only possible to mix RANGE/LIST partitioning with HASH/KEY partitioning for subpartitioning
|
||||
ERROR HY000: This partition function is not allowed
|
||||
select load_file('$MYSQLD_DATADIR/test/t1.par');
|
||||
load_file('$MYSQLD_DATADIR/test/t1.par')
|
||||
NULL
|
||||
|
@ -1145,7 +1145,7 @@ subpartition by hash (rand(a+b));
|
||||
#
|
||||
# Subpartition by hash, wrong subpartition function
|
||||
#
|
||||
--error ER_SUBPARTITION_ERROR
|
||||
--error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
|
||||
CREATE TABLE t1 (
|
||||
a int not null,
|
||||
b int not null,
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
/* Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -1109,15 +1109,22 @@ bool partition_info::check_partition_info(THD *thd, handlerton **eng_type,
|
||||
{
|
||||
int err= 0;
|
||||
|
||||
/* Check for partition expression. */
|
||||
if (!list_of_part_fields)
|
||||
{
|
||||
DBUG_ASSERT(part_expr);
|
||||
err= part_expr->walk(&Item::check_partition_func_processor, 0,
|
||||
NULL);
|
||||
if (!err && is_sub_partitioned() && !list_of_subpart_fields)
|
||||
err= subpart_expr->walk(&Item::check_partition_func_processor, 0,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/* Check for sub partition expression. */
|
||||
if (!err && is_sub_partitioned() && !list_of_subpart_fields)
|
||||
{
|
||||
DBUG_ASSERT(subpart_expr);
|
||||
err= subpart_expr->walk(&Item::check_partition_func_processor, 0,
|
||||
NULL);
|
||||
}
|
||||
|
||||
if (err)
|
||||
{
|
||||
my_error(ER_PARTITION_FUNCTION_IS_NOT_ALLOWED, MYF(0));
|
||||
|
@ -3913,6 +3913,12 @@ static bool check_if_created_table_can_be_opened(THD *thd,
|
||||
result= (open_table_def(thd, &share, 0) ||
|
||||
open_table_from_share(thd, &share, "", 0, (uint) READ_ALL,
|
||||
0, &table, TRUE));
|
||||
/*
|
||||
Assert that the change list is empty as no partition function currently
|
||||
needs to modify item tree. May need call THD::rollback_item_tree_changes
|
||||
later before calling closefrm if the change list is not empty.
|
||||
*/
|
||||
DBUG_ASSERT(thd->change_list.is_empty());
|
||||
if (! result)
|
||||
(void) closefrm(&table, 0);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user