Commit 1e1d7b17 authored by unknown's avatar unknown

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
parent 4b8568a7
...@@ -622,10 +622,10 @@ Item_in_subselect::single_value_transformer(JOIN *join, ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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() ...@@ -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() ...@@ -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() ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 ...@@ -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();
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment