diff options
author | bell@sanja.is.com.ua <> | 2003-10-17 15:18:57 +0300 |
---|---|---|
committer | bell@sanja.is.com.ua <> | 2003-10-17 15:18:57 +0300 |
commit | 2586a56be5998bbe716f3fa7d0ba2a9b92dfdfad (patch) | |
tree | 61860c9d0fd0b65720c9c2e02f86c909b29c5a39 /sql/sql_lex.cc | |
parent | e8216b44a8ef2953b4ead53a49cd2ff1c7a93817 (diff) | |
download | mariadb-git-2586a56be5998bbe716f3fa7d0ba2a9b92dfdfad.tar.gz |
fixed deleting derived table tree after using (BUG#1536)
Diffstat (limited to 'sql/sql_lex.cc')
-rw-r--r-- | sql/sql_lex.cc | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 80d698dfc26..5b05bf096cb 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1097,6 +1097,16 @@ void st_select_lex_node::exclude() */ } + +/* + Exclude level of current unit from tree of SELECTs + + SYNOPSYS + st_select_lex_unit::exclude_level() + + NOTE: units which belong to current will be brought up on level of + currernt unit +*/ void st_select_lex_unit::exclude_level() { SELECT_LEX_UNIT *units= 0, **units_last= &units; @@ -1125,6 +1135,30 @@ void st_select_lex_unit::exclude_level() (*prev)= next; } + +/* + Exclude subtree of current unit from tree of SELECTs + + SYNOPSYS + st_select_lex_unit::exclude_tree() +*/ +void st_select_lex_unit::exclude_tree() +{ + SELECT_LEX_UNIT *units= 0, **units_last= &units; + for (SELECT_LEX *sl= first_select(); sl; sl= sl->next_select()) + { + if (sl->link_prev && (*sl->link_prev= sl->link_next)) + sl->link_next->link_prev= sl->link_prev; + + for (SELECT_LEX_UNIT *u= sl->first_inner_unit(); u; u= u->next_unit()) + { + u->exclude_level(); + } + } + (*prev)= next; +} + + /* st_select_lex_node::mark_as_dependent mark all st_select_lex struct from this to 'last' as dependent @@ -1135,7 +1169,6 @@ void st_select_lex_unit::exclude_level() NOTE 'last' should be reachable from this st_select_lex_node - */ void st_select_lex::mark_as_dependent(SELECT_LEX *last) |