diff --git a/mysql-test/r/partition.result b/mysql-test/r/partition.result index d84d8e25ef1..a6b5ab8fe4f 100644 --- a/mysql-test/r/partition.result +++ b/mysql-test/r/partition.result @@ -423,6 +423,33 @@ x123 11,12 1 x234 NULL,1 1 drop table t1; create table t1 (a int) +(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; +create table t1 (a int) +partition by list (a) +(partition p0 values in (1)); +alter table t1 rebuild partition; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 partition by list (a) (partition p0 values in (1)); alter table t1 rebuild partition; diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test index 9ee2bbd36b3..39f3fe0c7f8 100644 --- a/mysql-test/t/partition.test +++ b/mysql-test/t/partition.test @@ -540,6 +540,42 @@ 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; + # # BUG 17947 Crash with REBUILD PARTITION # diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index a27e5b1979f..7790d7004d6 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -4135,6 +4135,35 @@ 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) && + (thd->lex->part_info->part_type != NOT_A_PARTITION)) + { + 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) { /* diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index a2e8f10d706..75c62cbea2e 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -3663,6 +3663,8 @@ opt_part_values: YYABORT; } } + else + lex->part_info->part_type= HASH_PARTITION; } | VALUES LESS_SYM THAN_SYM part_func_max { @@ -3676,6 +3678,8 @@ opt_part_values: YYABORT; } } + else + lex->part_info->part_type= RANGE_PARTITION; } | VALUES IN_SYM '(' part_list_func ')' { @@ -3689,6 +3693,8 @@ opt_part_values: YYABORT; } } + else + lex->part_info->part_type= LIST_PARTITION; } ;