BUG#17127: Crash if wrong use of VALUES for list partition
mysql-test/r/partition.result: Added a number of new test cases where errors in use of VALUES LESS THAN and VALUES IN is happening for ALTER TABLE mysql-test/t/partition.test: Added a number of new test cases where errors in use of VALUES LESS THAN and VALUES IN is happening for ALTER TABLE sql/sql_partition.cc: Check for errors with VALUES * sql/sql_yacc.yy: Add state to part_type when doing ALTER TABLE for partitioning
This commit is contained in:
parent
56df722382
commit
b7b8fd2569
@ -422,4 +422,28 @@ partition_name partition_description table_rows
|
||||
x123 11,12 1
|
||||
x234 NULL,1 1
|
||||
drop table t1;
|
||||
create table t1 (a int)
|
||||
partition by range (a)
|
||||
(partition p0 values less than (1));
|
||||
alter table t1 add partition (partition p1 values in (2));
|
||||
ERROR HY000: Only LIST PARTITIONING can use VALUES IN in partition definition
|
||||
alter table t1 add partition (partition p1);
|
||||
ERROR HY000: RANGE PARTITIONING requires definition of VALUES LESS THAN for each partition
|
||||
drop table t1;
|
||||
create table t1 (a int)
|
||||
partition by list (a)
|
||||
(partition p0 values in (1));
|
||||
alter table t1 add partition (partition p1 values less than (2));
|
||||
ERROR HY000: Only RANGE PARTITIONING can use VALUES LESS THAN in partition definition
|
||||
alter table t1 add partition (partition p1);
|
||||
ERROR HY000: LIST PARTITIONING requires definition of VALUES IN for each partition
|
||||
drop table t1;
|
||||
create table t1 (a int)
|
||||
partition by hash (a)
|
||||
(partition p0);
|
||||
alter table t1 add partition (partition p1 values less than (2));
|
||||
ERROR HY000: Only RANGE PARTITIONING can use VALUES LESS THAN in partition definition
|
||||
alter table t1 add partition (partition p1 values in (2));
|
||||
ERROR HY000: Only LIST PARTITIONING can use VALUES IN in partition definition
|
||||
drop table t1;
|
||||
End of 5.1 tests
|
||||
|
@ -540,4 +540,40 @@ select partition_name, partition_description, table_rows
|
||||
from information_schema.partitions where table_schema ='test';
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug 17127
|
||||
#
|
||||
create table t1 (a int)
|
||||
partition by range (a)
|
||||
(partition p0 values less than (1));
|
||||
|
||||
--error ER_PARTITION_WRONG_VALUES_ERROR
|
||||
alter table t1 add partition (partition p1 values in (2));
|
||||
--error ER_PARTITION_REQUIRES_VALUES_ERROR
|
||||
alter table t1 add partition (partition p1);
|
||||
|
||||
drop table t1;
|
||||
|
||||
create table t1 (a int)
|
||||
partition by list (a)
|
||||
(partition p0 values in (1));
|
||||
|
||||
--error ER_PARTITION_WRONG_VALUES_ERROR
|
||||
alter table t1 add partition (partition p1 values less than (2));
|
||||
--error ER_PARTITION_REQUIRES_VALUES_ERROR
|
||||
alter table t1 add partition (partition p1);
|
||||
|
||||
drop table t1;
|
||||
|
||||
create table t1 (a int)
|
||||
partition by hash (a)
|
||||
(partition p0);
|
||||
|
||||
--error ER_PARTITION_WRONG_VALUES_ERROR
|
||||
alter table t1 add partition (partition p1 values less than (2));
|
||||
--error ER_PARTITION_WRONG_VALUES_ERROR
|
||||
alter table t1 add partition (partition p1 values in (2));
|
||||
|
||||
drop table t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -4132,6 +4132,34 @@ uint prep_alter_part_table(THD *thd, TABLE *table, ALTER_INFO *alter_info,
|
||||
((flags & (HA_FAST_CHANGE_PARTITION | HA_PARTITION_ONE_PHASE)) != 0);
|
||||
DBUG_PRINT("info", ("*fast_alter_partition: %d flags: 0x%x",
|
||||
*fast_alter_partition, flags));
|
||||
if (((alter_info->flags & ALTER_ADD_PARTITION) ||
|
||||
(alter_info->flags & ALTER_REORGANIZE_PARTITION)) &&
|
||||
(thd->lex->part_info->part_type != tab_part_info->part_type))
|
||||
{
|
||||
if (thd->lex->part_info->part_type == RANGE_PARTITION)
|
||||
{
|
||||
my_error(ER_PARTITION_WRONG_VALUES_ERROR, MYF(0),
|
||||
"RANGE", "LESS THAN");
|
||||
}
|
||||
else if (thd->lex->part_info->part_type == LIST_PARTITION)
|
||||
{
|
||||
DBUG_ASSERT(thd->lex->part_info->part_type == LIST_PARTITION);
|
||||
my_error(ER_PARTITION_WRONG_VALUES_ERROR, MYF(0),
|
||||
"LIST", "IN");
|
||||
}
|
||||
else if (tab_part_info->part_type == RANGE_PARTITION)
|
||||
{
|
||||
my_error(ER_PARTITION_REQUIRES_VALUES_ERROR, MYF(0),
|
||||
"RANGE", "LESS THAN");
|
||||
}
|
||||
else
|
||||
{
|
||||
DBUG_ASSERT(tab_part_info->part_type == LIST_PARTITION);
|
||||
my_error(ER_PARTITION_REQUIRES_VALUES_ERROR, MYF(0),
|
||||
"LIST", "IN");
|
||||
}
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
if (alter_info->flags & ALTER_ADD_PARTITION)
|
||||
{
|
||||
/*
|
||||
|
@ -3734,6 +3734,8 @@ opt_part_values:
|
||||
YYABORT;
|
||||
}
|
||||
}
|
||||
else
|
||||
lex->part_info->part_type= HASH_PARTITION;
|
||||
}
|
||||
| VALUES LESS_SYM THAN_SYM part_func_max
|
||||
{
|
||||
@ -3747,6 +3749,8 @@ opt_part_values:
|
||||
YYABORT;
|
||||
}
|
||||
}
|
||||
else
|
||||
lex->part_info->part_type= RANGE_PARTITION;
|
||||
}
|
||||
| VALUES IN_SYM '(' part_list_func ')'
|
||||
{
|
||||
@ -3760,6 +3764,8 @@ opt_part_values:
|
||||
YYABORT;
|
||||
}
|
||||
}
|
||||
else
|
||||
lex->part_info->part_type= LIST_PARTITION;
|
||||
}
|
||||
;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user