diff options
author | unknown <mikael@dator5.(none)> | 2006-06-20 10:57:02 -0400 |
---|---|---|
committer | unknown <mikael@dator5.(none)> | 2006-06-20 10:57:02 -0400 |
commit | 3856cdb89b3753bb56e56b2a8629a2dd8d2d3deb (patch) | |
tree | 1a535343c095a264ddd53eb3dd6ed310de99d886 | |
parent | 9f8c532f0c7d8472cb809be6f80bb596d38b336b (diff) | |
download | mariadb-git-3856cdb89b3753bb56e56b2a8629a2dd8d2d3deb.tar.gz |
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
-rw-r--r-- | mysql-test/r/partition_error.result | 17 | ||||
-rw-r--r-- | mysql-test/t/partition_error.test | 22 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 11 |
3 files changed, 48 insertions, 2 deletions
diff --git a/mysql-test/r/partition_error.result b/mysql-test/r/partition_error.result index 39f0cf9ca55..38ea8e860a1 100644 --- a/mysql-test/r/partition_error.result +++ b/mysql-test/r/partition_error.result @@ -1,5 +1,22 @@ 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: diff --git a/mysql-test/t/partition_error.test b/mysql-test/t/partition_error.test index 076c5c5773b..d7f71c02571 100644 --- a/mysql-test/t/partition_error.test +++ b/mysql-test/t/partition_error.test @@ -9,6 +9,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 # create table t1 (a int) diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 32fdcfe45bd..9bf4b2df1fc 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -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; |