diff options
author | unknown <sanja@montyprogram.com> | 2012-12-05 21:06:00 +0200 |
---|---|---|
committer | unknown <sanja@montyprogram.com> | 2012-12-05 21:06:00 +0200 |
commit | 0aad592f49f0fb790f712aa6a644653cf9a0218f (patch) | |
tree | d713e519c8c297ec3d018de78060b8e6c44d097a /sql/table.cc | |
parent | b01fbb8e48327300b09c90ca94b9ba7b655adbb6 (diff) | |
download | mariadb-git-0aad592f49f0fb790f712aa6a644653cf9a0218f.tar.gz |
MDEV-3914 fix.
Fixed algorithm of detecting of first real table in view/subquery-in-the-FROM-clase.
Diffstat (limited to 'sql/table.cc')
-rw-r--r-- | sql/table.cc | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/sql/table.cc b/sql/table.cc index d42fd14120c..abdd0b0f9e6 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -4457,19 +4457,33 @@ TABLE *TABLE_LIST::get_real_join_table() DBUG_ASSERT(tbl->derived == NULL || tbl->derived->first_select()->next_select() == NULL); - if (tbl->table) - table= tbl->table; - tbl= (tbl->view != NULL ? - tbl->view->select_lex.get_table_list() : - tbl->derived->first_select()->get_table_list()); - - /* find left table in outer join on this level */ - while(tbl->outer_join & JOIN_TYPE_RIGHT) { - DBUG_ASSERT(tbl->next_local); - tbl= tbl->next_local; + List_iterator_fast<TABLE_LIST> ti; + { + List_iterator_fast<TABLE_LIST> + ti(tbl->view != NULL ? + tbl->view->select_lex.top_join_list : + tbl->derived->first_select()->top_join_list); + for (;;) + { + tbl= NULL; + /* + Find left table in outer join on this level + (the list is reverted). + */ + for (TABLE_LIST *t= ti++; t; t= ti++) + tbl= t; + /* + It is impossible that the list is empty + so tbl can't be NULL after above loop. + */ + if (!tbl->nested_join) + break; + /* go deeper if we've found nested join */ + ti= tbl->nested_join->join_list; + } + } } - } return tbl->table; |