summaryrefslogtreecommitdiff
path: root/sql/sql_lex.cc
diff options
context:
space:
mode:
authorbell@sanja.is.com.ua <>2003-10-17 15:18:57 +0300
committerbell@sanja.is.com.ua <>2003-10-17 15:18:57 +0300
commit2586a56be5998bbe716f3fa7d0ba2a9b92dfdfad (patch)
tree61860c9d0fd0b65720c9c2e02f86c909b29c5a39 /sql/sql_lex.cc
parente8216b44a8ef2953b4ead53a49cd2ff1c7a93817 (diff)
downloadmariadb-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.cc35
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)