summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <mikael@c-4908e253.1238-1-64736c10.cust.bredbandsbolaget.se>2006-04-08 18:10:20 -0400
committerunknown <mikael@c-4908e253.1238-1-64736c10.cust.bredbandsbolaget.se>2006-04-08 18:10:20 -0400
commit09250cc6b74b6de006ec86606e4a345d0451fa92 (patch)
treea3a5f714b19c87e96162b32cb96fddd4be2481e1 /sql
parent781f2f1868b642eb4109fee2458518a8836cf1b1 (diff)
downloadmariadb-git-09250cc6b74b6de006ec86606e4a345d0451fa92.tar.gz
BUG#18198: Errors due to too much allowed in partition functions
Added functions to enable/disable allowed/disallowed partition functions sql/item.h: Added functions to enable/disable allowed/disallowed partition functions sql/item_cmpfunc.h: Added functions to enable/disable allowed/disallowed partition functions sql/item_func.h: Added functions to enable/disable allowed/disallowed partition functions sql/item_strfunc.h: Added functions to enable/disable allowed/disallowed partition functions sql/item_timefunc.h: Added functions to enable/disable allowed/disallowed partition functions sql/item_xmlfunc.h: Added functions to enable/disable allowed/disallowed partition functions sql/partition_info.cc: Added functions to enable/disable allowed/disallowed partition functions sql/share/errmsg.txt: Added new error message
Diffstat (limited to 'sql')
-rw-r--r--sql/item.h38
-rw-r--r--sql/item_cmpfunc.h15
-rw-r--r--sql/item_func.h32
-rw-r--r--sql/item_strfunc.h24
-rw-r--r--sql/item_timefunc.h30
-rw-r--r--sql/item_xmlfunc.h1
-rw-r--r--sql/partition_info.cc10
-rw-r--r--sql/share/errmsg.txt2
8 files changed, 141 insertions, 11 deletions
diff --git a/sql/item.h b/sql/item.h
index 9c979eb4acd..d5cddaa7177 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -744,11 +744,22 @@ public:
virtual bool find_item_in_field_list_processor(byte *arg) { return 0; }
virtual bool change_context_processor(byte *context) { return 0; }
virtual bool reset_query_id_processor(byte *query_id) { return 0; }
+ /*
+ check_partition_func_processor is used to check if a partition function
+ uses an allowed function. The default is that an item is not allowed
+ in a partition function. However all mathematical functions, string
+ manipulation functions, date functions are allowed. Allowed functions
+ can never depend on server version, they cannot depend on anything
+ related to the environment. They can also only depend on a set of
+ fields in the table itself. They cannot depend on other tables and
+ cannot contain any queries and cannot contain udf's or similar.
+ If a new Item class is defined and it inherits from a class that is
+ allowed in a partition function then it is very important to consider
+ whether this should be inherited to the new class. If not the function
+ below should be defined in the new Item class.
+ */
virtual bool check_partition_func_processor(byte *bool_arg)
- {
- *(bool *)bool_arg= FALSE;
- return 0;
- }
+ { *(bool *)bool_arg= FALSE; return 0; }
virtual Item *equal_fields_propagator(byte * arg) { return this; }
virtual Item *set_no_const_sub(byte *arg) { return this; }
@@ -1020,6 +1031,7 @@ public:
Item::maybe_null= TRUE;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0; }
bool fix_fields(THD *, Item **);
enum Type type() const;
@@ -1066,6 +1078,7 @@ public:
Item_num() {} /* Remove gcc warning */
virtual Item_num *neg()= 0;
Item *safe_charset_converter(CHARSET_INFO *tocs);
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
#define NO_CACHED_FIELD_INDEX ((uint)(-1))
@@ -1251,6 +1264,7 @@ public:
bool is_null() { return 1; }
void print(String *str) { str->append(STRING_WITH_LEN("NULL")); }
Item *safe_charset_converter(CHARSET_INFO *tocs);
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_null_result :public Item_null
@@ -1263,6 +1277,8 @@ public:
{
save_in_field(result_field, no_conversions);
}
+ virtual bool check_partition_func_processor(byte *bool_arg)
+ { *(bool *)bool_arg= FALSE; return 0; }
};
/* Item represents one placeholder ('?') of prepared statement */
@@ -1446,6 +1462,8 @@ public:
{}
Item *safe_charset_converter(CHARSET_INFO *tocs);
void print(String *str) { str->append(func_name); }
+ virtual bool check_partition_func_processor(byte *bool_arg)
+ { *(bool *)bool_arg= FALSE; return 0; }
};
@@ -1564,6 +1582,8 @@ public:
{}
void print(String *str) { str->append(func_name); }
Item *safe_charset_converter(CHARSET_INFO *tocs);
+ virtual bool check_partition_func_processor(byte *bool_arg)
+ { *(bool *)bool_arg= FALSE; return 0; }
};
@@ -1641,6 +1661,7 @@ public:
void print(String *str);
// to prevent drop fixed flag (no need parent cleanup call)
void cleanup() {}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -1655,6 +1676,8 @@ public:
{}
Item *safe_charset_converter(CHARSET_INFO *tocs);
void print(String *str) { str->append(func_name); }
+ virtual bool check_partition_func_processor(byte *bool_arg)
+ { *(bool *)bool_arg= FALSE; return 0; }
};
@@ -1667,6 +1690,8 @@ public:
&my_charset_bin)
{ max_length=19;}
enum_field_types field_type() const { return MYSQL_TYPE_DATETIME; }
+ virtual bool check_partition_func_processor(byte *bool_arg)
+ { *(bool *)bool_arg= FALSE; return 0; }
};
class Item_empty_string :public Item_string
@@ -1689,6 +1714,8 @@ public:
unsigned_flag=1;
}
enum_field_types field_type() const { return int_field_type; }
+ virtual bool check_partition_func_processor(byte *bool_arg)
+ { *(bool *)bool_arg= FALSE; return 0; }
};
@@ -1712,6 +1739,7 @@ public:
void cleanup() {}
bool eq(const Item *item, bool binary_cmp) const;
virtual Item *safe_charset_converter(CHARSET_INFO *tocs);
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -1949,6 +1977,8 @@ public:
}
Item *new_item();
virtual Item *real_item() { return ref; }
+ virtual bool check_partition_func_processor(byte *bool_arg)
+ { *(bool *)bool_arg= FALSE; return 0; }
};
#ifdef MYSQL_SERVER
diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h
index 67f0a5f5e2e..0472fe17975 100644
--- a/sql/item_cmpfunc.h
+++ b/sql/item_cmpfunc.h
@@ -239,6 +239,7 @@ public:
}
Item *neg_transformer(THD *thd);
virtual Item *negated_item();
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_not :public Item_bool_func
@@ -249,6 +250,7 @@ public:
enum Functype functype() const { return NOT_FUNC; }
const char *func_name() const { return "not"; }
Item *neg_transformer(THD *thd);
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_maxmin_subselect;
@@ -463,6 +465,7 @@ public:
bool is_bool_func() { return 1; }
CHARSET_INFO *compare_collation() { return cmp_collation.collation; }
uint decimal_precision() const { return 1; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -474,6 +477,7 @@ public:
optimize_type select_optimize() const { return OPTIMIZE_NONE; }
const char *func_name() const { return "strcmp"; }
void print(String *str) { Item_func::print(str); }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -536,6 +540,7 @@ public:
const char *func_name() const { return "ifnull"; }
Field *tmp_table_field(TABLE *table);
uint decimal_precision() const;
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -576,6 +581,7 @@ public:
void print(String *str) { Item_func::print(str); }
table_map not_null_tables() const { return 0; }
bool is_null();
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -618,6 +624,7 @@ public:
void print(String *str);
Item *find_item(String *str);
CHARSET_INFO *compare_collation() { return cmp_collation.collation; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -897,6 +904,7 @@ class Item_func_in :public Item_func_opt_neg
bool nulls_in_row();
bool is_bool_func() { return 1; }
CHARSET_INFO *compare_collation() { return cmp_collation.collation; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
/* Functions used by where clause */
@@ -938,6 +946,7 @@ public:
optimize_type select_optimize() const { return OPTIMIZE_NULL; }
Item *neg_transformer(THD *thd);
CHARSET_INFO *compare_collation() { return args[0]->collation.collation; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
/* Functions used by HAVING for rewriting IN subquery */
@@ -959,6 +968,8 @@ public:
*/
table_map used_tables() const
{ return used_tables_cache | RAND_TABLE_BIT; }
+ virtual bool check_partition_func_processor(byte *bool_arg)
+ { *(bool *)bool_arg= FALSE; return 0; }
};
@@ -981,6 +992,7 @@ public:
void print(String *str);
CHARSET_INFO *compare_collation() { return args[0]->collation.collation; }
void top_level_item() { abort_on_null=1; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -1019,6 +1031,7 @@ public:
const char *func_name() const { return "like"; }
bool fix_fields(THD *thd, Item **ref);
void cleanup();
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
#ifdef USE_REGEX
@@ -1041,6 +1054,7 @@ public:
const char *func_name() const { return "regexp"; }
void print(String *str) { print_op(str); }
CHARSET_INFO *compare_collation() { return cmp_collation.collation; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
#else
@@ -1097,6 +1111,7 @@ public:
Item *transform(Item_transformer transformer, byte *arg);
void traverse_cond(Cond_traverser, void *arg, traverse_order order);
void neg_arguments(THD *thd);
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
diff --git a/sql/item_func.h b/sql/item_func.h
index ccbbbab1df4..58ac28aeb9d 100644
--- a/sql/item_func.h
+++ b/sql/item_func.h
@@ -247,6 +247,7 @@ public:
void fix_num_length_and_dec();
void find_num_type();
String *str_op(String *str) { DBUG_ASSERT(0); return 0; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -259,6 +260,7 @@ class Item_num_op :public Item_func_numhybrid
void print(String *str) { print_op(str); }
void find_num_type();
String *str_op(String *str) { DBUG_ASSERT(0); return 0; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -296,7 +298,7 @@ public:
{ max_length=args[0]->max_length; unsigned_flag=0; }
void print(String *str);
uint decimal_precision() const { return args[0]->decimal_precision(); }
-
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -330,6 +332,7 @@ public:
void fix_length_and_dec() {};
const char *func_name() const { return "decimal_typecast"; }
void print(String *);
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -398,6 +401,7 @@ public:
const char *func_name() const { return "DIV"; }
void fix_length_and_dec();
void print(String *str) { print_op(str); }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -470,6 +474,7 @@ public:
Item_func_exp(Item *a) :Item_dec_func(a) {}
double val_real();
const char *func_name() const { return "exp"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -479,6 +484,7 @@ public:
Item_func_ln(Item *a) :Item_dec_func(a) {}
double val_real();
const char *func_name() const { return "ln"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -489,6 +495,7 @@ public:
Item_func_log(Item *a,Item *b) :Item_dec_func(a,b) {}
double val_real();
const char *func_name() const { return "log"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -498,6 +505,7 @@ public:
Item_func_log2(Item *a) :Item_dec_func(a) {}
double val_real();
const char *func_name() const { return "log2"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -507,6 +515,7 @@ public:
Item_func_log10(Item *a) :Item_dec_func(a) {}
double val_real();
const char *func_name() const { return "log10"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -516,6 +525,7 @@ public:
Item_func_sqrt(Item *a) :Item_dec_func(a) {}
double val_real();
const char *func_name() const { return "sqrt"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -525,6 +535,7 @@ public:
Item_func_pow(Item *a,Item *b) :Item_dec_func(a,b) {}
double val_real();
const char *func_name() const { return "pow"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -534,6 +545,7 @@ public:
Item_func_acos(Item *a) :Item_dec_func(a) {}
double val_real();
const char *func_name() const { return "acos"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_asin :public Item_dec_func
@@ -542,6 +554,7 @@ public:
Item_func_asin(Item *a) :Item_dec_func(a) {}
double val_real();
const char *func_name() const { return "asin"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_atan :public Item_dec_func
@@ -551,6 +564,7 @@ public:
Item_func_atan(Item *a,Item *b) :Item_dec_func(a,b) {}
double val_real();
const char *func_name() const { return "atan"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_cos :public Item_dec_func
@@ -559,6 +573,7 @@ public:
Item_func_cos(Item *a) :Item_dec_func(a) {}
double val_real();
const char *func_name() const { return "cos"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_sin :public Item_dec_func
@@ -567,6 +582,7 @@ public:
Item_func_sin(Item *a) :Item_dec_func(a) {}
double val_real();
const char *func_name() const { return "sin"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_tan :public Item_dec_func
@@ -575,6 +591,7 @@ public:
Item_func_tan(Item *a) :Item_dec_func(a) {}
double val_real();
const char *func_name() const { return "tan"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_integer :public Item_int_func
@@ -651,6 +668,7 @@ public:
Item_func_sign(Item *a) :Item_int_func(a) {}
const char *func_name() const { return "sign"; }
longlong val_int();
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -665,6 +683,7 @@ public:
const char *func_name() const { return name; }
void fix_length_and_dec()
{ decimals= NOT_FIXED_DEC; max_length= float_length(decimals); }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -682,6 +701,7 @@ public:
my_decimal *val_decimal(my_decimal *);
void fix_length_and_dec();
enum Item_result result_type () const { return cmp_type; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_min :public Item_func_min_max
@@ -707,6 +727,7 @@ public:
longlong val_int();
const char *func_name() const { return "length"; }
void fix_length_and_dec() { max_length=10; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_bit_length :public Item_func_length
@@ -726,6 +747,7 @@ public:
longlong val_int();
const char *func_name() const { return "char_length"; }
void fix_length_and_dec() { max_length=10; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_coercibility :public Item_int_func
@@ -736,6 +758,7 @@ public:
const char *func_name() const { return "coercibility"; }
void fix_length_and_dec() { max_length=10; maybe_null= 0; }
table_map not_null_tables() const { return 0; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_locate :public Item_int_func
@@ -749,6 +772,7 @@ public:
longlong val_int();
void fix_length_and_dec();
void print(String *str);
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -773,6 +797,7 @@ public:
longlong val_int();
const char *func_name() const { return "ascii"; }
void fix_length_and_dec() { max_length=3; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_ord :public Item_int_func
@@ -782,6 +807,7 @@ public:
Item_func_ord(Item *a) :Item_int_func(a) {}
longlong val_int();
const char *func_name() const { return "ord"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_find_in_set :public Item_int_func
@@ -795,6 +821,7 @@ public:
longlong val_int();
const char *func_name() const { return "find_in_set"; }
void fix_length_and_dec();
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
/* Base class for all bit functions: '~', '|', '^', '&', '>>', '<<' */
@@ -806,6 +833,7 @@ public:
Item_func_bit(Item *a) :Item_int_func(a) {}
void fix_length_and_dec() { unsigned_flag= 1; }
void print(String *str) { print_op(str); }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_bit_or :public Item_func_bit
@@ -831,6 +859,7 @@ public:
longlong val_int();
const char *func_name() const { return "bit_count"; }
void fix_length_and_dec() { max_length=2; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_shift_left :public Item_func_bit
@@ -1257,6 +1286,7 @@ public:
longlong val_int();
const char *func_name() const { return "inet_aton"; }
void fix_length_and_dec() { decimals = 0; max_length = 21; maybe_null=1;}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h
index 6a95a9e5d1f..5e4fe49e281 100644
--- a/sql/item_strfunc.h
+++ b/sql/item_strfunc.h
@@ -46,6 +46,7 @@ public:
String *val_str(String *);
void fix_length_and_dec();
const char *func_name() const { return "md5"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -56,6 +57,7 @@ public:
String *val_str(String *);
void fix_length_and_dec();
const char *func_name() const { return "sha"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_aes_encrypt :public Item_str_func
@@ -86,6 +88,7 @@ public:
String *val_str(String *);
void fix_length_and_dec();
const char *func_name() const { return "concat"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_concat_ws :public Item_str_func
@@ -106,6 +109,7 @@ public:
String *val_str(String *);
void fix_length_and_dec();
const char *func_name() const { return "reverse"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -143,6 +147,7 @@ protected:
public:
Item_str_conv(Item *item) :Item_str_func(item) {}
String *val_str(String *);
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -206,6 +211,7 @@ public:
String *val_str(String *);
void fix_length_and_dec();
const char *func_name() const { return "substr"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -217,6 +223,7 @@ public:
String *val_str(String *);
void fix_length_and_dec();
const char *func_name() const { return "substring_index"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -231,6 +238,7 @@ public:
String *val_str(String *);
void fix_length_and_dec();
const char *func_name() const { return "trim"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -410,6 +418,7 @@ public:
String *val_str(String *);
void fix_length_and_dec();
const char *func_name() const { return "soundex"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -517,6 +526,7 @@ public:
String *val_str(String *);
void fix_length_and_dec();
const char *func_name() const { return "rpad"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -529,6 +539,7 @@ public:
String *val_str(String *);
void fix_length_and_dec();
const char *func_name() const { return "lpad"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -543,6 +554,7 @@ public:
collation.set(default_charset());
decimals=0; max_length=64;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -559,6 +571,7 @@ public:
decimals=0;
max_length=args[0]->max_length*2*collation.collation->mbmaxlen;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_unhex :public Item_str_func
@@ -574,6 +587,7 @@ public:
decimals=0;
max_length=(1+args[0]->max_length)/2;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -597,6 +611,7 @@ public:
}
void print(String *str);
const char *func_name() const { return "cast_as_binary"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -636,6 +651,7 @@ public:
String* val_str(String* str);
const char *func_name() const { return "inet_ntoa"; }
void fix_length_and_dec() { decimals = 0; max_length=3*8+7; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_quote :public Item_str_func
@@ -650,6 +666,7 @@ public:
collation.set(args[0]->collation);
max_length= args[0]->max_length * 2 + 2;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_conv_charset :public Item_str_func
@@ -692,6 +709,7 @@ public:
void fix_length_and_dec();
const char *func_name() const { return "convert"; }
void print(String *str);
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_set_collation :public Item_str_func
@@ -724,6 +742,7 @@ public:
maybe_null= 0;
};
table_map not_null_tables() const { return 0; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_collation :public Item_str_func
@@ -739,6 +758,7 @@ public:
maybe_null= 0;
};
table_map not_null_tables() const { return 0; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_crc32 :public Item_int_func
@@ -749,6 +769,7 @@ public:
const char *func_name() const { return "crc32"; }
void fix_length_and_dec() { max_length=10; }
longlong val_int();
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_uncompressed_length : public Item_int_func
@@ -759,6 +780,7 @@ public:
const char *func_name() const{return "uncompressed_length";}
void fix_length_and_dec() { max_length=10; }
longlong val_int();
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
#ifdef HAVE_COMPRESS
@@ -775,6 +797,7 @@ public:
void fix_length_and_dec(){max_length= (args[0]->max_length*120)/100+12;}
const char *func_name() const{return "compress";}
String *val_str(String *) ZLIB_DEPENDED_FUNCTION
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_uncompress: public Item_str_func
@@ -785,6 +808,7 @@ public:
void fix_length_and_dec(){max_length= MAX_BLOB_WIDTH;}
const char *func_name() const{return "uncompress";}
String *val_str(String *) ZLIB_DEPENDED_FUNCTION
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
#define UUID_LENGTH (8+1+4+1+4+1+4+1+12)
diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h
index fd2f3945fca..ffe049873fc 100644
--- a/sql/item_timefunc.h
+++ b/sql/item_timefunc.h
@@ -39,6 +39,7 @@ public:
{
max_length=6*MY_CHARSET_BIN_MB_MAXLEN;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -53,6 +54,7 @@ public:
decimals=0;
max_length=6*MY_CHARSET_BIN_MB_MAXLEN;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -69,6 +71,7 @@ public:
maybe_null=1;
}
enum_monotonicity_info get_monotonicity_info() const;
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -84,6 +87,7 @@ public:
max_length=2*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -108,6 +112,7 @@ public:
max_length=2*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -140,6 +145,7 @@ public:
max_length=3*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -155,6 +161,7 @@ public:
max_length=2*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -170,6 +177,7 @@ public:
max_length=2*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -185,6 +193,7 @@ public:
max_length=1*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -200,6 +209,7 @@ public:
max_length=2*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -215,6 +225,7 @@ public:
max_length=2*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_yearweek :public Item_int_func
@@ -229,6 +240,7 @@ public:
max_length=6*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -245,6 +257,7 @@ public:
max_length=4*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -274,6 +287,7 @@ public:
max_length=1*MY_CHARSET_BIN_MB_MAXLEN;
maybe_null=1;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_dayname :public Item_func_weekday
@@ -306,6 +320,7 @@ public:
decimals=0;
max_length=10*MY_CHARSET_BIN_MB_MAXLEN;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -320,6 +335,7 @@ public:
decimals=0;
max_length=10*MY_CHARSET_BIN_MB_MAXLEN;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -526,6 +542,7 @@ public:
Item_func_from_days(Item *a) :Item_date(a) {}
const char *func_name() const { return "from_days"; }
bool get_date(TIME *res, uint fuzzy_date);
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -543,6 +560,7 @@ public:
void fix_length_and_dec();
uint format_length(const String *format);
bool eq(const Item *item, bool binary_cmp) const;
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -561,6 +579,7 @@ class Item_func_from_unixtime :public Item_date_func
const char *func_name() const { return "from_unixtime"; }
void fix_length_and_dec();
bool get_date(TIME *res, uint fuzzy_date);
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -627,6 +646,7 @@ public:
{
return tmp_table_field_from_field_type(table, 0);
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -648,6 +668,7 @@ public:
longlong val_int();
bool get_date(TIME *res, uint fuzzy_date);
void print(String *str);
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -665,6 +686,7 @@ class Item_extract :public Item_int_func
void fix_length_and_dec();
bool eq(const Item *item, bool binary_cmp) const;
void print(String *str);
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -701,6 +723,7 @@ public:
max_length=args[0]->max_length;
maybe_null= 1;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -720,6 +743,7 @@ public:
String *val_str(String *a);
void fix_length_and_dec();
void print(String *str);
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -791,6 +815,7 @@ public:
{
return tmp_table_field_from_field_type(table, 0);
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -813,6 +838,7 @@ public:
}
void print(String *str);
const char *func_name() const { return "add_time"; }
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_timediff :public Item_str_func
@@ -852,6 +878,7 @@ public:
{
return tmp_table_field_from_field_type(table, 0);
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
class Item_func_microsecond :public Item_int_func
@@ -865,6 +892,7 @@ public:
decimals=0;
maybe_null=1;
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -882,6 +910,7 @@ public:
maybe_null=1;
}
void print(String *str);
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
@@ -928,6 +957,7 @@ public:
{
return tmp_table_field_from_field_type(table, 1);
}
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
diff --git a/sql/item_xmlfunc.h b/sql/item_xmlfunc.h
index bc47e9c5bb1..53302283296 100644
--- a/sql/item_xmlfunc.h
+++ b/sql/item_xmlfunc.h
@@ -42,6 +42,7 @@ public:
Item_func_xml_extractvalue(Item *a,Item *b) :Item_xml_str_func(a,b) {}
const char *func_name() const { return "extractvalue"; }
String *val_str(String *);
+ virtual bool check_partition_func_processor(byte *bool_arg) { return 0;}
};
diff --git a/sql/partition_info.cc b/sql/partition_info.cc
index c671164578a..c957efa71fb 100644
--- a/sql/partition_info.cc
+++ b/sql/partition_info.cc
@@ -659,14 +659,14 @@ bool partition_info::check_partition_info(handlerton **eng_type,
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);
+ 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);
+ subpart_expr->walk(&Item::check_partition_func_processor,
+ (byte*)(&part_expression_ok));
if (!part_expression_ok)
{
- my_error(ER_PARTITION_FUNC_NOT_ALLOWED, MYF(0));
+ my_error(ER_PARTITION_FUNCTION_IS_NOT_ALLOWED, MYF(0));
goto end;
}
if (unlikely(!is_sub_partitioned() &&
diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt
index 01202bb5b71..da2e0f4e275 100644
--- a/sql/share/errmsg.txt
+++ b/sql/share/errmsg.txt
@@ -5826,6 +5826,6 @@ ER_NDB_CANT_SWITCH_BINLOG_FORMAT
eng "The NDB cluster engine does not support changing the binlog format on the fly yet"
ER_PARTITION_NO_TEMPORARY
eng "Cannot create temporary table with partitions"
-ER_PARTITION_FUNCTION_NOT_ALLOWED
+ER_PARTITION_FUNCTION_IS_NOT_ALLOWED
eng "This partition function is not allowed"
swe "Denna partitioneringsfunktion är inte tillåten"