summaryrefslogtreecommitdiff
path: root/sql/field.h
diff options
context:
space:
mode:
Diffstat (limited to 'sql/field.h')
-rw-r--r--sql/field.h38
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,