Commit 3856cdb8 authored by unknown's avatar unknown

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
drop table if exists t1; drop table if exists t1;
create table t1 (a int) 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 engine = x
partition by key (a); partition by key (a);
Warnings: Warnings:
......
...@@ -8,6 +8,28 @@ ...@@ -8,6 +8,28 @@
drop table if exists t1; drop table if exists t1;
--enable_warnings --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 # Bug 20397: Partitions: Crash when using non-existing engine
# #
......
...@@ -3616,6 +3616,7 @@ part_bit_expr: ...@@ -3616,6 +3616,7 @@ part_bit_expr:
{ {
Item *part_expr= $1; Item *part_expr= $1;
bool not_corr_func; bool not_corr_func;
bool part_expression_ok= TRUE;
LEX *lex= Lex; LEX *lex= Lex;
THD *thd= YYTHD; THD *thd= YYTHD;
longlong item_value; longlong item_value;
...@@ -3633,13 +3634,19 @@ part_bit_expr: ...@@ -3633,13 +3634,19 @@ part_bit_expr:
mem_alloc_error(sizeof(part_elem_value)); mem_alloc_error(sizeof(part_elem_value));
YYABORT; 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) || if (part_expr->fix_fields(YYTHD, (Item**)0) ||
((context->table_list= save_list), FALSE) || ((context->table_list= save_list), FALSE) ||
(!part_expr->const_item()) || (!part_expr->const_item()) ||
(!lex->safe_to_cache_query)) (!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; YYABORT;
} }
thd->where= save_where; thd->where= save_where;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment