diff options
author | Sergei Golubchik <serg@mariadb.org> | 2018-05-11 13:12:18 +0200 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2018-05-11 13:15:10 +0200 |
commit | c9717dc0190731c656cce31fa6e39a3db123e3af (patch) | |
tree | 3db056a3f50e565294d127edb5339afb0a994749 /sql/opt_subselect.cc | |
parent | 33721d91389759a917463a044fbd6f0b7654d629 (diff) | |
parent | 1d411a8a440922f0538c1be254d6f4396af453a1 (diff) | |
download | mariadb-git-c9717dc0190731c656cce31fa6e39a3db123e3af.tar.gz |
Merge branch '10.2' into 10.3
Diffstat (limited to 'sql/opt_subselect.cc')
-rw-r--r-- | sql/opt_subselect.cc | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index ef69f27bb1e..1d2fd5548a5 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -3708,8 +3708,7 @@ 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 @@ -3718,10 +3717,22 @@ bool setup_sj_materialization_part1(JOIN_TAB *sjm_tab) sjm->sjm_table_param.bit_fields_as_long= TRUE; SELECT_LEX *subq_select= emb_sj_nest->sj_subq_pred->unit->first_select(); const LEX_CSTRING sj_materialize_name= { STRING_WITH_LEN("sj-materialize") }; - Ref_ptr_array p_items= subq_select->ref_pointer_array; - for (uint i= 0; i < subq_select->item_list.elements; i++) - sjm->sjm_table_cols.push_back(p_items[i], 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.str)); + 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; |