Commit 279b8721 authored by unknown's avatar unknown

BUG#18198: Too much expressiveness in partition functions allowed

First step


sql/item.h:
  Add function to check for partition function whether allowed or not.
  In this first step allow only a field on its own.
  Further steps will add a lot more possibilities.
sql/partition_info.cc:
  Add a check whether the partition function is allowed by walking the
  partition function expression.
sql/share/errmsg.txt:
  Add a new error code for partition function not allowed
parent d15b31bf
...@@ -744,6 +744,11 @@ class Item { ...@@ -744,6 +744,11 @@ class Item {
virtual bool find_item_in_field_list_processor(byte *arg) { return 0; } virtual bool find_item_in_field_list_processor(byte *arg) { return 0; }
virtual bool change_context_processor(byte *context) { return 0; } virtual bool change_context_processor(byte *context) { return 0; }
virtual bool reset_query_id_processor(byte *query_id) { return 0; } virtual bool reset_query_id_processor(byte *query_id) { return 0; }
virtual bool check_partition_func_processor(byte *bool_arg)
{
*(bool *)bool_arg= FALSE;
return 0;
}
virtual Item *equal_fields_propagator(byte * arg) { return this; } virtual Item *equal_fields_propagator(byte * arg) { return this; }
virtual Item *set_no_const_sub(byte *arg) { return this; } virtual Item *set_no_const_sub(byte *arg) { return this; }
...@@ -1202,6 +1207,7 @@ class Item_field :public Item_ident ...@@ -1202,6 +1207,7 @@ class Item_field :public Item_ident
result_field->query_id= field->query_id; result_field->query_id= field->query_id;
return 0; return 0;
} }
bool check_partition_func_processor(byte *bool_arg) { return 0; }
void cleanup(); void cleanup();
Item_equal *find_item_equal(COND_EQUAL *cond_equal); Item_equal *find_item_equal(COND_EQUAL *cond_equal);
Item *equal_fields_propagator(byte *arg); Item *equal_fields_propagator(byte *arg);
......
...@@ -655,8 +655,15 @@ bool partition_info::check_partition_info(handlerton **eng_type, ...@@ -655,8 +655,15 @@ bool partition_info::check_partition_info(handlerton **eng_type,
uint i, tot_partitions; uint i, tot_partitions;
bool result= TRUE; bool result= TRUE;
char *same_name; char *same_name;
bool part_expression_ok= TRUE;
DBUG_ENTER("partition_info::check_partition_info"); DBUG_ENTER("partition_info::check_partition_info");
if (part_expr->walk(Item::check_partition_func_processor,
(byte*)&part_expression_ok))
{
my_error(ER_PARTITION_FUNC_NOT_ALLOWED, MYF(0));
goto end;
}
if (unlikely(!is_sub_partitioned() && if (unlikely(!is_sub_partitioned() &&
!(use_default_subpartitions && use_default_no_subpartitions))) !(use_default_subpartitions && use_default_no_subpartitions)))
{ {
......
...@@ -5826,3 +5826,6 @@ ER_NDB_CANT_SWITCH_BINLOG_FORMAT ...@@ -5826,3 +5826,6 @@ ER_NDB_CANT_SWITCH_BINLOG_FORMAT
eng "The NDB cluster engine does not support changing the binlog format on the fly yet" eng "The NDB cluster engine does not support changing the binlog format on the fly yet"
ER_PARTITION_NO_TEMPORARY ER_PARTITION_NO_TEMPORARY
eng "Cannot create temporary table with partitions" eng "Cannot create temporary table with partitions"
ER_PARTITION_FUNCTION_NOT_ALLOWED
eng "This partition function is not allowed"
swe "Denna partitioneringsfunktion r inte tillten"
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment