summaryrefslogtreecommitdiff
path: root/sql/partition_info.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/partition_info.cc')
-rw-r--r--sql/partition_info.cc30
1 files changed, 22 insertions, 8 deletions
diff --git a/sql/partition_info.cc b/sql/partition_info.cc
index 475ecef88d2..e5f8cd7ffac 100644
--- a/sql/partition_info.cc
+++ b/sql/partition_info.cc
@@ -21,9 +21,10 @@
#endif
#include "mysql_priv.h"
-#include "ha_partition.h"
#ifdef WITH_PARTITION_STORAGE_ENGINE
+#include "ha_partition.h"
+
partition_info *partition_info::get_clone()
{
@@ -431,18 +432,22 @@ char *partition_info::has_unique_names()
bool partition_info::check_engine_mix(handlerton **engine_array, uint no_parts)
{
uint i= 0;
- bool result= FALSE;
DBUG_ENTER("partition_info::check_engine_mix");
do
{
if (engine_array[i] != engine_array[0])
{
- result= TRUE;
- break;
+ my_error(ER_MIX_HANDLER_ERROR, MYF(0));
+ DBUG_RETURN(TRUE);
}
} while (++i < no_parts);
- DBUG_RETURN(result);
+ if (engine_array[0] == &myisammrg_hton)
+ {
+ my_error(ER_PARTITION_MERGE_ERROR, MYF(0));
+ DBUG_RETURN(TRUE);
+ }
+ DBUG_RETURN(FALSE);
}
@@ -680,8 +685,20 @@ bool partition_info::check_partition_info(handlerton **eng_type,
uint i, tot_partitions;
bool result= TRUE;
char *same_name;
+ bool part_expression_ok= TRUE;
DBUG_ENTER("partition_info::check_partition_info");
+ if (part_type != HASH_PARTITION || !list_of_part_fields)
+ part_expr->walk(&Item::check_partition_func_processor,
+ (byte*)(&part_expression_ok));
+ if (is_sub_partitioned() && !list_of_subpart_fields)
+ subpart_expr->walk(&Item::check_partition_func_processor,
+ (byte*)(&part_expression_ok));
+ if (!part_expression_ok)
+ {
+ my_error(ER_PARTITION_FUNCTION_IS_NOT_ALLOWED, MYF(0));
+ goto end;
+ }
if (unlikely(!is_sub_partitioned() &&
!(use_default_subpartitions && use_default_no_subpartitions)))
{
@@ -756,10 +773,7 @@ bool partition_info::check_partition_info(handlerton **eng_type,
} while (++i < no_parts);
}
if (unlikely(partition_info::check_engine_mix(engine_array, part_count)))
- {
- my_error(ER_MIX_HANDLER_ERROR, MYF(0));
goto end;
- }
if (eng_type)
*eng_type= (handlerton*)engine_array[0];