Commit b7b8fd25 authored by unknown's avatar unknown
Browse files

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
parent 56df7223
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -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
+36 −0
Original line number Diff line number Diff line
@@ -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
+28 −0
Original line number Diff line number Diff line
@@ -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)
    {
      /*
+6 −0
Original line number Diff line number Diff line
@@ -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;
        }
        ;