diff options
author | unknown <mikael/pappa@dator5.(none)> | 2006-07-21 10:23:32 -0400 |
---|---|---|
committer | unknown <mikael/pappa@dator5.(none)> | 2006-07-21 10:23:32 -0400 |
commit | 670b65739b507f1b89d05875ca675c4c5d994378 (patch) | |
tree | c8d1714d195c94380bced1bb36b53a9bb474844b | |
parent | f8a91e3140bace5fa36e9e27dab29f50df7e00e6 (diff) | |
download | mariadb-git-670b65739b507f1b89d05875ca675c4c5d994378.tar.gz |
BUG#18198: Partition function handling
Review fixes
sql/item.h:
Review fixes
sql/item_cmpfunc.h:
Review fixes
sql/item_func.h:
Review fixes
sql/item_strfunc.h:
Review fixes
sql/item_timefunc.h:
Review fixes
sql/item_xmlfunc.h:
Review fixes
sql/partition_info.cc:
Review fixes
sql/partition_info.h:
Review fixes
sql/sql_partition.cc:
Review fixes
sql/sql_yacc.yy:
Review fixes
-rw-r--r-- | sql/item.h | 46 | ||||
-rw-r--r-- | sql/item_cmpfunc.h | 37 | ||||
-rw-r--r-- | sql/item_func.h | 66 | ||||
-rw-r--r-- | sql/item_strfunc.h | 40 | ||||
-rw-r--r-- | sql/item_timefunc.h | 62 | ||||
-rw-r--r-- | sql/item_xmlfunc.h | 3 | ||||
-rw-r--r-- | sql/partition_info.cc | 13 | ||||
-rw-r--r-- | sql/partition_info.h | 6 | ||||
-rw-r--r-- | sql/sql_partition.cc | 29 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 2 |
10 files changed, 127 insertions, 177 deletions
diff --git a/sql/item.h b/sql/item.h index 7b93db6301a..4dd2ad2c13c 100644 --- a/sql/item.h +++ b/sql/item.h @@ -807,26 +807,10 @@ public: below should be defined in the new Item class. */ -#define PF_SAFE_BINARY_COLLATION 3 -#define PF_SAFE_SINGLE_CHAR_COLLATION 2 -#define PF_SAFE 1 -#define PF_UNSAFE 0 - bool safe_for_binary_collation(byte *int_arg) - { - if (*(int *)int_arg != PF_UNSAFE) - *(int*)int_arg= PF_SAFE_BINARY_COLLATION; - return 0; - } - bool safe_for_single_char_collation(byte *int_arg) - { - if (*(int*)int_arg == PF_SAFE) - *(int*)int_arg= PF_SAFE_SINGLE_CHAR_COLLATION; - return 0; - } virtual bool check_partition_func_processor(byte *int_arg) { - *(int *)int_arg= PF_UNSAFE; - return 0; + *(int *)int_arg= 0; + return FALSE; } virtual Item *equal_fields_propagator(byte * arg) { return this; } @@ -1126,8 +1110,7 @@ public: Item::maybe_null= TRUE; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg); } + bool check_partition_func_processor(byte *int_arg) { return FALSE; } bool fix_fields(THD *, Item **); enum Type type() const; @@ -1174,7 +1157,7 @@ public: Item_num() {} /* Remove gcc warning */ virtual Item_num *neg()= 0; Item *safe_charset_converter(CHARSET_INFO *tocs); - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; #define NO_CACHED_FIELD_INDEX ((uint)(-1)) @@ -1310,7 +1293,7 @@ public: bool collect_item_field_processor(byte * arg); bool find_item_in_field_list_processor(byte *arg); bool register_field_in_read_map(byte *arg); - bool check_partition_func_processor(byte *int_arg) { return 0; } + bool check_partition_func_processor(byte *int_arg) { return FALSE; } void cleanup(); bool result_as_longlong() { @@ -1358,7 +1341,7 @@ public: bool is_null() { return 1; } void print(String *str) { str->append(STRING_WITH_LEN("NULL")); } Item *safe_charset_converter(CHARSET_INFO *tocs); - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; class Item_null_result :public Item_null @@ -1372,7 +1355,7 @@ public: save_in_field(result_field, no_conversions); } bool check_partition_func_processor(byte *int_arg) - { *(int *)int_arg= PF_UNSAFE; return 0; } + { *(int *)int_arg= 0; return FALSE; } }; /* Item represents one placeholder ('?') of prepared statement */ @@ -1664,7 +1647,7 @@ public: void print(String *str) { str->append(func_name); } Item *safe_charset_converter(CHARSET_INFO *tocs); bool check_partition_func_processor(byte *int_arg) - { *(int *)int_arg= PF_UNSAFE; return 0; } + { *(int *)int_arg= 0; return FALSE; } }; @@ -1742,7 +1725,7 @@ public: void print(String *str); // to prevent drop fixed flag (no need parent cleanup call) void cleanup() {} - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -1758,7 +1741,7 @@ public: Item *safe_charset_converter(CHARSET_INFO *tocs); void print(String *str) { str->append(func_name); } bool check_partition_func_processor(byte *int_arg) - { *(int *)int_arg= PF_UNSAFE; return 0; } + { *(int *)int_arg= 0; return FALSE; } }; @@ -1772,7 +1755,7 @@ public: { max_length=19;} enum_field_types field_type() const { return MYSQL_TYPE_DATETIME; } bool check_partition_func_processor(byte *int_arg) - { *(int *)int_arg= PF_UNSAFE; return 0; } + { *(int *)int_arg= 0; return FALSE; } }; class Item_empty_string :public Item_string @@ -1796,7 +1779,7 @@ public: } enum_field_types field_type() const { return int_field_type; } bool check_partition_func_processor(byte *int_arg) - { *(int *)int_arg= PF_UNSAFE; return 0; } + { *(int *)int_arg= 0; return FALSE; } }; @@ -1820,8 +1803,7 @@ public: void cleanup() {} bool eq(const Item *item, bool binary_cmp) const; virtual Item *safe_charset_converter(CHARSET_INFO *tocs); - bool check_partition_func_processor(byte *int_arg) - { return safe_for_binary_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -2049,7 +2031,7 @@ public: Item *new_item(); virtual Item *real_item() { return ref; } bool check_partition_func_processor(byte *int_arg) - { *(int *)int_arg= PF_UNSAFE; return 0; } + { *(int *)int_arg= 0; return FALSE; } }; #ifdef MYSQL_SERVER diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index b576f53ad2d..d84e73ff6a5 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -240,8 +240,7 @@ public: } Item *neg_transformer(THD *thd); virtual Item *negated_item(); - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg); } + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_not :public Item_bool_func @@ -252,8 +251,7 @@ public: enum Functype functype() const { return NOT_FUNC; } const char *func_name() const { return "not"; } Item *neg_transformer(THD *thd); - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg); } + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_maxmin_subselect; @@ -468,8 +466,7 @@ public: bool is_bool_func() { return 1; } CHARSET_INFO *compare_collation() { return cmp_collation.collation; } uint decimal_precision() const { return 1; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg); } + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -481,8 +478,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); } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg); } + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -545,7 +541,7 @@ public: const char *func_name() const { return "ifnull"; } Field *tmp_table_field(TABLE *table); uint decimal_precision() const; - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -586,7 +582,7 @@ public: void print(String *str) { Item_func::print(str); } table_map not_null_tables() const { return 0; } bool is_null(); - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -629,8 +625,7 @@ public: void print(String *str); Item *find_item(String *str); CHARSET_INFO *compare_collation() { return cmp_collation.collation; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg); } + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -981,8 +976,7 @@ public: bool nulls_in_row(); bool is_bool_func() { return 1; } CHARSET_INFO *compare_collation() { return cmp_collation.collation; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg); } + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; /* Functions used by where clause */ @@ -1024,7 +1018,7 @@ public: optimize_type select_optimize() const { return OPTIMIZE_NULL; } Item *neg_transformer(THD *thd); CHARSET_INFO *compare_collation() { return args[0]->collation.collation; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; /* Functions used by HAVING for rewriting IN subquery */ @@ -1047,7 +1041,7 @@ public: table_map used_tables() const { return used_tables_cache | RAND_TABLE_BIT; } bool check_partition_func_processor(byte *int_arg) - { *(int *)int_arg= PF_UNSAFE; return 0; } + { *(int *)int_arg= 0; return FALSE; } }; @@ -1070,7 +1064,7 @@ public: void print(String *str); CHARSET_INFO *compare_collation() { return args[0]->collation.collation; } void top_level_item() { abort_on_null=1; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -1109,8 +1103,7 @@ public: const char *func_name() const { return "like"; } bool fix_fields(THD *thd, Item **ref); void cleanup(); - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg); } + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; #ifdef USE_REGEX @@ -1133,8 +1126,7 @@ public: const char *func_name() const { return "regexp"; } void print(String *str) { print_op(str); } CHARSET_INFO *compare_collation() { return cmp_collation.collation; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_binary_collation(int_arg); } + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; #else @@ -1191,8 +1183,7 @@ public: Item *transform(Item_transformer transformer, byte *arg); void traverse_cond(Cond_traverser, void *arg, traverse_order order); void neg_arguments(THD *thd); - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg); } + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; diff --git a/sql/item_func.h b/sql/item_func.h index 763b05db02a..43b16817f3c 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -247,7 +247,7 @@ public: void fix_num_length_and_dec(); void find_num_type(); String *str_op(String *str) { DBUG_ASSERT(0); return 0; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -260,7 +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; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -311,7 +311,7 @@ public: { max_length=args[0]->max_length; unsigned_flag=0; } void print(String *str); uint decimal_precision() const { return args[0]->decimal_precision(); } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -345,7 +345,7 @@ public: void fix_length_and_dec() {}; const char *func_name() const { return "decimal_typecast"; } void print(String *); - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -414,7 +414,7 @@ public: const char *func_name() const { return "DIV"; } void fix_length_and_dec(); void print(String *str) { print_op(str); } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -487,7 +487,7 @@ public: Item_func_exp(Item *a) :Item_dec_func(a) {} double val_real(); const char *func_name() const { return "exp"; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -497,7 +497,7 @@ public: Item_func_ln(Item *a) :Item_dec_func(a) {} double val_real(); const char *func_name() const { return "ln"; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -508,7 +508,7 @@ public: Item_func_log(Item *a,Item *b) :Item_dec_func(a,b) {} double val_real(); const char *func_name() const { return "log"; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -518,7 +518,7 @@ public: Item_func_log2(Item *a) :Item_dec_func(a) {} double val_real(); const char *func_name() const { return "log2"; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -528,7 +528,7 @@ public: Item_func_log10(Item *a) :Item_dec_func(a) {} double val_real(); const char *func_name() const { return "log10"; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -538,7 +538,7 @@ public: Item_func_sqrt(Item *a) :Item_dec_func(a) {} double val_real(); const char *func_name() const { return "sqrt"; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -548,7 +548,7 @@ public: Item_func_pow(Item *a,Item *b) :Item_dec_func(a,b) {} double val_real(); const char *func_name() const { return "pow"; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -558,7 +558,7 @@ public: Item_func_acos(Item *a) :Item_dec_func(a) {} double val_real(); const char *func_name() const { return "acos"; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_asin :public Item_dec_func @@ -567,7 +567,7 @@ public: Item_func_asin(Item *a) :Item_dec_func(a) {} double val_real(); const char *func_name() const { return "asin"; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_atan :public Item_dec_func @@ -577,7 +577,7 @@ public: Item_func_atan(Item *a,Item *b) :Item_dec_func(a,b) {} double val_real(); const char *func_name() const { return "atan"; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_cos :public Item_dec_func @@ -586,7 +586,7 @@ public: Item_func_cos(Item *a) :Item_dec_func(a) {} double val_real(); const char *func_name() const { return "cos"; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_sin :public Item_dec_func @@ -595,7 +595,7 @@ public: Item_func_sin(Item *a) :Item_dec_func(a) {} double val_real(); const char *func_name() const { return "sin"; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_tan :public Item_dec_func @@ -604,7 +604,7 @@ public: Item_func_tan(Item *a) :Item_dec_func(a) {} double val_real(); const char *func_name() const { return "tan"; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_integer :public Item_int_func @@ -681,7 +681,7 @@ public: Item_func_sign(Item *a) :Item_int_func(a) {} const char *func_name() const { return "sign"; } longlong val_int(); - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -696,7 +696,7 @@ public: const char *func_name() const { return name; } void fix_length_and_dec() { decimals= NOT_FIXED_DEC; max_length= float_length(decimals); } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -714,7 +714,7 @@ public: my_decimal *val_decimal(my_decimal *); void fix_length_and_dec(); enum Item_result result_type () const { return cmp_type; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_min :public Item_func_min_max @@ -740,8 +740,7 @@ public: longlong val_int(); const char *func_name() const { return "length"; } void fix_length_and_dec() { max_length=10; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_bit_length :public Item_func_length @@ -761,8 +760,7 @@ public: longlong val_int(); const char *func_name() const { return "char_length"; } void fix_length_and_dec() { max_length=10; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_coercibility :public Item_int_func @@ -786,8 +784,7 @@ public: longlong val_int(); void fix_length_and_dec(); void print(String *str); - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -812,8 +809,7 @@ public: longlong val_int(); const char *func_name() const { return "ascii"; } void fix_length_and_dec() { max_length=3; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_ord :public Item_int_func @@ -823,8 +819,7 @@ public: Item_func_ord(Item *a) :Item_int_func(a) {} longlong val_int(); const char *func_name() const { return "ord"; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_find_in_set :public Item_int_func @@ -838,8 +833,7 @@ public: longlong val_int(); const char *func_name() const { return "find_in_set"; } void fix_length_and_dec(); - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; /* Base class for all bit functions: '~', '|', '^', '&', '>>', '<<' */ @@ -851,7 +845,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); } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_bit_or :public Item_func_bit @@ -877,7 +871,7 @@ public: longlong val_int(); const char *func_name() const { return "bit_count"; } void fix_length_and_dec() { max_length=2; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_shift_left :public Item_func_bit @@ -1314,7 +1308,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;} - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index c42ba69c7b8..e66390c5f2b 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -47,8 +47,7 @@ public: String *val_str(String *); void fix_length_and_dec(); const char *func_name() const { return "md5"; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -89,8 +88,7 @@ public: String *val_str(String *); void fix_length_and_dec(); const char *func_name() const { return "concat"; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_concat_ws :public Item_str_func @@ -111,8 +109,7 @@ public: String *val_str(String *); void fix_length_and_dec(); const char *func_name() const { return "reverse"; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -150,8 +147,7 @@ protected: public: Item_str_conv(Item *item) :Item_str_func(item) {} String *val_str(String *); - bool check_partition_func_processor(byte *int_arg) - { return safe_for_binary_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -419,8 +415,7 @@ public: String *val_str(String *); void fix_length_and_dec(); const char *func_name() const { return "soundex"; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -528,8 +523,7 @@ public: String *val_str(String *); void fix_length_and_dec(); const char *func_name() const { return "rpad"; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -542,8 +536,7 @@ public: String *val_str(String *); void fix_length_and_dec(); const char *func_name() const { return "lpad"; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -558,8 +551,7 @@ public: collation.set(default_charset()); max_length= 64; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -576,8 +568,7 @@ public: decimals=0; max_length=args[0]->max_length*2*collation.collation->mbmaxlen; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_binary_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_unhex :public Item_str_func @@ -593,8 +584,7 @@ public: decimals=0; max_length=(1+args[0]->max_length)/2; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_binary_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -618,8 +608,7 @@ public: } void print(String *str); const char *func_name() const { return "cast_as_binary"; } - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; @@ -659,7 +648,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; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_quote :public Item_str_func @@ -674,7 +663,7 @@ public: collation.set(args[0]->collation); max_length= args[0]->max_length * 2 + 2; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_conv_charset :public Item_str_func @@ -775,8 +764,7 @@ public: const char *func_name() const { return "crc32"; } void fix_length_and_dec() { max_length=10; } longlong val_int(); - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; class Item_func_uncompressed_length : public Item_int_func diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h index 1bbead25d65..6623f7ad418 100644 --- a/sql/item_timefunc.h +++ b/sql/item_timefunc.h @@ -39,7 +39,7 @@ public: { max_length=6*MY_CHARSET_BIN_MB_MAXLEN; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -54,7 +54,7 @@ public: decimals=0; max_length=6*MY_CHARSET_BIN_MB_MAXLEN; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -71,7 +71,7 @@ public: maybe_null=1; } enum_monotonicity_info get_monotonicity_info() const; - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -87,7 +87,7 @@ public: max_length=2*MY_CHARSET_BIN_MB_MAXLEN; maybe_null=1; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -112,7 +112,7 @@ public: max_length=2*MY_CHARSET_BIN_MB_MAXLEN; maybe_null=1; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -145,7 +145,7 @@ public: max_length=3*MY_CHARSET_BIN_MB_MAXLEN; maybe_null=1; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -161,7 +161,7 @@ public: max_length=2*MY_CHARSET_BIN_MB_MAXLEN; maybe_null=1; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -177,7 +177,7 @@ public: max_length=2*MY_CHARSET_BIN_MB_MAXLEN; maybe_null=1; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -193,7 +193,7 @@ public: max_length=1*MY_CHARSET_BIN_MB_MAXLEN; maybe_null=1; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -209,7 +209,7 @@ public: max_length=2*MY_CHARSET_BIN_MB_MAXLEN; maybe_null=1; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -225,7 +225,7 @@ public: max_length=2*MY_CHARSET_BIN_MB_MAXLEN; maybe_null=1; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; class Item_func_yearweek :public Item_int_func @@ -240,7 +240,7 @@ public: max_length=6*MY_CHARSET_BIN_MB_MAXLEN; maybe_null=1; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -257,7 +257,7 @@ public: max_length=4*MY_CHARSET_BIN_MB_MAXLEN; maybe_null=1; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -287,7 +287,7 @@ public: max_length=1*MY_CHARSET_BIN_MB_MAXLEN; maybe_null=1; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; class Item_func_dayname :public Item_func_weekday @@ -320,7 +320,7 @@ public: decimals=0; max_length=10*MY_CHARSET_BIN_MB_MAXLEN; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -335,7 +335,7 @@ public: decimals=0; max_length=10*MY_CHARSET_BIN_MB_MAXLEN; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -545,7 +545,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); - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -563,7 +563,7 @@ public: void fix_length_and_dec(); uint format_length(const String *format); bool eq(const Item *item, bool binary_cmp) const; - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -582,7 +582,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); - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -651,7 +651,7 @@ public: return tmp_table_field_from_field_type(table, 0); } bool result_as_longlong() { return TRUE; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -674,7 +674,7 @@ public: bool get_date(TIME *res, uint fuzzy_date); bool eq(const Item *item, bool binary_cmp) const; void print(String *str); - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -692,8 +692,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); - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg); } + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -730,7 +729,7 @@ public: max_length=args[0]->max_length; maybe_null= 1; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -750,8 +749,7 @@ public: String *val_str(String *a); void fix_length_and_dec(); void print(String *str); - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg); } + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -831,7 +829,7 @@ public: } bool result_as_longlong() { return TRUE; } longlong val_int(); - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -854,7 +852,7 @@ public: } void print(String *str); const char *func_name() const { return "add_time"; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; class Item_func_timediff :public Item_str_func @@ -894,7 +892,7 @@ public: { return tmp_table_field_from_field_type(table, 0); } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; class Item_func_microsecond :public Item_int_func @@ -908,7 +906,7 @@ public: decimals=0; maybe_null=1; } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -926,7 +924,7 @@ public: maybe_null=1; } void print(String *str); - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; @@ -973,7 +971,7 @@ public: { return tmp_table_field_from_field_type(table, 1); } - bool check_partition_func_processor(byte *int_arg) { return 0;} + bool check_partition_func_processor(byte *int_arg) { return FALSE;} }; diff --git a/sql/item_xmlfunc.h b/sql/item_xmlfunc.h index 4ce72777ca4..513a85aa665 100644 --- a/sql/item_xmlfunc.h +++ b/sql/item_xmlfunc.h @@ -42,8 +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 *); - bool check_partition_func_processor(byte *int_arg) - { return safe_for_single_char_collation(int_arg);} + bool check_partition_func_processor(byte *int_arg) { return FALSE; } }; diff --git a/sql/partition_info.cc b/sql/partition_info.cc index 94008e621c7..1afbb968547 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -718,25 +718,26 @@ bool partition_info::check_partition_info(THD *thd, handlerton **eng_type, uint i, tot_partitions; bool result= TRUE; char *same_name; - int part_expression_ok= PF_SAFE; DBUG_ENTER("partition_info::check_partition_info"); - pf_collation_allowed= PF_SAFE; - spf_collation_allowed= PF_SAFE; if (check_partition_function) { + int part_expression_ok= 1; + int pf_collation_allowed= 1; + int spf_collation_allowed= 1; + if (part_type != HASH_PARTITION || !list_of_part_fields) { part_expr->walk(&Item::check_partition_func_processor, 0, (byte*)(&part_expression_ok)); - pf_collation_allowed= (char)part_expression_ok; - part_expression_ok= PF_SAFE; + pf_collation_allowed= part_expression_ok; + part_expression_ok= 1; if (is_sub_partitioned() && !list_of_subpart_fields) { subpart_expr->walk(&Item::check_partition_func_processor, 0, (byte*)(&part_expression_ok)); } - spf_collation_allowed= (char)part_expression_ok; + spf_collation_allowed= part_expression_ok; } if (!pf_collation_allowed || !spf_collation_allowed) diff --git a/sql/partition_info.h b/sql/partition_info.h index a7dd7bcfab2..8cc989c0991 100644 --- a/sql/partition_info.h +++ b/sql/partition_info.h @@ -188,8 +188,6 @@ public: bool is_auto_partitioned; bool from_openfrm; bool has_null_value; - char pf_collation_allowed; - char spf_collation_allowed; partition_info() @@ -219,9 +217,7 @@ public: list_of_part_fields(FALSE), list_of_subpart_fields(FALSE), linear_hash_ind(FALSE), fixed(FALSE), is_auto_partitioned(FALSE), from_openfrm(FALSE), - has_null_value(FALSE), - pf_collation_allowed(0), - spf_collation_allowed(0) + has_null_value(FALSE) { all_fields_in_PF.clear_all(); all_fields_in_PPF.clear_all(); diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index db2307597ba..d11a7b8bccd 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -1376,7 +1376,7 @@ static uint32 get_part_id_from_linear_hash(longlong hash_value, uint mask, Check that partition function do not contain any forbidden character sets and collations. SYNOPSIS - check_part_func_collation() + check_part_func_fields() part_info Partition info ptr Array of Field pointers RETURN VALUES @@ -1384,19 +1384,24 @@ static uint32 get_part_id_from_linear_hash(longlong hash_value, uint mask, TRUE Error */ -static bool check_part_func_collation(int collation_allowed, - Field **ptr) +static bool check_part_func_fields(Field **ptr) { Field *field; while ((field= *(ptr++))) { - if (field->result_type() == STRING_RESULT) + /* + For CHAR/VARCHAR fields we need to take special precautions. + Binary collation with CHAR is automatically supported. Other + types need some kind of standardisation function handling + */ + if (field->type() == MYSQL_TYPE_STRING || + field->type() == MYSQL_TYPE_VARCHAR) { CHARSET_INFO *cs= ((Field_str*)field)->charset(); - if (use_strnxfrm(cs) || - (collation_allowed == PF_SAFE_BINARY_COLLATION && - (!(cs->state & MY_CS_BINSORT)))) - return TRUE; + if (field->type() == MYSQL_TYPE_STRING && + cs->state & MY_CS_BINSORT) + return FALSE; + return TRUE; } } return FALSE; @@ -1548,13 +1553,9 @@ bool fix_partition_func(THD *thd, TABLE *table, goto end; } } - if (((part_info->pf_collation_allowed != PF_SAFE) && - check_part_func_collation(part_info->pf_collation_allowed, - part_info->part_field_array)) || + if ((check_part_func_fields(part_info->part_field_array)) || (part_info->is_sub_partitioned() && - part_info->spf_collation_allowed != PF_SAFE && - check_part_func_collation(part_info->spf_collation_allowed, - part_info->subpart_field_array))) + check_part_func_fields(part_info->subpart_field_array))) { my_error(ER_PARTITION_FUNCTION_IS_NOT_ALLOWED, MYF(0)); goto end; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index e12985faca8..57dceb7766b 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -3619,7 +3619,7 @@ part_bit_expr: { Item *part_expr= $1; bool not_corr_func; - bool part_expression_ok= TRUE; + int part_expression_ok= 1; LEX *lex= Lex; THD *thd= YYTHD; longlong item_value; |