diff options
Diffstat (limited to 'sql/sql_lex.cc')
-rw-r--r-- | sql/sql_lex.cc | 52 |
1 files changed, 35 insertions, 17 deletions
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index f5382e6df99..586075b2f69 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1537,11 +1537,17 @@ void st_select_lex::print_limit(THD *thd, String *str) /* - Check is merging algorithm can be used on this VIEW + Check whether the merging algorithm can be used on this VIEW SYNOPSIS st_lex::can_be_merged() + DESCRIPTION + We can apply merge algorithm if it is single SELECT view (we do not + count SELECTs of underlying views) and we have not grpouping, ordering, + HAVING clause, aggregate functions, DISTINCT clause, LIMIT clause and + several underlying tables. + RETURN FALSE - only temporary table algorithm can be used TRUE - merge algorithm can be used @@ -1569,12 +1575,18 @@ bool st_lex::can_be_merged() select_lex.select_limit == HA_POS_ERROR); } + /* check if command can use VIEW with MERGE algorithm (for top VIEWs) SYNOPSIS st_lex::can_use_merged() + DESCRIPTION + Only listed here commands can use merge algorithm in top level + SELECT_LEX (for subqueries will be used merge algorithm if + st_lex::can_not_use_merged() is not TRUE). + RETURN FALSE - command can't use merged VIEWs TRUE - VIEWs with MERGE algorithms can be used @@ -1601,11 +1613,15 @@ bool st_lex::can_use_merged() } /* - check if command can't use merged views in any part of command + Check if command can't use merged views in any part of command SYNOPSIS st_lex::can_not_use_merged() + DESCRIPTION + Temporary table algorithm will be used on all SELECT levels for queries + listed here (see also st_lex::can_use_merged()). + RETURN FALSE - command can't use merged VIEWs TRUE - VIEWs with MERGE algorithms can be used @@ -1673,16 +1689,16 @@ void st_select_lex_unit::set_limit(SELECT_LEX *values, /* - Unlink first table from global table list and first table from outer select - list (lex->select_lex) + Unlink the first table from the global table list and the first table from + outer select (lex->select_lex) local list SYNOPSIS unlink_first_table() - link_to_local Set to 1 if caller should link this table to local + link_to_local Set to 1 if caller should link this table to local list NOTES - We rely on fact that first table in both list are same or local list - is empty + We assume that first tables in both lists is the same table or the local + list is empty. RETURN 0 If 'query_tables' == 0 @@ -1711,8 +1727,8 @@ TABLE_LIST *st_lex::unlink_first_table(bool *link_to_local) select_lex.table_list.elements--; //safety first->next_local= 0; /* - reorder global list to keep first tables the same in both lists - (if it is need) + Ensure that the global list has the same first table as the local + list. */ first_lists_tables_same(); } @@ -1729,11 +1745,12 @@ TABLE_LIST *st_lex::unlink_first_table(bool *link_to_local) st_lex::first_lists_tables_same() NOTES - In many cases first table of main SELECT_LEX have special meaning => - check that it is first table in global list and relink it first in - queries_tables list if it is necessary (we need such relinking only - for queries with subqueries in select list, in this case tables of - subqueries will go to global list first) + In many cases (for example, usual INSERT/DELETE/...) the first table of + main SELECT_LEX have special meaning => check that it is the first table + in global list and re-link to be first in the global list if it is + necessary. We need such re-linking only for queries with sub-queries in + the select list, as only in this case tables of sub-queries will go to + the global list first. */ void st_lex::first_lists_tables_same() @@ -1744,14 +1761,15 @@ void st_lex::first_lists_tables_same() TABLE_LIST *next; if (query_tables_last == &first_table->next_global) query_tables_last= first_table->prev_global; - + if ((next= *first_table->prev_global= first_table->next_global)) next->prev_global= first_table->prev_global; /* include in new place */ first_table->next_global= query_tables; /* - we are sure that above is not 0, because first_table was not - first table in global list => we can do following without check + We are sure that query_tables is not 0, because first_table was not + first table in the global list => we can use + query_tables->prev_global without check of query_tables */ query_tables->prev_global= &first_table->next_global; first_table->prev_global= &query_tables; |