diff options
author | Sergei Golubchik <serg@mariadb.org> | 2016-11-08 17:24:42 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2016-12-12 20:35:50 +0100 |
commit | 2a0f7a34d6ab31aa23522a78ea9fefdf871ea63a (patch) | |
tree | 6e718d2365b1e12d8a48b9418ed9b8ef16549227 | |
parent | d1f3763323ff597e702f36e75633392dd52b60c1 (diff) | |
download | mariadb-git-2a0f7a34d6ab31aa23522a78ea9fefdf871ea63a.tar.gz |
bugfix: non-deterministic vcols in partitioning
-rw-r--r-- | mysql-test/suite/vcol/inc/vcol_partition.inc | 11 | ||||
-rw-r--r-- | mysql-test/suite/vcol/r/vcol_partition_innodb.result | 6 | ||||
-rw-r--r-- | mysql-test/suite/vcol/r/vcol_partition_myisam.result | 6 | ||||
-rw-r--r-- | sql/item.cc | 8 | ||||
-rw-r--r-- | sql/item.h | 1 | ||||
-rw-r--r-- | sql/table.cc | 2 |
6 files changed, 34 insertions, 0 deletions
diff --git a/mysql-test/suite/vcol/inc/vcol_partition.inc b/mysql-test/suite/vcol/inc/vcol_partition.inc index b2c0c90ff69..8a667b6e149 100644 --- a/mysql-test/suite/vcol/inc/vcol_partition.inc +++ b/mysql-test/suite/vcol/inc/vcol_partition.inc @@ -126,3 +126,14 @@ select * from t1; select partition_name,table_rows,data_length from information_schema.partitions where table_name = 't1'; drop table t1; + +# +# Restrictions when partitioned +# + +--error ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR +create table t1 (a int, b datetime as (now())) partition by hash(b+1) partitions 3; +--error ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR +create table t1 (a int, b varchar(100) as (user())) partition by hash(b+1) partitions 3; +--error ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR +create table t1 (a int, b double as (rand())) partition by hash(b+1) partitions 3; diff --git a/mysql-test/suite/vcol/r/vcol_partition_innodb.result b/mysql-test/suite/vcol/r/vcol_partition_innodb.result index 6a7978a8bf4..4c869a0a37d 100644 --- a/mysql-test/suite/vcol/r/vcol_partition_innodb.result +++ b/mysql-test/suite/vcol/r/vcol_partition_innodb.result @@ -81,3 +81,9 @@ p0 1 16384 p1 1 16384 p2 0 16384 drop table t1; +create table t1 (a int, b datetime as (now())) partition by hash(b+1) partitions 3; +ERROR HY000: Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed +create table t1 (a int, b varchar(100) as (user())) partition by hash(b+1) partitions 3; +ERROR HY000: Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed +create table t1 (a int, b double as (rand())) partition by hash(b+1) partitions 3; +ERROR HY000: Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed diff --git a/mysql-test/suite/vcol/r/vcol_partition_myisam.result b/mysql-test/suite/vcol/r/vcol_partition_myisam.result index cb6f7fe1eca..aeeaec2ac22 100644 --- a/mysql-test/suite/vcol/r/vcol_partition_myisam.result +++ b/mysql-test/suite/vcol/r/vcol_partition_myisam.result @@ -81,3 +81,9 @@ p0 1 7 p1 1 7 p2 0 0 drop table t1; +create table t1 (a int, b datetime as (now())) partition by hash(b+1) partitions 3; +ERROR HY000: Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed +create table t1 (a int, b varchar(100) as (user())) partition by hash(b+1) partitions 3; +ERROR HY000: Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed +create table t1 (a int, b double as (rand())) partition by hash(b+1) partitions 3; +ERROR HY000: Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed diff --git a/sql/item.cc b/sql/item.cc index f8f776a2b28..9d244954b85 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -5576,6 +5576,14 @@ bool Item_field::vcol_in_partition_func_processor(void *int_arg) return FALSE; } +bool Item_field::check_valid_arguments_processor(void *bool_arg) +{ + Virtual_column_info *vcol= field->vcol_info; + if (!vcol) + return FALSE; + return vcol->expr->walk(&Item::check_partition_func_processor, 0, NULL) + || vcol->expr->walk(&Item::check_valid_arguments_processor, 0, NULL); +} void Item_field::cleanup() { diff --git a/sql/item.h b/sql/item.h index 9b7f43edb1b..313cec8173d 100644 --- a/sql/item.h +++ b/sql/item.h @@ -2576,6 +2576,7 @@ public: bool register_field_in_bitmap(void *arg); bool check_partition_func_processor(void *int_arg) {return FALSE;} bool vcol_in_partition_func_processor(void *bool_arg); + bool check_valid_arguments_processor(void *bool_arg); bool check_field_expression_processor(void *arg); bool enumerate_field_refs_processor(void *arg); bool update_table_bitmaps_processor(void *arg); diff --git a/sql/table.cc b/sql/table.cc index 84e61ade53b..1496d1b8c46 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -3339,6 +3339,8 @@ partititon_err: outparam->file= 0; // For easier error checking outparam->db_stat=0; thd->lex->context_analysis_only= save_context_analysis_only; + if (outparam->expr_arena) + outparam->expr_arena->free_items(); free_root(&outparam->mem_root, MYF(0)); // Safe to call on bzero'd root outparam->alias.free(); DBUG_RETURN (error); |