diff options
author | unknown <bell@sanja.is.com.ua> | 2005-01-18 21:58:12 +0200 |
---|---|---|
committer | unknown <bell@sanja.is.com.ua> | 2005-01-18 21:58:12 +0200 |
commit | 957a5cb45e0695be9d5063c1c8be1c8721bc0244 (patch) | |
tree | 1a0db956d03bb50d75e1d2eb7c6aac475058a940 /sql/table.cc | |
parent | 8bdd5ebc3c6ce40d9c46c2861e8904aa77924cd1 (diff) | |
download | mariadb-git-957a5cb45e0695be9d5063c1c8be1c8721bc0244.tar.gz |
fixed problem in resolving items of outer query in subqueries in view (BUG#6394)
mysql-test/r/view.result:
Resolving view fields in subqueries in VIEW
mysql-test/t/view.test:
Resolving view fields in subqueries in VIEW
sql/table.cc:
emulation of main table list by ancestor list added to view preparation routine to allow subqueries resolve item from outer query corectly
Diffstat (limited to 'sql/table.cc')
-rw-r--r-- | sql/table.cc | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/sql/table.cc b/sql/table.cc index 71198993009..1fb40f5eb3a 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1687,6 +1687,7 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, Field_translator *transl; SELECT_LEX *select= &view->select_lex; SELECT_LEX *current_select_save= thd->lex->current_select; + byte *main_table_list_save= thd->lex->select_lex.table_list.first; Item *item; TABLE_LIST *tbl; List_iterator_fast<Item> it(select->item_list); @@ -1709,8 +1710,13 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, if (field_translation) { DBUG_PRINT("info", ("there are already translation table")); - /* prevent look up in SELECTs tree */ + /* + prevent look up in SELECTs tree, and emulate main table list by + ancestor table list for subquery processing + */ thd->lex->current_select= &thd->lex->select_lex; + thd->lex->select_lex.table_list.first= (byte *)ancestor; + thd->lex->select_lex.no_wrap_view_item= 1; thd->set_query_id= 1; /* this view was prepared already on previous PS/SP execution */ @@ -1755,8 +1761,13 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, DBUG_RETURN(1); } - /* prevent look up in SELECTs tree */ + /* + prevent look up in SELECTs tree, and emulate main table list by ancestor + table list for subquery processing + */ thd->lex->current_select= &thd->lex->select_lex; + thd->lex->select_lex.table_list.first= (byte *)ancestor; + thd->lex->select_lex.no_wrap_view_item= 1; /* @@ -1901,6 +1912,7 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, ok: thd->lex->select_lex.no_wrap_view_item= save_wrapper; thd->lex->current_select= current_select_save; + thd->lex->select_lex.table_list.first= main_table_list_save; thd->set_query_id= save_set_query_id; thd->allow_sum_func= save_allow_sum_func; DBUG_RETURN(0); @@ -1915,6 +1927,7 @@ err: } thd->lex->select_lex.no_wrap_view_item= save_wrapper; thd->lex->current_select= current_select_save; + thd->lex->select_lex.table_list.first= main_table_list_save; thd->set_query_id= save_set_query_id; thd->allow_sum_func= save_allow_sum_func; DBUG_RETURN(1); |