summaryrefslogtreecommitdiff
path: root/sql/sql_derived.cc
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2020-12-02 18:29:49 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2020-12-02 18:29:49 +0200
commit6a1e655cb0d400d8ed44fbfd22151b1d3e7f22d8 (patch)
tree3915bd814fa0ea7c0219b258a1fb458846a5b0bd /sql/sql_derived.cc
parente76e12886fd37094d95ca40b8cce45ca3ef28021 (diff)
parent24ec8eaf66ecd864529309c5edcb8dd6b685f2aa (diff)
downloadmariadb-git-6a1e655cb0d400d8ed44fbfd22151b1d3e7f22d8.tar.gz
Merge 10.4 into 10.5
Diffstat (limited to 'sql/sql_derived.cc')
-rw-r--r--sql/sql_derived.cc19
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;
/*