summaryrefslogtreecommitdiff
path: root/sql/item_subselect.cc
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2016-06-28 11:25:59 +0200
committerSergei Golubchik <serg@mariadb.org>2016-06-28 11:25:59 +0200
commit0fdb17e6c3f50ae22eb97b6363bcbd8b0cd9e040 (patch)
treed158f4c46bac5acfa4ce9db59c7cad897dd7043b /sql/item_subselect.cc
parent6dfe3fb2bb6903524966b6e51df05f317e714814 (diff)
parent79f852a069fb6ba5e18fd66ea2a24fa91c245c24 (diff)
downloadmariadb-git-0fdb17e6c3f50ae22eb97b6363bcbd8b0cd9e040.tar.gz
Merge branch '5.5' into 10.0
Diffstat (limited to 'sql/item_subselect.cc')
-rw-r--r--sql/item_subselect.cc58
1 files changed, 35 insertions, 23 deletions
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc
index 5070fc5a646..a07e3498256 100644
--- a/sql/item_subselect.cc
+++ b/sql/item_subselect.cc
@@ -83,7 +83,6 @@ void Item_subselect::init(st_select_lex *select_lex,
DBUG_PRINT("enter", ("select_lex: 0x%lx this: 0x%lx",
(ulong) select_lex, (ulong) this));
unit= select_lex->master_unit();
- thd= unit->thd;
if (unit->item)
{
@@ -102,7 +101,7 @@ void Item_subselect::init(st_select_lex *select_lex,
Item can be changed in JOIN::prepare while engine in JOIN::optimize
=> we do not copy old_engine here
*/
- thd->change_item_tree((Item**)&unit->item, this);
+ unit->thd->change_item_tree((Item**)&unit->item, this);
engine->change_result(this, result, TRUE);
}
}
@@ -117,9 +116,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(thd, unit, result, this);
+ engine= new subselect_union_engine(unit, result, this);
else
- engine= new subselect_single_select_engine(thd, select_lex, result, this);
+ engine= new subselect_single_select_engine(select_lex, result, this);
}
{
SELECT_LEX *upper= unit->outer_select();
@@ -233,6 +232,10 @@ bool Item_subselect::fix_fields(THD *thd_param, Item **ref)
uint8 uncacheable;
bool res;
+ thd= thd_param;
+
+ DBUG_ASSERT(unit->thd == thd);
+
status_var_increment(thd_param->status_var.feature_subquery);
DBUG_ASSERT(fixed == 0);
@@ -255,7 +258,7 @@ bool Item_subselect::fix_fields(THD *thd_param, Item **ref)
return TRUE;
- if (!(res= engine->prepare()))
+ if (!(res= engine->prepare(thd)))
{
// all transformation is done (used by prepared statements)
changed= 1;
@@ -3105,9 +3108,12 @@ bool Item_in_subselect::fix_fields(THD *thd_arg, Item **ref)
{
uint outer_cols_num;
List<Item> *inner_cols;
- char const *save_where= thd->where;
+ char const *save_where= thd_arg->where;
DBUG_ENTER("Item_in_subselect::fix_fields");
+ thd= thd_arg;
+ DBUG_ASSERT(unit->thd == thd);
+
if (test_strategy(SUBS_SEMI_JOIN))
DBUG_RETURN( !( (*ref)= new Item_int(1)) );
@@ -3224,7 +3230,8 @@ bool Item_in_subselect::setup_mat_engine()
if (!(mat_engine= new subselect_hash_sj_engine(thd, this, select_engine)))
DBUG_RETURN(TRUE);
- if (mat_engine->init(&select_engine->join->fields_list,
+ if (mat_engine->prepare(thd) ||
+ mat_engine->init(&select_engine->join->fields_list,
engine->get_identifier()))
DBUG_RETURN(TRUE);
@@ -3340,10 +3347,10 @@ void subselect_engine::set_thd(THD *thd_arg)
subselect_single_select_engine::
-subselect_single_select_engine(THD *thd_arg, st_select_lex *select,
+subselect_single_select_engine(st_select_lex *select,
select_result_interceptor *result_arg,
Item_subselect *item_arg)
- :subselect_engine(thd_arg, item_arg, result_arg),
+ :subselect_engine(item_arg, result_arg),
prepared(0), executed(0),
select_lex(select), join(0)
{
@@ -3421,10 +3428,10 @@ void subselect_uniquesubquery_engine::cleanup()
}
-subselect_union_engine::subselect_union_engine(THD *thd_arg, st_select_lex_unit *u,
+subselect_union_engine::subselect_union_engine(st_select_lex_unit *u,
select_result_interceptor *result_arg,
Item_subselect *item_arg)
- :subselect_engine(thd_arg, item_arg, result_arg)
+ :subselect_engine(item_arg, result_arg)
{
unit= u;
unit->item= item_arg;
@@ -3457,10 +3464,11 @@ subselect_union_engine::subselect_union_engine(THD *thd_arg, st_select_lex_unit
@retval 1 if error
*/
-int subselect_single_select_engine::prepare()
+int subselect_single_select_engine::prepare(THD *thd)
{
if (prepared)
return 0;
+ set_thd(thd);
if (select_lex->join)
{
select_lex->cleanup();
@@ -3489,12 +3497,13 @@ int subselect_single_select_engine::prepare()
return 0;
}
-int subselect_union_engine::prepare()
+int subselect_union_engine::prepare(THD *thd_arg)
{
+ set_thd(thd_arg);
return unit->prepare(thd, result, SELECT_NO_UNLOCK);
}
-int subselect_uniquesubquery_engine::prepare()
+int subselect_uniquesubquery_engine::prepare(THD *)
{
/* Should never be called. */
DBUG_ASSERT(FALSE);
@@ -4956,13 +4965,14 @@ subselect_hash_sj_engine::~subselect_hash_sj_engine()
}
-int subselect_hash_sj_engine::prepare()
+int subselect_hash_sj_engine::prepare(THD *thd_arg)
{
/*
Create and optimize the JOIN that will be used to materialize
the subquery if not yet created.
*/
- return materialize_engine->prepare();
+ set_thd(thd_arg);
+ return materialize_engine->prepare(thd);
}
@@ -5334,7 +5344,7 @@ int subselect_hash_sj_engine::exec()
if (strategy == PARTIAL_MATCH_MERGE)
{
pm_engine=
- new subselect_rowid_merge_engine(thd, (subselect_uniquesubquery_engine*)
+ new subselect_rowid_merge_engine((subselect_uniquesubquery_engine*)
lookup_engine, tmp_table,
count_pm_keys,
has_covering_null_row,
@@ -5343,6 +5353,7 @@ int subselect_hash_sj_engine::exec()
item, result,
semi_join_conds->argument_list());
if (!pm_engine ||
+ pm_engine->prepare(thd) ||
((subselect_rowid_merge_engine*) pm_engine)->
init(nn_key_parts, &partial_match_key_parts))
{
@@ -5360,13 +5371,14 @@ int subselect_hash_sj_engine::exec()
if (strategy == PARTIAL_MATCH_SCAN)
{
if (!(pm_engine=
- new subselect_table_scan_engine(thd, (subselect_uniquesubquery_engine*)
+ new subselect_table_scan_engine((subselect_uniquesubquery_engine*)
lookup_engine, tmp_table,
item, result,
semi_join_conds->argument_list(),
has_covering_null_row,
has_covering_null_columns,
- count_columns_with_nulls)))
+ count_columns_with_nulls)) ||
+ pm_engine->prepare(thd))
{
/* This is an irrecoverable error. */
res= 1;
@@ -5815,14 +5827,14 @@ void Ordered_key::print(String *str)
subselect_partial_match_engine::subselect_partial_match_engine(
- THD *thd_arg, subselect_uniquesubquery_engine *engine_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,
bool has_covering_null_row_arg,
bool has_covering_null_columns_arg,
uint count_columns_with_nulls_arg)
- :subselect_engine(thd_arg, item_arg, result_arg),
+ :subselect_engine(item_arg, result_arg),
tmp_table(tmp_table_arg), lookup_engine(engine_arg),
equi_join_conds(equi_join_conds_arg),
has_covering_null_row(has_covering_null_row_arg),
@@ -6435,7 +6447,7 @@ end:
subselect_table_scan_engine::subselect_table_scan_engine(
- THD *thd_arg, subselect_uniquesubquery_engine *engine_arg,
+ subselect_uniquesubquery_engine *engine_arg,
TABLE *tmp_table_arg,
Item_subselect *item_arg,
select_result_interceptor *result_arg,
@@ -6443,7 +6455,7 @@ subselect_table_scan_engine::subselect_table_scan_engine(
bool has_covering_null_row_arg,
bool has_covering_null_columns_arg,
uint count_columns_with_nulls_arg)
- :subselect_partial_match_engine(thd_arg, engine_arg, tmp_table_arg, item_arg,
+ :subselect_partial_match_engine(engine_arg, tmp_table_arg, item_arg,
result_arg, equi_join_conds_arg,
has_covering_null_row_arg,
has_covering_null_columns_arg,