mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
Revert MDEV-14517 Cleanup for Item::with_subselect
Added back variable 'with_subquery' to Item class as a bit field. This made the code shorter, faster (removed some virtual methods, less code to create an initialized item etc) and made many Item's 7 bytes smaller. This is the last set of my patches the decreases the size of Item. Some examples from gdb: sizeof(Item): 144 -> 120 sizeof(Item_func) 208 -> 184 sizeof(Item_sum_max) 368 -> 344
This commit is contained in:
committed by
Sergei Golubchik
parent
ae39f4f6d6
commit
189d03dac5
@@ -936,10 +936,10 @@ static ha_rows find_all_keys(THD *thd, Sort_param *param, SQL_SELECT *select,
|
||||
MY_BITMAP *tmp_read_set= sort_form->read_set;
|
||||
MY_BITMAP *tmp_write_set= sort_form->write_set;
|
||||
|
||||
if (select->cond->with_subquery())
|
||||
if (select->cond->has_subquery())
|
||||
sort_form->column_bitmaps_set(save_read_set, save_write_set);
|
||||
write_record= (select->skip_record(thd) > 0);
|
||||
if (select->cond->with_subquery())
|
||||
if (select->cond->has_subquery())
|
||||
sort_form->column_bitmaps_set(tmp_read_set, tmp_write_set);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -414,7 +414,7 @@ Item::Item(THD *thd):
|
||||
{
|
||||
DBUG_ASSERT(thd);
|
||||
maybe_null= with_window_func= with_field= in_rollup= with_param= 0;
|
||||
is_in_with_cycle= with_sum_func= 0;
|
||||
is_in_with_cycle= with_sum_func= with_subquery= 0;
|
||||
fixed= 1; // Simple Item's doesn't have to be fixed
|
||||
is_autogenerated_name= 1;
|
||||
null_value= 0;
|
||||
@@ -487,6 +487,7 @@ Item::Item(THD *thd, Item *item):
|
||||
is_autogenerated_name(item->is_autogenerated_name),
|
||||
is_in_with_cycle(item->is_in_with_cycle),
|
||||
with_sum_func(item->with_sum_func),
|
||||
with_subquery(item->with_subquery),
|
||||
marker(item->marker),
|
||||
null_value(item->null_value),
|
||||
is_expensive_cache(-1),
|
||||
@@ -8568,10 +8569,10 @@ Item_cache_wrapper::Item_cache_wrapper(THD *thd, Item *item_arg):
|
||||
Type_std_attributes::set(orig_item);
|
||||
maybe_null= orig_item->maybe_null;
|
||||
with_sum_func= orig_item->with_sum_func;
|
||||
with_subquery= orig_item->with_subquery;
|
||||
with_param= orig_item->with_param;
|
||||
with_field= orig_item->with_field;
|
||||
name= item_arg->name;
|
||||
m_with_subquery= orig_item->with_subquery();
|
||||
|
||||
if ((expr_value= orig_item->get_cache(thd)))
|
||||
expr_value->setup(thd, orig_item);
|
||||
|
||||
39
sql/item.h
39
sql/item.h
@@ -928,7 +928,8 @@ public:
|
||||
is_autogenerated_name:1,
|
||||
/* Indicates that this item is in CYCLE clause of WITH */
|
||||
is_in_with_cycle:1,
|
||||
with_sum_func:1; /* True if item contains a sum func */
|
||||
with_sum_func:1, /* True if item contains a sum func */
|
||||
with_subquery:1; /* True if item containts a sub query */
|
||||
|
||||
int16 marker;
|
||||
|
||||
@@ -2406,12 +2407,8 @@ public:
|
||||
*/
|
||||
virtual bool is_outer_field() const { DBUG_ASSERT(is_fixed()); return FALSE; }
|
||||
|
||||
/**
|
||||
Checks if this item or any of its descendents contains a subquery.
|
||||
This is a replacement of the former Item::has_subquery() and
|
||||
Item::with_subselect.
|
||||
*/
|
||||
virtual bool with_subquery() const { DBUG_ASSERT(is_fixed()); return false; }
|
||||
/** Checks if this item or any of its decendents contains a subquery */
|
||||
bool has_subquery() const { DBUG_ASSERT(is_fixed()); return with_subquery; }
|
||||
|
||||
Item* set_expr_cache(THD *thd);
|
||||
|
||||
@@ -2540,21 +2537,6 @@ public:
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
This class is a replacement for the former member Item::with_subselect.
|
||||
Determines if the descendant Item is a subselect or some of
|
||||
its arguments is or contains a subselect.
|
||||
*/
|
||||
class With_subquery_cache
|
||||
{
|
||||
protected:
|
||||
bool m_with_subquery;
|
||||
public:
|
||||
With_subquery_cache(): m_with_subquery(false) { }
|
||||
void join(const Item *item) { m_with_subquery|= item->with_subquery(); }
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Compare two Items for List<Item>::add_unique()
|
||||
*/
|
||||
@@ -5184,8 +5166,7 @@ public:
|
||||
*/
|
||||
class Item_func_or_sum: public Item_result_field,
|
||||
public Item_args,
|
||||
public Used_tables_and_const_cache,
|
||||
public With_subquery_cache
|
||||
public Used_tables_and_const_cache
|
||||
{
|
||||
protected:
|
||||
bool agg_arg_charsets(DTCollation &c, Item **items, uint nitems,
|
||||
@@ -5268,8 +5249,6 @@ public:
|
||||
Used_tables_and_const_cache(item) { }
|
||||
Item_func_or_sum(THD *thd, List<Item> &list):
|
||||
Item_result_field(thd), Item_args(thd, list) { }
|
||||
bool with_subquery() const override
|
||||
{ DBUG_ASSERT(fixed); return m_with_subquery; }
|
||||
bool walk(Item_processor processor, bool walk_subquery, void *arg) override
|
||||
{
|
||||
if (walk_args(processor, walk_subquery, arg))
|
||||
@@ -5541,13 +5520,10 @@ public:
|
||||
DBUG_ASSERT(ref);
|
||||
return (*ref)->is_outer_field();
|
||||
}
|
||||
|
||||
Item* build_clone(THD *thd) override;
|
||||
|
||||
/**
|
||||
Checks if the item tree that ref points to contains a subquery.
|
||||
*/
|
||||
bool with_subquery() const override { return (*ref)->with_subquery(); }
|
||||
Item *get_copy(THD *thd) override
|
||||
{ return get_item_copy<Item_ref>(thd, this); }
|
||||
bool excl_dep_on_table(table_map tab_map) override
|
||||
@@ -5676,8 +5652,7 @@ class Expression_cache_tracker;
|
||||
The objects of this class can store its values in an expression cache.
|
||||
*/
|
||||
|
||||
class Item_cache_wrapper :public Item_result_field,
|
||||
public With_subquery_cache
|
||||
class Item_cache_wrapper :public Item_result_field
|
||||
{
|
||||
private:
|
||||
/* Pointer on the cached expression */
|
||||
@@ -5704,8 +5679,6 @@ public:
|
||||
|
||||
Type type() const override { return EXPR_CACHE_ITEM; }
|
||||
Type real_type() const override { return orig_item->type(); }
|
||||
bool with_subquery() const override
|
||||
{ DBUG_ASSERT(fixed); return m_with_subquery; }
|
||||
|
||||
bool set_cache(THD *thd);
|
||||
Expression_cache_tracker* init_tracker(MEM_ROOT *mem_root);
|
||||
|
||||
@@ -1389,7 +1389,7 @@ bool Item_in_optimizer::fix_fields(THD *thd, Item **ref)
|
||||
}
|
||||
if (args[1]->maybe_null)
|
||||
maybe_null=1;
|
||||
m_with_subquery= true;
|
||||
with_subquery= 1;
|
||||
with_sum_func= with_sum_func || args[1]->with_sum_func;
|
||||
with_field= with_field || args[1]->with_field;
|
||||
with_param= args[0]->with_param || args[1]->with_param;
|
||||
@@ -4942,7 +4942,7 @@ Item_cond::fix_fields(THD *thd, Item **ref)
|
||||
with_sum_func|= item->with_sum_func;
|
||||
with_param|= item->with_param;
|
||||
with_field|= item->with_field;
|
||||
m_with_subquery|= item->with_subquery();
|
||||
with_subquery|= item->with_subquery;
|
||||
with_window_func|= item->with_window_func;
|
||||
maybe_null|= item->maybe_null;
|
||||
}
|
||||
@@ -7058,7 +7058,7 @@ bool Item_equal::fix_fields(THD *thd, Item **ref)
|
||||
used_tables_cache|= item->used_tables();
|
||||
tmp_table_map= item->not_null_tables();
|
||||
not_null_tables_cache|= tmp_table_map;
|
||||
DBUG_ASSERT(!item->with_sum_func && !item->with_subquery());
|
||||
DBUG_ASSERT(!item->with_sum_func && !item->with_subquery);
|
||||
if (item->maybe_null)
|
||||
maybe_null= 1;
|
||||
if (!item->get_item_equal())
|
||||
|
||||
@@ -366,7 +366,7 @@ public:
|
||||
Item_in_optimizer(THD *thd, Item *a, Item *b):
|
||||
Item_bool_func(thd, a, b), cache(0), expr_cache(0),
|
||||
save_cache(0), result_for_null_param(UNKNOWN)
|
||||
{ m_with_subquery= true; }
|
||||
{ with_subquery= true; }
|
||||
bool fix_fields(THD *, Item **) override;
|
||||
bool fix_left(THD *thd);
|
||||
table_map not_null_tables() const override { return 0; }
|
||||
|
||||
@@ -358,9 +358,9 @@ Item_func::fix_fields(THD *thd, Item **ref)
|
||||
with_param |= item->with_param;
|
||||
with_window_func |= item->with_window_func;
|
||||
with_field |= item->with_field;
|
||||
with_subquery|= item->with_subquery;
|
||||
used_tables_and_const_cache_join(item);
|
||||
not_null_tables_cache|= item->not_null_tables();
|
||||
m_with_subquery|= item->with_subquery();
|
||||
}
|
||||
}
|
||||
if (check_arguments())
|
||||
@@ -3521,7 +3521,7 @@ udf_handler::fix_fields(THD *thd, Item_func_or_sum *func,
|
||||
func->with_window_func |= item->with_window_func;
|
||||
func->with_field |= item->with_field;
|
||||
func->with_param |= item->with_param;
|
||||
func->With_subquery_cache::join(item);
|
||||
func->with_subquery |= item->with_subquery;
|
||||
func->used_tables_and_const_cache_join(item);
|
||||
f_args.arg_type[i]=item->result_type();
|
||||
}
|
||||
|
||||
@@ -346,7 +346,7 @@ public:
|
||||
|
||||
bool excl_dep_on_grouping_fields(st_select_lex *sel)
|
||||
{
|
||||
if (has_rand_bit() || with_subquery())
|
||||
if (has_rand_bit() || has_subquery())
|
||||
return false;
|
||||
return Item_args::excl_dep_on_grouping_fields(sel);
|
||||
}
|
||||
|
||||
@@ -3799,7 +3799,7 @@ Item_func_json_objectagg::fix_fields(THD *thd, Item **ref)
|
||||
{
|
||||
if (args[i]->fix_fields_if_needed_for_scalar(thd, &args[i]))
|
||||
return TRUE;
|
||||
m_with_subquery|= args[i]->with_subquery();
|
||||
with_subquery|= args[i]->with_subquery;
|
||||
with_param|= args[i]->with_param;
|
||||
with_window_func|= args[i]->with_window_func;
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ bool Item_row::fix_fields(THD *thd, Item **ref)
|
||||
with_sum_func= with_sum_func || item->with_sum_func;
|
||||
with_window_func = with_window_func || item->with_window_func;
|
||||
with_field= with_field || item->with_field;
|
||||
m_with_subquery|= item->with_subquery();
|
||||
with_subquery|= item->with_subquery;
|
||||
with_param|= item->with_param;
|
||||
}
|
||||
fixed= 1;
|
||||
|
||||
@@ -35,8 +35,7 @@
|
||||
*/
|
||||
class Item_row: public Item_fixed_hybrid,
|
||||
private Item_args,
|
||||
private Used_tables_and_const_cache,
|
||||
private With_subquery_cache
|
||||
private Used_tables_and_const_cache
|
||||
{
|
||||
table_map not_null_tables_cache;
|
||||
/**
|
||||
@@ -55,7 +54,6 @@ public:
|
||||
not_null_tables_cache(0), with_null(0)
|
||||
{ }
|
||||
|
||||
bool with_subquery() const { DBUG_ASSERT(fixed); return m_with_subquery; }
|
||||
enum Type type() const { return ROW_ITEM; };
|
||||
const Type_handler *type_handler() const { return &type_handler_row; }
|
||||
Field *create_tmp_field_ex(MEM_ROOT *root, TABLE *table, Tmp_field_src *src,
|
||||
|
||||
@@ -67,6 +67,7 @@ Item_subselect::Item_subselect(THD *thd_arg):
|
||||
#ifndef DBUG_OFF
|
||||
exec_counter= 0;
|
||||
#endif
|
||||
with_subquery= 1;
|
||||
reset();
|
||||
/*
|
||||
Item value is NULL if select_result_interceptor didn't change this value
|
||||
@@ -2944,7 +2945,7 @@ static bool check_equality_for_exist2in(Item_func *func,
|
||||
if (args[0]->real_type() == Item::FIELD_ITEM &&
|
||||
args[0]->all_used_tables() != OUTER_REF_TABLE_BIT &&
|
||||
args[1]->all_used_tables() == OUTER_REF_TABLE_BIT &&
|
||||
(allow_subselect || !args[1]->with_subquery()))
|
||||
(allow_subselect || !args[1]->with_subquery))
|
||||
{
|
||||
/* It is Item_field or Item_direct_view_ref) */
|
||||
DBUG_ASSERT(args[0]->type() == Item::FIELD_ITEM ||
|
||||
@@ -2956,7 +2957,7 @@ static bool check_equality_for_exist2in(Item_func *func,
|
||||
else if (args[1]->real_type() == Item::FIELD_ITEM &&
|
||||
args[1]->all_used_tables() != OUTER_REF_TABLE_BIT &&
|
||||
args[0]->all_used_tables() == OUTER_REF_TABLE_BIT &&
|
||||
(allow_subselect || !args[0]->with_subquery()))
|
||||
(allow_subselect || !args[0]->with_subquery))
|
||||
{
|
||||
/* It is Item_field or Item_direct_view_ref) */
|
||||
DBUG_ASSERT(args[1]->type() == Item::FIELD_ITEM ||
|
||||
|
||||
@@ -191,7 +191,6 @@ public:
|
||||
return null_value;
|
||||
}
|
||||
bool fix_fields(THD *thd, Item **ref) override;
|
||||
bool with_subquery() const override { DBUG_ASSERT(fixed); return true; }
|
||||
bool mark_as_dependent(THD *thd, st_select_lex *select, Item *item);
|
||||
void fix_after_pullout(st_select_lex *new_parent, Item **ref,
|
||||
bool merge) override;
|
||||
|
||||
@@ -1124,7 +1124,7 @@ Item_sum_num::fix_fields(THD *thd, Item **ref)
|
||||
if (args[i]->fix_fields_if_needed_for_scalar(thd, &args[i]))
|
||||
return TRUE;
|
||||
set_if_bigger(decimals, args[i]->decimals);
|
||||
m_with_subquery|= args[i]->with_subquery();
|
||||
with_subquery|= args[i]->with_subquery;
|
||||
with_param|= args[i]->with_param;
|
||||
with_window_func|= args[i]->with_window_func;
|
||||
}
|
||||
@@ -1155,7 +1155,7 @@ Item_sum_min_max::fix_fields(THD *thd, Item **ref)
|
||||
if (args[0]->fix_fields_if_needed_for_scalar(thd, &args[0]))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
m_with_subquery= args[0]->with_subquery();
|
||||
with_subquery= args[0]->with_subquery;
|
||||
with_param= args[0]->with_param;
|
||||
with_window_func|= args[0]->with_window_func;
|
||||
|
||||
@@ -1357,7 +1357,7 @@ Item_sum_sp::fix_fields(THD *thd, Item **ref)
|
||||
if (args[i]->fix_fields_if_needed_for_scalar(thd, &args[i]))
|
||||
return TRUE;
|
||||
set_if_bigger(decimals, args[i]->decimals);
|
||||
m_with_subquery|= args[i]->with_subquery();
|
||||
with_subquery|= args[i]->with_subquery;
|
||||
with_window_func|= args[i]->with_window_func;
|
||||
}
|
||||
result_field= NULL;
|
||||
@@ -4229,7 +4229,7 @@ Item_func_group_concat::fix_fields(THD *thd, Item **ref)
|
||||
{
|
||||
if (args[i]->fix_fields_if_needed_for_scalar(thd, &args[i]))
|
||||
return TRUE;
|
||||
m_with_subquery|= args[i]->with_subquery();
|
||||
with_subquery|= args[i]->with_subquery;
|
||||
with_param|= args[i]->with_param;
|
||||
with_window_func|= args[i]->with_window_func;
|
||||
}
|
||||
|
||||
@@ -345,13 +345,11 @@ bool Item_sum_hybrid_simple::fix_fields(THD *thd, Item **ref)
|
||||
if (args[i]->fix_fields_if_needed_for_scalar(thd, &args[i]))
|
||||
return TRUE;
|
||||
with_window_func|= args[i]->with_window_func;
|
||||
with_subquery|= args[i]->with_subquery;
|
||||
}
|
||||
|
||||
for (uint i= 0; i < arg_count && !m_with_subquery; i++)
|
||||
m_with_subquery|= args[i]->with_subquery();
|
||||
|
||||
if (fix_length_and_dec())
|
||||
return true;
|
||||
return TRUE;
|
||||
|
||||
setup_hybrid(thd, args[0]);
|
||||
result_field=0;
|
||||
|
||||
@@ -1776,7 +1776,7 @@ static bool convert_subq_to_sj(JOIN *parent_join, Item_in_subselect *subq_pred)
|
||||
|
||||
// The subqueries were replaced for Item_int(1) earlier
|
||||
subq_pred->reset_strategy(SUBS_SEMI_JOIN); // for subsequent executions
|
||||
/*TODO: also reset the 'm_with_subquery' there. */
|
||||
/*TODO: also reset the 'with_subquery' there. */
|
||||
|
||||
/* n. Adjust the parent_join->table_count counter */
|
||||
uint table_no= parent_join->table_count;
|
||||
|
||||
@@ -2015,10 +2015,10 @@ JOIN::optimize_inner()
|
||||
if (optimize_constant_subqueries())
|
||||
DBUG_RETURN(1);
|
||||
|
||||
if (conds && conds->with_subquery())
|
||||
if (conds && conds->has_subquery())
|
||||
(void) conds->walk(&Item::cleanup_is_expensive_cache_processor,
|
||||
0, (void *) 0);
|
||||
if (having && having->with_subquery())
|
||||
if (having && having->has_subquery())
|
||||
(void) having->walk(&Item::cleanup_is_expensive_cache_processor,
|
||||
0, (void *) 0);
|
||||
|
||||
@@ -13833,7 +13833,7 @@ bool JOIN_TAB::pfs_batch_update(JOIN *join)
|
||||
|
||||
return join->join_tab + join->table_count - 1 == this && // 1
|
||||
type != JT_EQ_REF && type != JT_CONST && type != JT_SYSTEM && // 2
|
||||
(!select_cond || !select_cond->with_subquery()); // 3
|
||||
(!select_cond || !select_cond->has_subquery()); // 3
|
||||
}
|
||||
|
||||
|
||||
@@ -14414,7 +14414,7 @@ remove_const(JOIN *join,ORDER *first_order, COND *cond,
|
||||
*simple_order=0; // Must do a temp table to sort
|
||||
else if (!(order_tables & not_const_tables))
|
||||
{
|
||||
if (order->item[0]->with_subquery())
|
||||
if (order->item[0]->has_subquery())
|
||||
{
|
||||
/*
|
||||
Delay the evaluation of constant ORDER and/or GROUP expressions that
|
||||
|
||||
@@ -9592,10 +9592,10 @@ int spider_set_direct_limit_offset(
|
||||
DBUG_RETURN(FALSE);
|
||||
|
||||
// ignore condition like 1=1
|
||||
#ifdef SPIDER_has_Item_with_subquery
|
||||
if (select_lex->where && select_lex->where->with_subquery())
|
||||
#ifdef SPIDER_has_Item_has_subquery
|
||||
if (select_lex->where && select_lex->where->has_subquery())
|
||||
#else
|
||||
if (select_lex->where && select_lex->where->with_subselect)
|
||||
if (select_lex->where && select_lex->where->with_subquery)
|
||||
#endif
|
||||
DBUG_RETURN(FALSE);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user