diff options
author | Sergei Golubchik <serg@mariadb.org> | 2018-05-05 14:01:59 +0200 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2018-05-05 14:01:59 +0200 |
commit | 9989c26bc99c90d3047a7b3e20e0800b62f62300 (patch) | |
tree | 0a2b04288168bf08530568c94c326f2e9a98a397 /sql/opt_subselect.cc | |
parent | 39d248fa555350756a569d766f11eec4c65c5b16 (diff) | |
parent | 3c07ed141c2ed885dea13fbce8603afce6250590 (diff) | |
download | mariadb-git-9989c26bc99c90d3047a7b3e20e0800b62f62300.tar.gz |
Merge branch '10.0' into 10.1
Diffstat (limited to 'sql/opt_subselect.cc')
-rw-r--r-- | sql/opt_subselect.cc | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index 05cc8db057a..89338928cb5 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -3744,22 +3744,30 @@ bool setup_sj_materialization_part1(JOIN_TAB *sjm_tab) sjm= emb_sj_nest->sj_mat_info; thd= tab->join->thd; /* First the calls come to the materialization function */ - //List<Item> &item_list= emb_sj_nest->sj_subq_pred->unit->first_select()->item_list; - + DBUG_ASSERT(sjm->is_used); /* Set up the table to write to, do as select_union::create_result_table does */ sjm->sjm_table_param.init(); sjm->sjm_table_param.bit_fields_as_long= TRUE; - //List_iterator<Item> it(item_list); SELECT_LEX *subq_select= emb_sj_nest->sj_subq_pred->unit->first_select(); - Item **p_item= subq_select->ref_pointer_array; - Item **p_end= p_item + subq_select->item_list.elements; - //while((right_expr= it++)) - for(;p_item != p_end; p_item++) - sjm->sjm_table_cols.push_back(*p_item, thd->mem_root); - + List_iterator<Item> it(subq_select->item_list); + Item *item; + while((item= it++)) + { + /* + This semi-join replaced the subquery (subq_select) and so on + re-executing it will not be prepared. To use the Items from its + select list we have to prepare (fix_fields) them + */ + if (!item->fixed && item->fix_fields(thd, it.ref())) + DBUG_RETURN(TRUE); + item= *(it.ref()); // it can be changed by fix_fields + DBUG_ASSERT(!item->name_length || item->name_length == strlen(item->name)); + sjm->sjm_table_cols.push_back(item, thd->mem_root); + } + sjm->sjm_table_param.field_count= subq_select->item_list.elements; sjm->sjm_table_param.force_not_null_cols= TRUE; |