summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2016-11-08 17:24:42 +0100
committerSergei Golubchik <serg@mariadb.org>2016-12-12 20:35:50 +0100
commit2a0f7a34d6ab31aa23522a78ea9fefdf871ea63a (patch)
tree6e718d2365b1e12d8a48b9418ed9b8ef16549227
parentd1f3763323ff597e702f36e75633392dd52b60c1 (diff)
downloadmariadb-git-2a0f7a34d6ab31aa23522a78ea9fefdf871ea63a.tar.gz
bugfix: non-deterministic vcols in partitioning
-rw-r--r--mysql-test/suite/vcol/inc/vcol_partition.inc11
-rw-r--r--mysql-test/suite/vcol/r/vcol_partition_innodb.result6
-rw-r--r--mysql-test/suite/vcol/r/vcol_partition_myisam.result6
-rw-r--r--sql/item.cc8
-rw-r--r--sql/item.h1
-rw-r--r--sql/table.cc2
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);