diff options
author | unknown <sanja@montyprogram.com> | 2013-11-11 20:38:04 +0200 |
---|---|---|
committer | unknown <sanja@montyprogram.com> | 2013-11-11 20:38:04 +0200 |
commit | dfed447888e1ab71ec0c80b61459bde6ee6eaf66 (patch) | |
tree | b921c0e431da431f8254f434f720fcc469547269 /sql/item_subselect.cc | |
parent | 668a5a4ab814d14f95cfbda7776a1f05246dd52e (diff) | |
parent | c98a054fdeab9c2d3a637cf4fce57a2f9756dcc8 (diff) | |
download | mariadb-git-dfed447888e1ab71ec0c80b61459bde6ee6eaf66.tar.gz |
merge 5.3->5.5
Diffstat (limited to 'sql/item_subselect.cc')
-rw-r--r-- | sql/item_subselect.cc | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 051c5ec874a..be3879758a3 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -2264,11 +2264,11 @@ Item_in_subselect::create_row_in_to_exists_cond(JOIN * join, DBUG_RETURN(true); Item *item_eq= new Item_func_eq(new - Item_ref(&select_lex->context, - (*optimizer->get_cache())-> - addr(i), - (char *)"<no matter>", - (char *)in_left_expr_name), + Item_direct_ref(&select_lex->context, + (*optimizer->get_cache())-> + addr(i), + (char *)"<no matter>", + (char *)in_left_expr_name), new Item_ref(&select_lex->context, select_lex->ref_pointer_array + i, @@ -2549,7 +2549,7 @@ bool Item_in_subselect::inject_in_to_exists_cond(JOIN *join_arg) bool Item_in_subselect::select_in_like_transformer(JOIN *join) { - Query_arena *arena, backup; + Query_arena *arena= 0, backup; SELECT_LEX *current= thd->lex->current_select; const char *save_where= thd->where; bool trans_res= true; @@ -2571,9 +2571,6 @@ Item_in_subselect::select_in_like_transformer(JOIN *join) } } - if (changed) - DBUG_RETURN(false); - thd->where= "IN/ALL/ANY subquery"; /* @@ -2584,25 +2581,29 @@ Item_in_subselect::select_in_like_transformer(JOIN *join) note: we won't need Item_in_optimizer when handling degenerate cases like "... IN (SELECT 1)" */ + arena= thd->activate_stmt_arena_if_needed(&backup); if (!optimizer) { - arena= thd->activate_stmt_arena_if_needed(&backup); result= (!(optimizer= new Item_in_optimizer(left_expr, this))); - if (arena) - thd->restore_active_arena(arena, &backup); if (result) - goto err; + goto out; } thd->lex->current_select= current->return_after_parsing(); - result= (!left_expr->fixed && - left_expr->fix_fields(thd, optimizer->arguments())); + result= optimizer->fix_left(thd, optimizer->arguments()); /* fix_fields can change reference to left_expr, we need reassign it */ left_expr= optimizer->arguments()[0]; - thd->lex->current_select= current; + + if (changed) + { + trans_res= false; + goto out; + } + + if (result) - goto err; + goto out; /* Both transformers call fix_fields() only for Items created inside them, @@ -2611,7 +2612,6 @@ Item_in_subselect::select_in_like_transformer(JOIN *join) of Item, we have to call fix_fields() for it only with original arena to avoid memory leack) */ - arena= thd->activate_stmt_arena_if_needed(&backup); if (left_expr->cols() == 1) trans_res= single_value_transformer(join); else @@ -2626,9 +2626,9 @@ Item_in_subselect::select_in_like_transformer(JOIN *join) } trans_res= row_value_transformer(join); } +out: if (arena) thd->restore_active_arena(arena, &backup); -err: thd->where= save_where; DBUG_RETURN(trans_res); } |