diff options
Diffstat (limited to 'sql/field.h')
-rw-r--r-- | sql/field.h | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/sql/field.h b/sql/field.h index ef0fa2765a4..65a71fcbfa4 100644 --- a/sql/field.h +++ b/sql/field.h @@ -39,6 +39,7 @@ class Relay_log_info; class Field; class Column_statistics; class Column_statistics_collected; +class Item_func; class Item_bool_func2; enum enum_check_fields @@ -964,9 +965,21 @@ public: return (double) 0.5; } + virtual bool can_optimize_keypart_ref(const Item_func *cond, + const Item *item) const; + virtual bool can_optimize_hash_join(const Item_func *cond, + const Item *item) const + { + return can_optimize_keypart_ref(cond, item); + } virtual bool can_optimize_group_min_max(const Item_bool_func2 *cond, - const Item *const_item); - + const Item *const_item) const; + bool can_optimize_outer_join_table_elimination(const Item_func *cond, + const Item *item) const + { + // Exactly the same rules with REF access + return can_optimize_keypart_ref(cond, item); + } friend int cre_myisam(char * name, register TABLE *form, uint options, ulonglong auto_increment_value); friend class Copy_field; @@ -1147,6 +1160,10 @@ protected: return report_if_important_data(copier->source_end_pos(), end, count_spaces); } + bool cmp_to_string_with_same_collation(const Item_func *cond, + const Item *item) const; + bool cmp_to_string_with_stricter_collation(const Item_func *cond, + const Item *item) const; public: Field_longstr(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, utype unireg_check_arg, @@ -1158,8 +1175,10 @@ public: int store_decimal(const my_decimal *d); uint32 max_data_length() const; bool match_collation_to_optimize_range() const { return true; } + bool can_optimize_keypart_ref(const Item_func *cond, const Item *item) const; + bool can_optimize_hash_join(const Item_func *cond, const Item *item) const; bool can_optimize_group_min_max(const Item_bool_func2 *cond, - const Item *const_item); + const Item *const_item) const; }; /* base class for float and double and decimal (old one) */ @@ -1587,8 +1606,13 @@ public: uint size_of() const { return sizeof(*this); } uint32 max_display_length() { return 4; } void move_field_offset(my_ptrdiff_t ptr_diff) {} + bool can_optimize_keypart_ref(const Item_func *cond, const Item *item) const + { + DBUG_ASSERT(0); + return false; + } bool can_optimize_group_min_max(const Item_bool_func2 *cond, - const Item *const_item) + const Item *const_item) const { DBUG_ASSERT(0); return false; @@ -1625,8 +1649,9 @@ public: { return pos_in_interval_val_real(min, max); } + bool can_optimize_keypart_ref(const Item_func *cond, const Item *item) const; bool can_optimize_group_min_max(const Item_bool_func2 *cond, - const Item *const_item); + const Item *const_item) const; }; @@ -2664,8 +2689,9 @@ public: virtual const uchar *unpack(uchar *to, const uchar *from, const uchar *from_end, uint param_data); + bool can_optimize_keypart_ref(const Item_func *cond, const Item *item) const; bool can_optimize_group_min_max(const Item_bool_func2 *cond, - const Item *const_item) + const Item *const_item) const { /* Can't use GROUP_MIN_MAX optimization for ENUM and SET, |