mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
join_free now is method of JOIN and commented
dependence should mean uncacheability sql/item_subselect.cc: dependence should mean uncacheability sql/sql_lex.cc: dependence should mean uncacheability sql/sql_select.cc: join_free now is method of JOIN and commented sql/sql_select.h: join_free now is method of JOIN
This commit is contained in:
@@ -622,10 +622,10 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||||||
(char *)"<no matter>",
|
(char *)"<no matter>",
|
||||||
(char *)in_left_expr_name);
|
(char *)in_left_expr_name);
|
||||||
|
|
||||||
unit->dependent= 1;
|
unit->dependent= unit->uncacheable= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
select_lex->dependent= 1;
|
select_lex->dependent= select_lex->uncacheable= 1;
|
||||||
Item *item;
|
Item *item;
|
||||||
|
|
||||||
item= (Item*) select_lex->item_list.head();
|
item= (Item*) select_lex->item_list.head();
|
||||||
@@ -747,13 +747,12 @@ Item_in_subselect::row_value_transformer(JOIN *join,
|
|||||||
DBUG_RETURN(RES_ERROR);
|
DBUG_RETURN(RES_ERROR);
|
||||||
}
|
}
|
||||||
thd->lex.current_select= current;
|
thd->lex.current_select= current;
|
||||||
|
unit->dependent= unit->uncacheable= 1;
|
||||||
unit->dependent= 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint n= left_expr->cols();
|
uint n= left_expr->cols();
|
||||||
|
|
||||||
select_lex->dependent= 1;
|
select_lex->dependent= select_lex->uncacheable= 1;
|
||||||
select_lex->setup_ref_array(thd,
|
select_lex->setup_ref_array(thd,
|
||||||
select_lex->order_list.elements +
|
select_lex->order_list.elements +
|
||||||
select_lex->group_list.elements);
|
select_lex->group_list.elements);
|
||||||
|
@@ -1195,16 +1195,16 @@ void st_select_lex::mark_as_dependent(SELECT_LEX *last)
|
|||||||
found table as depended (of select where was found table)
|
found table as depended (of select where was found table)
|
||||||
*/
|
*/
|
||||||
for (SELECT_LEX *s= this;
|
for (SELECT_LEX *s= this;
|
||||||
s &&s != last;
|
s && s != last;
|
||||||
s= s->outer_select())
|
s= s->outer_select())
|
||||||
if ( !s->dependent )
|
if ( !s->dependent )
|
||||||
{
|
{
|
||||||
// Select is dependent of outer select
|
// Select is dependent of outer select
|
||||||
s->dependent= 1;
|
s->dependent= s->uncacheable= 1;
|
||||||
s->master_unit()->dependent= 1;
|
SELECT_LEX_UNIT *munit= s->master_unit();
|
||||||
|
munit->dependent= munit->uncacheable= 1;
|
||||||
//Tables will be reopened many times
|
//Tables will be reopened many times
|
||||||
for (TABLE_LIST *tbl=
|
for (TABLE_LIST *tbl= s->get_table_list();
|
||||||
s->get_table_list();
|
|
||||||
tbl;
|
tbl;
|
||||||
tbl= tbl->next)
|
tbl= tbl->next)
|
||||||
tbl->shared= 1;
|
tbl->shared= 1;
|
||||||
|
@@ -62,7 +62,6 @@ static store_key *get_store_key(THD *thd,
|
|||||||
static bool make_simple_join(JOIN *join,TABLE *tmp_table);
|
static bool make_simple_join(JOIN *join,TABLE *tmp_table);
|
||||||
static bool make_join_select(JOIN *join,SQL_SELECT *select,COND *item);
|
static bool make_join_select(JOIN *join,SQL_SELECT *select,COND *item);
|
||||||
static void make_join_readinfo(JOIN *join,uint options);
|
static void make_join_readinfo(JOIN *join,uint options);
|
||||||
static void join_free(JOIN *join, bool full);
|
|
||||||
static bool only_eq_ref_tables(JOIN *join, ORDER *order, table_map tables);
|
static bool only_eq_ref_tables(JOIN *join, ORDER *order, table_map tables);
|
||||||
static void update_depend_map(JOIN *join);
|
static void update_depend_map(JOIN *join);
|
||||||
static void update_depend_map(JOIN *join, ORDER *order);
|
static void update_depend_map(JOIN *join, ORDER *order);
|
||||||
@@ -1232,7 +1231,7 @@ JOIN::exec()
|
|||||||
DBUG_PRINT("info",("Creating group table"));
|
DBUG_PRINT("info",("Creating group table"));
|
||||||
|
|
||||||
/* Free first data from old join */
|
/* Free first data from old join */
|
||||||
join_free(curr_join, 0);
|
curr_join->join_free(0);
|
||||||
if (make_simple_join(curr_join, curr_tmp_table))
|
if (make_simple_join(curr_join, curr_tmp_table))
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
calc_group_buffer(curr_join, group_list);
|
calc_group_buffer(curr_join, group_list);
|
||||||
@@ -1327,7 +1326,7 @@ JOIN::exec()
|
|||||||
if (curr_tmp_table->distinct)
|
if (curr_tmp_table->distinct)
|
||||||
curr_join->select_distinct=0; /* Each row is unique */
|
curr_join->select_distinct=0; /* Each row is unique */
|
||||||
|
|
||||||
join_free(curr_join, 0); /* Free quick selects */
|
curr_join->join_free(0); /* Free quick selects */
|
||||||
if (select_distinct && ! group_list)
|
if (select_distinct && ! group_list)
|
||||||
{
|
{
|
||||||
thd->proc_info="Removing duplicates";
|
thd->proc_info="Removing duplicates";
|
||||||
@@ -1501,7 +1500,7 @@ JOIN::cleanup()
|
|||||||
}
|
}
|
||||||
|
|
||||||
lock=0; // It's faster to unlock later
|
lock=0; // It's faster to unlock later
|
||||||
join_free(this, 1);
|
join_free(1);
|
||||||
if (exec_tmp_table1)
|
if (exec_tmp_table1)
|
||||||
free_tmp_table(thd, exec_tmp_table1);
|
free_tmp_table(thd, exec_tmp_table1);
|
||||||
if (exec_tmp_table2)
|
if (exec_tmp_table2)
|
||||||
@@ -3667,26 +3666,37 @@ bool error_if_full_join(JOIN *join)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
/*
|
||||||
join_free(JOIN *join, bool full)
|
Free resources of given join
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
JOIN::join_free()
|
||||||
|
fill - true if we should free all resources, call with full==1 should be
|
||||||
|
last, before it this function can be called with full==0
|
||||||
|
|
||||||
|
NOTE: with subquery this function definitely will be called several times,
|
||||||
|
but even for simple query it can be called several times.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
JOIN::join_free(bool full)
|
||||||
{
|
{
|
||||||
JOIN_TAB *tab,*end;
|
JOIN_TAB *tab,*end;
|
||||||
DBUG_ENTER("join_free");
|
DBUG_ENTER("join_free");
|
||||||
|
|
||||||
if (join->table)
|
if (table)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Only a sorted table may be cached. This sorted table is always the
|
Only a sorted table may be cached. This sorted table is always the
|
||||||
first non const table in join->table
|
first non const table in join->table
|
||||||
*/
|
*/
|
||||||
if (join->tables > join->const_tables) // Test for not-const tables
|
if (tables > const_tables) // Test for not-const tables
|
||||||
{
|
{
|
||||||
free_io_cache(join->table[join->const_tables]);
|
free_io_cache(table[const_tables]);
|
||||||
filesort_free_buffers(join->table[join->const_tables]);
|
filesort_free_buffers(table[const_tables]);
|
||||||
}
|
}
|
||||||
if (!full && join->select_lex->dependent)
|
if (!full && select_lex->uncacheable)
|
||||||
{
|
{
|
||||||
for (tab=join->join_tab,end=tab+join->tables ; tab != end ; tab++)
|
for (tab= join_tab, end= tab+tables; tab != end; tab++)
|
||||||
{
|
{
|
||||||
if (tab->table)
|
if (tab->table)
|
||||||
{
|
{
|
||||||
@@ -3703,7 +3713,7 @@ join_free(JOIN *join, bool full)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (tab=join->join_tab,end=tab+join->tables ; tab != end ; tab++)
|
for (tab= join_tab, end= tab+tables; tab != end; tab++)
|
||||||
{
|
{
|
||||||
delete tab->select;
|
delete tab->select;
|
||||||
delete tab->quick;
|
delete tab->quick;
|
||||||
@@ -3729,25 +3739,25 @@ join_free(JOIN *join, bool full)
|
|||||||
}
|
}
|
||||||
end_read_record(&tab->read_record);
|
end_read_record(&tab->read_record);
|
||||||
}
|
}
|
||||||
join->table= 0;
|
table= 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
We are not using tables anymore
|
We are not using tables anymore
|
||||||
Unlock all tables. We may be in an INSERT .... SELECT statement.
|
Unlock all tables. We may be in an INSERT .... SELECT statement.
|
||||||
*/
|
*/
|
||||||
if ((full || !join->select_lex->dependent) &&
|
if ((full || !select_lex->uncacheable) &&
|
||||||
join->lock && join->thd->lock &&
|
lock && thd->lock &&
|
||||||
!(join->select_options & SELECT_NO_UNLOCK))
|
!(select_options & SELECT_NO_UNLOCK))
|
||||||
{
|
{
|
||||||
mysql_unlock_read_tables(join->thd, join->lock);// Don't free join->lock
|
mysql_unlock_read_tables(thd, lock);// Don't free join->lock
|
||||||
join->lock=0;
|
lock=0;
|
||||||
}
|
}
|
||||||
if (full)
|
if (full)
|
||||||
{
|
{
|
||||||
join->group_fields.delete_elements();
|
group_fields.delete_elements();
|
||||||
join->tmp_table_param.copy_funcs.delete_elements();
|
tmp_table_param.copy_funcs.delete_elements();
|
||||||
join->tmp_table_param.cleanup();
|
tmp_table_param.cleanup();
|
||||||
}
|
}
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
@@ -5459,7 +5469,7 @@ do_select(JOIN *join,List<Item> *fields,TABLE *table,Procedure *procedure)
|
|||||||
The following will unlock all cursors if the command wasn't an
|
The following will unlock all cursors if the command wasn't an
|
||||||
update command
|
update command
|
||||||
*/
|
*/
|
||||||
join_free(join, 0); // Unlock all cursors
|
join->join_free(0); // Unlock all cursors
|
||||||
if (join->result->send_eof())
|
if (join->result->send_eof())
|
||||||
error= 1; // Don't send error
|
error= 1; // Don't send error
|
||||||
}
|
}
|
||||||
|
@@ -280,6 +280,7 @@ class JOIN :public Sql_alloc
|
|||||||
Item_sum ***func);
|
Item_sum ***func);
|
||||||
int rollup_send_data(uint idx);
|
int rollup_send_data(uint idx);
|
||||||
bool test_in_subselect(Item **where);
|
bool test_in_subselect(Item **where);
|
||||||
|
void join_free(bool full);
|
||||||
void clear();
|
void clear();
|
||||||
bool save_join_tab();
|
bool save_join_tab();
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user