diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-12-02 18:29:49 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-12-02 18:29:49 +0200 |
commit | 6a1e655cb0d400d8ed44fbfd22151b1d3e7f22d8 (patch) | |
tree | 3915bd814fa0ea7c0219b258a1fb458846a5b0bd /sql/sql_derived.cc | |
parent | e76e12886fd37094d95ca40b8cce45ca3ef28021 (diff) | |
parent | 24ec8eaf66ecd864529309c5edcb8dd6b685f2aa (diff) | |
download | mariadb-git-6a1e655cb0d400d8ed44fbfd22151b1d3e7f22d8.tar.gz |
Merge 10.4 into 10.5
Diffstat (limited to 'sql/sql_derived.cc')
-rw-r--r-- | sql/sql_derived.cc | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index 428e7b1d261..a9155f361b5 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -1401,7 +1401,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); @@ -1460,6 +1461,20 @@ 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); + while (Item *item= it++) + item->share_name_with(nm_it++); + } + /* Collect fields that are used in the GROUP BY of sl */ if (sl->have_window_funcs()) { @@ -1480,7 +1495,7 @@ bool pushdown_cond_for_derived(THD *thd, Item *cond, TABLE_LIST *derived) &remaining_cond, &Item::derived_field_transformer_for_where, (uchar *) sl); - + if (!remaining_cond) continue; /* |