diff options
author | unknown <mikael@c-4908e253.1238-1-64736c10.cust.bredbandsbolaget.se> | 2006-04-08 18:10:20 -0400 |
---|---|---|
committer | unknown <mikael@c-4908e253.1238-1-64736c10.cust.bredbandsbolaget.se> | 2006-04-08 18:10:20 -0400 |
commit | 09250cc6b74b6de006ec86606e4a345d0451fa92 (patch) | |
tree | a3a5f714b19c87e96162b32cb96fddd4be2481e1 /sql | |
parent | 781f2f1868b642eb4109fee2458518a8836cf1b1 (diff) | |
download | mariadb-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.h | 38 | ||||
-rw-r--r-- | sql/item_cmpfunc.h | 15 | ||||
-rw-r--r-- | sql/item_func.h | 32 | ||||
-rw-r--r-- | sql/item_strfunc.h | 24 | ||||
-rw-r--r-- | sql/item_timefunc.h | 30 | ||||
-rw-r--r-- | sql/item_xmlfunc.h | 1 | ||||
-rw-r--r-- | sql/partition_info.cc | 10 | ||||
-rw-r--r-- | sql/share/errmsg.txt | 2 |
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" |