diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-12-01 14:55:46 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-12-01 14:55:46 +0200 |
commit | 81ab9ea63f5d3ad4909bb75552008d6b035a371b (patch) | |
tree | 6e65113d85d36c9f488da15540ddd601e7641fee /sql/sql_derived.cc | |
parent | c537576495e1e651bf3dc63e5a569fcddd9fbec8 (diff) | |
parent | e6b3e38d62d13206ae982fc7b740d5d8024b207a (diff) | |
download | mariadb-git-81ab9ea63f5d3ad4909bb75552008d6b035a371b.tar.gz |
Merge 10.2 into 10.3
Diffstat (limited to 'sql/sql_derived.cc')
-rw-r--r-- | sql/sql_derived.cc | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index 11d3a13b8b9..eb840e02a27 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -1271,7 +1271,8 @@ bool pushdown_cond_for_derived(THD *thd, Item *cond, TABLE_LIST *derived) DBUG_RETURN(false); st_select_lex_unit *unit= derived->get_unit(); - st_select_lex *sl= unit->first_select(); + st_select_lex *first_sl= unit->first_select(); + st_select_lex *sl= first_sl; if (derived->prohibit_cond_pushdown) DBUG_RETURN(false); @@ -1419,7 +1420,24 @@ bool pushdown_cond_for_derived(THD *thd, Item *cond, TABLE_LIST *derived) if (!extracted_cond_copy) continue; } - + + /* + Rename the columns of all non-first selects of a union to be compatible + by names with the columns of the first select. It will allow to use copies + of the same expression pushed into having clauses of different selects. + */ + if (sl != first_sl) + { + DBUG_ASSERT(sl->item_list.elements == first_sl->item_list.elements); + List_iterator_fast<Item> it(sl->item_list); + List_iterator_fast<Item> nm_it(unit->types); + Item * item; + while((item= it++)) + { + item->share_name_with(nm_it++); + } + } + /* Transform the references to the 'derived' columns from the condition pushed into the having clause of sl to make them usable in the new context |