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:
16
sql/field.cc
16
sql/field.cc
@@ -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);
|
||||||
|
25
sql/field.h
25
sql/field.h
@@ -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
|
||||||
{
|
{
|
||||||
|
@@ -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
|
||||||
|
@@ -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; }
|
||||||
};
|
};
|
||||||
|
@@ -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) &&
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user