diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2021-04-21 10:20:20 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2021-04-21 10:20:20 +0300 |
commit | 28f01f82e1cb682566017b52017469be7638dd49 (patch) | |
tree | d496cb0936d25973b95f6eb591508c2e493032b8 /sql/item_subselect.cc | |
parent | a3099a3b4a394da360b5c1e7ae6dc985ae2f7f2f (diff) | |
parent | 80ed136e6dd4a021b1fc9b7bd7077bf989c3d247 (diff) | |
download | mariadb-git-bb-10.6-merge.tar.gz |
WIP merge 10.5 to 10.6bb-10.6-merge
FIXME: Disabled tests due to upgrading libmariadb:
main.mysql_client_test main.mysql_client_test_nonblock main.mysql_client_test_comp
Diffstat (limited to 'sql/item_subselect.cc')
-rw-r--r-- | sql/item_subselect.cc | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 76b09efec17..d30042a72ef 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2002, 2016, Oracle and/or its affiliates. - Copyright (c) 2010, 2016, MariaDB + Copyright (c) 2010, 2021, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -685,6 +685,31 @@ bool Item_subselect::is_expensive() } +static +int walk_items_for_table_list(Item_processor processor, + bool walk_subquery, void *argument, + List<TABLE_LIST>& join_list) +{ + List_iterator<TABLE_LIST> li(join_list); + int res; + while (TABLE_LIST *table= li++) + { + if (table->on_expr) + { + if ((res= table->on_expr->walk(processor, walk_subquery, argument))) + return res; + } + if (table->nested_join) + { + if ((res= walk_items_for_table_list(processor, walk_subquery, argument, + table->nested_join->join_list))) + return res; + } + } + return 0; +} + + bool Item_subselect::unknown_splocal_processor(void *argument) { SELECT_LEX *sl= unit->first_select(); @@ -750,7 +775,10 @@ bool Item_subselect::walk(Item_processor processor, bool walk_subquery, if (lex->having && (lex->having)->walk(processor, walk_subquery, argument)) return 1; - /* TODO: why does this walk WHERE/HAVING but not ON expressions of outer joins? */ + + if (walk_items_for_table_list(processor, walk_subquery, argument, + *lex->join_list)) + return 1; while ((item=li++)) { |