diff options
-rw-r--r-- | sql/item_subselect.cc | 29 | ||||
-rw-r--r-- | sql/item_subselect.h | 38 | ||||
-rw-r--r-- | sql/sql_select.cc | 3 |
3 files changed, 34 insertions, 36 deletions
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 79a453333ee..ff318fa5d73 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -60,6 +60,7 @@ void Item_subselect::init(st_select_lex *select_lex, DBUG_ENTER("Item_subselect::init"); DBUG_PRINT("enter", ("select_lex: 0x%lx", (long) select_lex)); unit= select_lex->master_unit(); + thd= unit->thd; if (unit->item) { @@ -76,6 +77,7 @@ void Item_subselect::init(st_select_lex *select_lex, else { SELECT_LEX *outer_select= unit->outer_select(); + DBUG_ASSERT(thd); /* do not take into account expression inside aggregate functions because they can access original table fields @@ -84,9 +86,9 @@ void Item_subselect::init(st_select_lex *select_lex, NO_MATTER : outer_select->parsing_place); if (unit->is_union()) - engine= new subselect_union_engine(unit, result, this); + engine= new subselect_union_engine(thd, unit, result, this); else - engine= new subselect_single_select_engine(select_lex, result, this); + engine= new subselect_single_select_engine(thd, select_lex, result, this); } { SELECT_LEX *upper= unit->outer_select(); @@ -183,7 +185,8 @@ bool Item_subselect::fix_fields(THD *thd_param, Item **ref) bool res; DBUG_ASSERT(fixed == 0); - engine->set_thd((thd= thd_param)); + /* There is no reason to get a different THD. */ + DBUG_ASSERT(thd == thd_param); if (!done_first_fix_fields) { done_first_fix_fields= TRUE; @@ -2384,10 +2387,10 @@ void subselect_engine::set_thd(THD *thd_arg) subselect_single_select_engine:: -subselect_single_select_engine(st_select_lex *select, +subselect_single_select_engine(THD *thd_arg, st_select_lex *select, select_result_interceptor *result_arg, Item_subselect *item_arg) - :subselect_engine(item_arg, result_arg), + :subselect_engine(thd_arg, item_arg, result_arg), prepared(0), executed(0), select_lex(select), join(0) { select_lex->master_unit()->item= item_arg; @@ -2455,10 +2458,10 @@ void subselect_uniquesubquery_engine::cleanup() } -subselect_union_engine::subselect_union_engine(st_select_lex_unit *u, +subselect_union_engine::subselect_union_engine(THD *thd_arg, st_select_lex_unit *u, select_result_interceptor *result_arg, Item_subselect *item_arg) - :subselect_engine(item_arg, result_arg) + :subselect_engine(thd_arg, item_arg, result_arg) { unit= u; if (!result_arg) //out of memory @@ -4164,7 +4167,7 @@ int subselect_hash_sj_engine::exec() if (strategy == PARTIAL_MATCH_MERGE) { pm_engine= - new subselect_rowid_merge_engine((subselect_uniquesubquery_engine*) + new subselect_rowid_merge_engine(thd, (subselect_uniquesubquery_engine*) lookup_engine, tmp_table, count_pm_keys, covering_null_row_width, @@ -4188,7 +4191,7 @@ int subselect_hash_sj_engine::exec() if (strategy == PARTIAL_MATCH_SCAN) { if (!(pm_engine= - new subselect_table_scan_engine((subselect_uniquesubquery_engine*) + new subselect_table_scan_engine(thd, (subselect_uniquesubquery_engine*) lookup_engine, tmp_table, item, result, semi_join_conds->argument_list(), @@ -4623,12 +4626,12 @@ void Ordered_key::print(String *str) subselect_partial_match_engine::subselect_partial_match_engine( - subselect_uniquesubquery_engine *engine_arg, + THD *thd_arg, subselect_uniquesubquery_engine *engine_arg, TABLE *tmp_table_arg, Item_subselect *item_arg, select_result_interceptor *result_arg, List<Item> *equi_join_conds_arg, uint covering_null_row_width_arg) - :subselect_engine(item_arg, result_arg), + :subselect_engine(thd_arg, item_arg, result_arg), tmp_table(tmp_table_arg), lookup_engine(engine_arg), equi_join_conds(equi_join_conds_arg), covering_null_row_width(covering_null_row_width_arg) @@ -5144,13 +5147,13 @@ end: subselect_table_scan_engine::subselect_table_scan_engine( - subselect_uniquesubquery_engine *engine_arg, + THD *thd_arg, subselect_uniquesubquery_engine *engine_arg, TABLE *tmp_table_arg, Item_subselect *item_arg, select_result_interceptor *result_arg, List<Item> *equi_join_conds_arg, uint covering_null_row_width_arg) - :subselect_partial_match_engine(engine_arg, tmp_table_arg, item_arg, + :subselect_partial_match_engine(thd_arg, engine_arg, tmp_table_arg, item_arg, result_arg, equi_join_conds_arg, covering_null_row_width_arg) {} diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 25e42487708..8d590bc4273 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -501,14 +501,15 @@ public: INDEXSUBQUERY_ENGINE, HASH_SJ_ENGINE, ROWID_MERGE_ENGINE, TABLE_SCAN_ENGINE}; - subselect_engine(Item_subselect *si, select_result_interceptor *res) - :thd(0) + subselect_engine(THD *thd_arg, Item_subselect *si, + select_result_interceptor *res) { result= res; item= si; res_type= STRING_RESULT; res_field_type= MYSQL_TYPE_VAR_STRING; maybe_null= 0; + set_thd(thd_arg); } virtual ~subselect_engine() {}; // to satisfy compiler virtual void cleanup()= 0; @@ -572,7 +573,7 @@ class subselect_single_select_engine: public subselect_engine st_select_lex *select_lex; /* corresponding select_lex */ JOIN * join; /* corresponding JOIN structure */ public: - subselect_single_select_engine(st_select_lex *select, + subselect_single_select_engine(THD *thd_arg, st_select_lex *select, select_result_interceptor *result, Item_subselect *item); void cleanup(); @@ -601,7 +602,7 @@ class subselect_union_engine: public subselect_engine { st_select_lex_unit *unit; /* corresponding unit structure */ public: - subselect_union_engine(st_select_lex_unit *u, + subselect_union_engine(THD *thd_arg, st_select_lex_unit *u, select_result_interceptor *result, Item_subselect *item); void cleanup(); @@ -657,10 +658,8 @@ public: // constructor can assign THD because it will be called after JOIN::prepare subselect_uniquesubquery_engine(THD *thd_arg, st_join_table *tab_arg, Item_subselect *subs, Item *where) - :subselect_engine(subs, 0), tab(tab_arg), cond(where) - { - set_thd(thd_arg); - } + :subselect_engine(thd_arg, subs, 0), tab(tab_arg), cond(where) + {} ~subselect_uniquesubquery_engine(); void cleanup(); int prepare(); @@ -812,13 +811,11 @@ protected: public: subselect_hash_sj_engine(THD *thd, Item_subselect *in_predicate, subselect_single_select_engine *old_engine) - :subselect_engine(in_predicate, NULL), tmp_table(NULL), + :subselect_engine(thd, in_predicate, NULL), tmp_table(NULL), is_materialized(FALSE), materialize_engine(old_engine), lookup_engine(NULL), materialize_join(NULL), count_partial_match_columns(0), count_null_only_columns(0), semi_join_conds(NULL), strategy(UNDEFINED) - { - set_thd(thd); - } + {} ~subselect_hash_sj_engine(); bool init_permanent(List<Item> *tmp_columns); @@ -1056,7 +1053,8 @@ protected: protected: virtual bool partial_match()= 0; public: - subselect_partial_match_engine(subselect_uniquesubquery_engine *engine_arg, + subselect_partial_match_engine(THD *thd_arg, + subselect_uniquesubquery_engine *engine_arg, TABLE *tmp_table_arg, Item_subselect *item_arg, select_result_interceptor *result_arg, List<Item> *equi_join_conds_arg, @@ -1148,19 +1146,18 @@ protected: bool test_null_row(rownum_t row_num); bool partial_match(); public: - subselect_rowid_merge_engine(subselect_uniquesubquery_engine *engine_arg, + subselect_rowid_merge_engine(THD *thd_arg, + subselect_uniquesubquery_engine *engine_arg, TABLE *tmp_table_arg, uint keys_count_arg, uint covering_null_row_width_arg, Item_subselect *item_arg, select_result_interceptor *result_arg, List<Item> *equi_join_conds_arg) - :subselect_partial_match_engine(engine_arg, tmp_table_arg, item_arg, - result_arg, equi_join_conds_arg, + :subselect_partial_match_engine(thd_arg, engine_arg, tmp_table_arg, + item_arg, result_arg, equi_join_conds_arg, covering_null_row_width_arg), keys_count(keys_count_arg), non_null_key(NULL) - { - thd= lookup_engine->get_thd(); - } + {} ~subselect_rowid_merge_engine(); bool init(MY_BITMAP *non_null_key_parts, MY_BITMAP *partial_match_key_parts); void cleanup(); @@ -1173,7 +1170,8 @@ class subselect_table_scan_engine: public subselect_partial_match_engine protected: bool partial_match(); public: - subselect_table_scan_engine(subselect_uniquesubquery_engine *engine_arg, + subselect_table_scan_engine(THD *thd_arg, + subselect_uniquesubquery_engine *engine_arg, TABLE *tmp_table_arg, Item_subselect *item_arg, select_result_interceptor *result_arg, List<Item> *equi_join_conds_arg, diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 2228d725c98..51eac55b553 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -19518,10 +19518,7 @@ void TABLE_LIST::print(THD *thd, table_map eliminated_tables, String *str, void st_select_lex::print(THD *thd, String *str, enum_query_type query_type) { - /* TODO: thd may not be set for sub queries, but this should be fixed */ DBUG_ASSERT(thd); - if (!thd) - thd= current_thd; str->append(STRING_WITH_LEN("select ")); |