summaryrefslogtreecommitdiff
path: root/sql/table.cc
diff options
context:
space:
mode:
authorunknown <sanja@montyprogram.com>2012-12-05 21:06:00 +0200
committerunknown <sanja@montyprogram.com>2012-12-05 21:06:00 +0200
commit0aad592f49f0fb790f712aa6a644653cf9a0218f (patch)
treed713e519c8c297ec3d018de78060b8e6c44d097a /sql/table.cc
parentb01fbb8e48327300b09c90ca94b9ba7b655adbb6 (diff)
downloadmariadb-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.cc36
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;