1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-07 00:04:31 +03:00

Clean-up: moving compare_collation() from Item to Item_bool_func.

This commit is contained in:
Alexander Barkov
2015-08-21 17:08:55 +04:00
parent 1bae0d9e56
commit 98ba2bf424
6 changed files with 43 additions and 32 deletions

View File

@@ -1249,7 +1249,7 @@ double Field::pos_in_interval_val_str(Field *min, Field *max, uint data_offset)
/* /*
This handles all numeric and BIT data types. This handles all numeric and BIT data types.
*/ */
bool Field::can_optimize_keypart_ref(const Item_func *cond, bool Field::can_optimize_keypart_ref(const Item_bool_func *cond,
const Item *item) const const Item *item) const
{ {
DBUG_ASSERT(cmp_type() != STRING_RESULT); DBUG_ASSERT(cmp_type() != STRING_RESULT);
@@ -5289,7 +5289,7 @@ my_decimal *Field_temporal::val_decimal(my_decimal *d)
} }
bool Field_temporal::can_optimize_keypart_ref(const Item_func *cond, bool Field_temporal::can_optimize_keypart_ref(const Item_bool_func *cond,
const Item *value) const const Item *value) const
{ {
return true; // Field is of TIME_RESULT, which supersedes everything else. return true; // Field is of TIME_RESULT, which supersedes everything else.
@@ -6488,7 +6488,7 @@ uint32 Field_longstr::max_data_length() const
bool bool
Field_longstr::cmp_to_string_with_same_collation(const Item_func *cond, Field_longstr::cmp_to_string_with_same_collation(const Item_bool_func *cond,
const Item *item) const const Item *item) const
{ {
return item->cmp_type() == STRING_RESULT && return item->cmp_type() == STRING_RESULT &&
@@ -6497,7 +6497,7 @@ Field_longstr::cmp_to_string_with_same_collation(const Item_func *cond,
bool bool
Field_longstr::cmp_to_string_with_stricter_collation(const Item_func *cond, Field_longstr::cmp_to_string_with_stricter_collation(const Item_bool_func *cond,
const Item *item) const const Item *item) const
{ {
return item->cmp_type() == STRING_RESULT && return item->cmp_type() == STRING_RESULT &&
@@ -6506,7 +6506,7 @@ Field_longstr::cmp_to_string_with_stricter_collation(const Item_func *cond,
} }
bool Field_longstr::can_optimize_keypart_ref(const Item_func *cond, bool Field_longstr::can_optimize_keypart_ref(const Item_bool_func *cond,
const Item *item) const const Item *item) const
{ {
DBUG_ASSERT(cmp_type() == STRING_RESULT); DBUG_ASSERT(cmp_type() == STRING_RESULT);
@@ -6514,7 +6514,7 @@ bool Field_longstr::can_optimize_keypart_ref(const Item_func *cond,
} }
bool Field_longstr::can_optimize_hash_join(const Item_func *cond, bool Field_longstr::can_optimize_hash_join(const Item_bool_func *cond,
const Item *item) const const Item *item) const
{ {
DBUG_ASSERT(cmp_type() == STRING_RESULT); DBUG_ASSERT(cmp_type() == STRING_RESULT);
@@ -8561,7 +8561,7 @@ uint Field_num::is_equal(Create_field *new_field)
} }
bool Field_enum::can_optimize_keypart_ref(const Item_func *cond, bool Field_enum::can_optimize_keypart_ref(const Item_bool_func *cond,
const Item *item) const const Item *item) const
{ {
DBUG_ASSERT(cmp_type() == INT_RESULT); DBUG_ASSERT(cmp_type() == INT_RESULT);
@@ -8576,7 +8576,7 @@ bool Field_enum::can_optimize_keypart_ref(const Item_func *cond,
case REAL_RESULT: case REAL_RESULT:
return true; return true;
case STRING_RESULT: case STRING_RESULT:
return charset() == ((Item_func*)cond)->compare_collation(); return charset() == cond->compare_collation();
case IMPOSSIBLE_RESULT: case IMPOSSIBLE_RESULT:
case ROW_RESULT: case ROW_RESULT:
DBUG_ASSERT(0); DBUG_ASSERT(0);

View File

@@ -1012,16 +1012,16 @@ public:
return (double) 0.5; return (double) 0.5;
} }
virtual bool can_optimize_keypart_ref(const Item_func *cond, virtual bool can_optimize_keypart_ref(const Item_bool_func *cond,
const Item *item) const; const Item *item) const;
virtual bool can_optimize_hash_join(const Item_func *cond, virtual bool can_optimize_hash_join(const Item_bool_func *cond,
const Item *item) const const Item *item) const
{ {
return can_optimize_keypart_ref(cond, item); return can_optimize_keypart_ref(cond, item);
} }
virtual bool can_optimize_group_min_max(const Item_bool_func *cond, virtual bool can_optimize_group_min_max(const Item_bool_func *cond,
const Item *const_item) const; const Item *const_item) const;
bool can_optimize_outer_join_table_elimination(const Item_func *cond, bool can_optimize_outer_join_table_elimination(const Item_bool_func *cond,
const Item *item) const const Item *item) const
{ {
// Exactly the same rules with REF access // Exactly the same rules with REF access
@@ -1207,9 +1207,9 @@ protected:
return report_if_important_data(copier->source_end_pos(), return report_if_important_data(copier->source_end_pos(),
end, count_spaces); end, count_spaces);
} }
bool cmp_to_string_with_same_collation(const Item_func *cond, bool cmp_to_string_with_same_collation(const Item_bool_func *cond,
const Item *item) const; const Item *item) const;
bool cmp_to_string_with_stricter_collation(const Item_func *cond, bool cmp_to_string_with_stricter_collation(const Item_bool_func *cond,
const Item *item) const; const Item *item) const;
public: public:
Field_longstr(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, Field_longstr(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
@@ -1222,8 +1222,10 @@ public:
int store_decimal(const my_decimal *d); int store_decimal(const my_decimal *d);
uint32 max_data_length() const; uint32 max_data_length() const;
bool match_collation_to_optimize_range() const { return true; } 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_keypart_ref(const Item_bool_func *cond,
bool can_optimize_hash_join(const Item_func *cond, const Item *item) const; const Item *item) const;
bool can_optimize_hash_join(const Item_bool_func *cond,
const Item *item) const;
bool can_optimize_group_min_max(const Item_bool_func *cond, bool can_optimize_group_min_max(const Item_bool_func *cond,
const Item *const_item) const; const Item *const_item) const;
}; };
@@ -1653,7 +1655,8 @@ public:
uint size_of() const { return sizeof(*this); } uint size_of() const { return sizeof(*this); }
uint32 max_display_length() { return 4; } uint32 max_display_length() { return 4; }
void move_field_offset(my_ptrdiff_t ptr_diff) {} void move_field_offset(my_ptrdiff_t ptr_diff) {}
bool can_optimize_keypart_ref(const Item_func *cond, const Item *item) const bool can_optimize_keypart_ref(const Item_bool_func *cond,
const Item *item) const
{ {
DBUG_ASSERT(0); DBUG_ASSERT(0);
return false; return false;
@@ -1696,7 +1699,8 @@ public:
{ {
return pos_in_interval_val_real(min, max); return pos_in_interval_val_real(min, max);
} }
bool can_optimize_keypart_ref(const Item_func *cond, const Item *item) const; bool can_optimize_keypart_ref(const Item_bool_func *cond,
const Item *item) const;
bool can_optimize_group_min_max(const Item_bool_func *cond, bool can_optimize_group_min_max(const Item_bool_func *cond,
const Item *const_item) const; const Item *const_item) const;
}; };
@@ -2773,7 +2777,8 @@ public:
virtual const uchar *unpack(uchar *to, const uchar *from, virtual const uchar *unpack(uchar *to, const uchar *from,
const uchar *from_end, uint param_data); const uchar *from_end, uint param_data);
bool can_optimize_keypart_ref(const Item_func *cond, const Item *item) const; bool can_optimize_keypart_ref(const Item_bool_func *cond,
const Item *item) const;
bool can_optimize_group_min_max(const Item_bool_func *cond, bool can_optimize_group_min_max(const Item_bool_func *cond,
const Item *const_item) const const Item *const_item) const
{ {

View File

@@ -1229,7 +1229,6 @@ public:
virtual Item *get_tmp_table_item(THD *thd) { return copy_or_same(thd); } virtual Item *get_tmp_table_item(THD *thd) { return copy_or_same(thd); }
static CHARSET_INFO *default_charset(); static CHARSET_INFO *default_charset();
virtual CHARSET_INFO *compare_collation() const { return NULL; }
/* /*
For backward compatibility, to make numeric For backward compatibility, to make numeric

View File

@@ -162,6 +162,7 @@ public:
Item_bool_func(THD *thd, List<Item> &list): Item_int_func(thd, list) { } Item_bool_func(THD *thd, List<Item> &list): Item_int_func(thd, list) { }
Item_bool_func(THD *thd, Item_bool_func *item) :Item_int_func(thd, item) {} Item_bool_func(THD *thd, Item_bool_func *item) :Item_int_func(thd, item) {}
bool is_bool_type() { return true; } bool is_bool_type() { return true; }
virtual CHARSET_INFO *compare_collation() const { return NULL; }
void fix_length_and_dec() { decimals=0; max_length=1; } void fix_length_and_dec() { decimals=0; max_length=1; }
uint decimal_precision() const { return 1; } uint decimal_precision() const { return 1; }
}; };

View File

@@ -534,7 +534,8 @@ void build_eq_mods_for_cond(THD *thd, Dep_analysis_context *dac,
Item *cond); Item *cond);
static static
void check_equality(Dep_analysis_context *dac, Dep_module_expr **eq_mod, void check_equality(Dep_analysis_context *dac, Dep_module_expr **eq_mod,
uint and_level, Item_func *cond, Item *left, Item *right); uint and_level, Item_bool_func *cond,
Item *left, Item *right);
static static
Dep_module_expr *merge_eq_mods(Dep_module_expr *start, Dep_module_expr *merge_eq_mods(Dep_module_expr *start,
Dep_module_expr *new_fields, Dep_module_expr *new_fields,
@@ -1199,27 +1200,30 @@ void build_eq_mods_for_cond(THD *thd, Dep_analysis_context *ctx,
case Item_func::BETWEEN: case Item_func::BETWEEN:
{ {
Item *fld; Item *fld;
if (!((Item_func_between*)cond)->negated && Item_func_between *func= (Item_func_between *) cond_func;
if (!func->negated &&
(fld= args[0]->real_item())->type() == Item::FIELD_ITEM && (fld= args[0]->real_item())->type() == Item::FIELD_ITEM &&
args[1]->eq(args[2], ((Item_field*)fld)->field->binary())) args[1]->eq(args[2], ((Item_field*)fld)->field->binary()))
{ {
check_equality(ctx, eq_mod, *and_level, cond_func, args[0], args[1]); check_equality(ctx, eq_mod, *and_level, func, args[0], args[1]);
check_equality(ctx, eq_mod, *and_level, cond_func, args[1], args[0]); check_equality(ctx, eq_mod, *and_level, func, args[1], args[0]);
} }
break; break;
} }
case Item_func::EQ_FUNC: case Item_func::EQ_FUNC:
case Item_func::EQUAL_FUNC: case Item_func::EQUAL_FUNC:
{ {
check_equality(ctx, eq_mod, *and_level, cond_func, args[0], args[1]); Item_bool_rowready_func2 *func= (Item_bool_rowready_func2*) cond_func;
check_equality(ctx, eq_mod, *and_level, cond_func, args[1], args[0]); check_equality(ctx, eq_mod, *and_level, func, args[0], args[1]);
check_equality(ctx, eq_mod, *and_level, func, args[1], args[0]);
break; break;
} }
case Item_func::ISNULL_FUNC: case Item_func::ISNULL_FUNC:
{ {
Item *tmp=new (thd->mem_root) Item_null(thd); Item *tmp=new (thd->mem_root) Item_null(thd);
if (tmp) if (tmp)
check_equality(ctx, eq_mod, *and_level, cond_func, args[0], tmp); check_equality(ctx, eq_mod, *and_level,
(Item_func_isnull*) cond_func, args[0], tmp);
break; break;
} }
case Item_func::MULT_EQUAL_FUNC: case Item_func::MULT_EQUAL_FUNC:
@@ -1479,7 +1483,8 @@ Dep_module_expr *merge_eq_mods(Dep_module_expr *start,
static static
void check_equality(Dep_analysis_context *ctx, Dep_module_expr **eq_mod, void check_equality(Dep_analysis_context *ctx, Dep_module_expr **eq_mod,
uint and_level, Item_func *cond, Item *left, Item *right) uint and_level, Item_bool_func *cond,
Item *left, Item *right)
{ {
if ((left->used_tables() & ctx->usable_tables) && if ((left->used_tables() & ctx->usable_tables) &&
!(right->used_tables() & RAND_TABLE_BIT) && !(right->used_tables() & RAND_TABLE_BIT) &&

View File

@@ -4147,7 +4147,7 @@ error:
/// Used when finding key fields /// Used when finding key fields
struct KEY_FIELD { struct KEY_FIELD {
Field *field; Field *field;
Item_func *cond; Item_bool_func *cond;
Item *val; ///< May be empty if diff constant Item *val; ///< May be empty if diff constant
uint level; uint level;
uint optimize; uint optimize;
@@ -4400,7 +4400,7 @@ static uint get_semi_join_select_list_index(Field *field)
static void static void
add_key_field(JOIN *join, add_key_field(JOIN *join,
KEY_FIELD **key_fields,uint and_level, Item_func *cond, KEY_FIELD **key_fields,uint and_level, Item_bool_func *cond,
Field *field, bool eq_func, Item **value, uint num_values, Field *field, bool eq_func, Item **value, uint num_values,
table_map usable_tables, SARGABLE_PARAM **sargables) table_map usable_tables, SARGABLE_PARAM **sargables)
{ {
@@ -4552,7 +4552,7 @@ add_key_field(JOIN *join,
static void static void
add_key_equal_fields(JOIN *join, KEY_FIELD **key_fields, uint and_level, add_key_equal_fields(JOIN *join, KEY_FIELD **key_fields, uint and_level,
Item_func *cond, Item *field_item, Item_bool_func *cond, Item *field_item,
bool eq_func, Item **val, bool eq_func, Item **val,
uint num_values, table_map usable_tables, uint num_values, table_map usable_tables,
SARGABLE_PARAM **sargables) SARGABLE_PARAM **sargables)
@@ -12511,7 +12511,8 @@ finish:
*/ */
static bool check_simple_equality(THD *thd, Item *left_item, Item *right_item, static bool check_simple_equality(THD *thd, Item *left_item, Item *right_item,
Item *item, COND_EQUAL *cond_equal) const Item_bool_func *item,
COND_EQUAL *cond_equal)
{ {
Item *orig_left_item= left_item; Item *orig_left_item= left_item;
Item *orig_right_item= right_item; Item *orig_right_item= right_item;
@@ -12653,7 +12654,7 @@ static bool check_simple_equality(THD *thd, Item *left_item, Item *right_item,
eq_item->quick_fix_field(); eq_item->quick_fix_field();
item= eq_item; item= eq_item;
} }
if ((cs != ((Item_func *) item)->compare_collation()) || if ((cs != item->compare_collation()) ||
!cs->coll->propagate(cs, 0, 0)) !cs->coll->propagate(cs, 0, 0))
return FALSE; return FALSE;
} }