summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <mikael@dator5.(none)>2006-06-20 10:57:02 -0400
committerunknown <mikael@dator5.(none)>2006-06-20 10:57:02 -0400
commit3856cdb89b3753bb56e56b2a8629a2dd8d2d3deb (patch)
tree1a535343c095a264ddd53eb3dd6ed310de99d886
parent9f8c532f0c7d8472cb809be6f80bb596d38b336b (diff)
downloadmariadb-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.result17
-rw-r--r--mysql-test/t/partition_error.test22
-rw-r--r--sql/sql_yacc.yy11
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;