Commit 3856cdb8 authored by unknown's avatar unknown
Browse files

BUG#18198: Too flexible partition functions


mysql-test/r/partition_error.result:
  New test cases
mysql-test/t/partition_error.test:
  New test cases
sql/sql_yacc.yy:
  Verify that partition function is allowed before "fixing" it
parent 9f8c532f
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
drop table if exists t1;
create table t1 (a int)
partition by range (a)
(partition p0 values less than ((select count(*) from t1)));
ERROR HY000: This partition function is not allowed
create table t1 (a int)
partition by range (a)
(partition p0 values less than (a);
ERROR 42S22: Unknown column 'a' in 'partition function'
create table t1 (a int)
partition by range (a)
(partition p0 values less than (1));
alter table t1 add partition (partition p1 values less than (a));
ERROR 42S22: Unknown column 'a' in 'partition function'
alter table t1 add partition 
(partition p1 values less than ((select count(*) from t1)));
ERROR HY000: This partition function is not allowed
drop table t1;
create table t1 (a int)
engine = x
partition by key (a);
Warnings:
+22 −0
Original line number Diff line number Diff line
@@ -8,6 +8,28 @@
drop table if exists t1;
--enable_warnings

#
# Bug 18198: Partitions: Too flexible functions
#
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
create table t1 (a int)
partition by range (a)
(partition p0 values less than ((select count(*) from t1)));
-- error 1054
create table t1 (a int)
partition by range (a)
(partition p0 values less than (a);

create table t1 (a int)
partition by range (a)
(partition p0 values less than (1));
-- error 1054
alter table t1 add partition (partition p1 values less than (a));
-- error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
alter table t1 add partition 
(partition p1 values less than ((select count(*) from t1)));
drop table t1;

#
# Bug 20397: Partitions: Crash when using non-existing engine
#
+9 −2
Original line number Diff line number Diff line
@@ -3616,6 +3616,7 @@ part_bit_expr:
        {
          Item *part_expr= $1;
          bool not_corr_func;
          bool part_expression_ok= TRUE;
          LEX *lex= Lex;
          THD *thd= YYTHD;
          longlong item_value;
@@ -3633,13 +3634,19 @@ part_bit_expr:
            mem_alloc_error(sizeof(part_elem_value));
            YYABORT;
          }

          part_expr->walk(&Item::check_partition_func_processor, 0,
                          (byte*)(&part_expression_ok));
          if (!part_expression_ok)
          {
            my_error(ER_PARTITION_FUNCTION_IS_NOT_ALLOWED, MYF(0));
            YYABORT;
          }
          if (part_expr->fix_fields(YYTHD, (Item**)0) ||
              ((context->table_list= save_list), FALSE) ||
              (!part_expr->const_item()) ||
              (!lex->safe_to_cache_query))
          {
            yyerror(ER(ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR));
            my_error(ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR, MYF(0));
            YYABORT;
          }
          thd->where= save_where;