- addendum of the fix for bug 27786:
applied the new function is_union() to places in the code that check the same condition. - 5.0->5.1 merge fixes
This commit is contained in:
parent
0d70f964aa
commit
429371f9d5
@ -698,10 +698,10 @@ INSERT INTO t1 VALUES (1), (NULL), (4);
|
|||||||
INSERT INTO t2 VALUES (3), (1),(2), (5), (4), (7), (6);
|
INSERT INTO t2 VALUES (3), (1),(2), (5), (4), (7), (6);
|
||||||
EXPLAIN EXTENDED
|
EXPLAIN EXTENDED
|
||||||
SELECT a FROM t1, t2 WHERE a=b AND (b NOT IN (SELECT a FROM t1));
|
SELECT a FROM t1, t2 WHERE a=b AND (b NOT IN (SELECT a FROM t1));
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 PRIMARY t2 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using index
|
1 PRIMARY t2 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 100.00 Using index
|
||||||
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 Using where
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` join `test`.`t2` where ((`test`.`t2`.`b` = `test`.`t1`.`a`) and (not(<in_optimizer>(`test`.`t1`.`a`,<exists>(select 1 AS `Not_used` from `test`.`t1` where ((<cache>(`test`.`t2`.`b`) = `test`.`t1`.`a`) or isnull(`test`.`t1`.`a`)) having <is_not_null_test>(`test`.`t1`.`a`))))))
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` join `test`.`t2` where ((`test`.`t2`.`b` = `test`.`t1`.`a`) and (not(<in_optimizer>(`test`.`t1`.`a`,<exists>(select 1 AS `Not_used` from `test`.`t1` where ((<cache>(`test`.`t2`.`b`) = `test`.`t1`.`a`) or isnull(`test`.`t1`.`a`)) having <is_not_null_test>(`test`.`t1`.`a`))))))
|
||||||
SELECT a FROM t1, t2 WHERE a=b AND (b NOT IN (SELECT a FROM t1));
|
SELECT a FROM t1, t2 WHERE a=b AND (b NOT IN (SELECT a FROM t1));
|
||||||
|
@ -82,7 +82,7 @@ void Item_subselect::init(st_select_lex *select_lex,
|
|||||||
parsing_place= (outer_select->in_sum_expr ?
|
parsing_place= (outer_select->in_sum_expr ?
|
||||||
NO_MATTER :
|
NO_MATTER :
|
||||||
outer_select->parsing_place);
|
outer_select->parsing_place);
|
||||||
if (select_lex->next_select())
|
if (unit->is_union())
|
||||||
engine= new subselect_union_engine(unit, result, this);
|
engine= new subselect_union_engine(unit, result, this);
|
||||||
else
|
else
|
||||||
engine= new subselect_single_select_engine(select_lex, result, this);
|
engine= new subselect_single_select_engine(select_lex, result, this);
|
||||||
@ -412,7 +412,7 @@ Item_singlerow_subselect::select_transformer(JOIN *join)
|
|||||||
SELECT_LEX *select_lex= join->select_lex;
|
SELECT_LEX *select_lex= join->select_lex;
|
||||||
Query_arena *arena= thd->stmt_arena;
|
Query_arena *arena= thd->stmt_arena;
|
||||||
|
|
||||||
if (!select_lex->master_unit()->first_select()->next_select() &&
|
if (!select_lex->master_unit()->is_union() &&
|
||||||
!select_lex->table_list.elements &&
|
!select_lex->table_list.elements &&
|
||||||
select_lex->item_list.elements == 1 &&
|
select_lex->item_list.elements == 1 &&
|
||||||
!select_lex->item_list.head()->with_sum_func &&
|
!select_lex->item_list.head()->with_sum_func &&
|
||||||
@ -1147,7 +1147,7 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
bool tmp;
|
bool tmp;
|
||||||
if (select_lex->master_unit()->first_select()->next_select())
|
if (select_lex->master_unit()->is_union())
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
comparison functions can't be changed during fix_fields()
|
comparison functions can't be changed during fix_fields()
|
||||||
|
@ -236,9 +236,7 @@ bool mysql_derived_filling(THD *thd, LEX *lex, TABLE_LIST *orig_table_list)
|
|||||||
SELECT_LEX *first_select= unit->first_select();
|
SELECT_LEX *first_select= unit->first_select();
|
||||||
select_union *derived_result= orig_table_list->derived_result;
|
select_union *derived_result= orig_table_list->derived_result;
|
||||||
SELECT_LEX *save_current_select= lex->current_select;
|
SELECT_LEX *save_current_select= lex->current_select;
|
||||||
bool is_union= first_select->next_select() &&
|
if (unit->is_union())
|
||||||
first_select->next_select()->linkage == UNION_TYPE;
|
|
||||||
if (is_union)
|
|
||||||
{
|
{
|
||||||
// execute union without clean up
|
// execute union without clean up
|
||||||
res= unit->exec();
|
res= unit->exec();
|
||||||
|
@ -5893,7 +5893,7 @@ bool st_select_lex_unit::add_fake_select_lex(THD *thd_arg)
|
|||||||
fake_select_lex->context.resolve_in_select_list= TRUE;
|
fake_select_lex->context.resolve_in_select_list= TRUE;
|
||||||
fake_select_lex->context.select_lex= fake_select_lex;
|
fake_select_lex->context.select_lex= fake_select_lex;
|
||||||
|
|
||||||
if (!first_sl->next_select())
|
if (!is_union())
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
This works only for
|
This works only for
|
||||||
|
@ -231,7 +231,8 @@ bool handle_select(THD *thd, LEX *lex, select_result *result,
|
|||||||
register SELECT_LEX *select_lex = &lex->select_lex;
|
register SELECT_LEX *select_lex = &lex->select_lex;
|
||||||
DBUG_ENTER("handle_select");
|
DBUG_ENTER("handle_select");
|
||||||
|
|
||||||
if (select_lex->next_select() || select_lex->master_unit()->fake_select_lex)
|
if (select_lex->master_unit()->is_union() ||
|
||||||
|
select_lex->master_unit()->fake_select_lex)
|
||||||
res= mysql_union(thd, lex, result, &lex->unit, setup_tables_done_option);
|
res= mysql_union(thd, lex, result, &lex->unit, setup_tables_done_option);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -442,7 +443,7 @@ JOIN::prepare(Item ***rref_pointer_array,
|
|||||||
select_lex= select_lex_arg;
|
select_lex= select_lex_arg;
|
||||||
select_lex->join= this;
|
select_lex->join= this;
|
||||||
join_list= &select_lex->top_join_list;
|
join_list= &select_lex->top_join_list;
|
||||||
union_part= (unit_arg->first_select()->next_select() != 0);
|
union_part= unit_arg->is_union();
|
||||||
|
|
||||||
thd->lex->current_select->is_item_list_lookup= 1;
|
thd->lex->current_select->is_item_list_lookup= 1;
|
||||||
/*
|
/*
|
||||||
@ -1191,7 +1192,7 @@ JOIN::optimize()
|
|||||||
if (!group_list && !order &&
|
if (!group_list && !order &&
|
||||||
unit->item && unit->item->substype() == Item_subselect::IN_SUBS &&
|
unit->item && unit->item->substype() == Item_subselect::IN_SUBS &&
|
||||||
tables == 1 && conds &&
|
tables == 1 && conds &&
|
||||||
!unit->first_select()->next_select())
|
!unit->is_union())
|
||||||
{
|
{
|
||||||
if (!having)
|
if (!having)
|
||||||
{
|
{
|
||||||
@ -3165,7 +3166,7 @@ add_key_fields(JOIN *join, KEY_FIELD **key_fields, uint *and_level,
|
|||||||
if (!join->group_list && !join->order &&
|
if (!join->group_list && !join->order &&
|
||||||
join->unit->item &&
|
join->unit->item &&
|
||||||
join->unit->item->substype() == Item_subselect::IN_SUBS &&
|
join->unit->item->substype() == Item_subselect::IN_SUBS &&
|
||||||
!join->unit->first_select()->next_select())
|
!join->unit->is_union())
|
||||||
{
|
{
|
||||||
KEY_FIELD *save= *key_fields;
|
KEY_FIELD *save= *key_fields;
|
||||||
add_key_fields(join, key_fields, and_level, cond_arg, usable_tables,
|
add_key_fields(join, key_fields, and_level, cond_arg, usable_tables,
|
||||||
@ -15523,7 +15524,7 @@ bool mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result)
|
|||||||
"UNION")));
|
"UNION")));
|
||||||
sl->options|= SELECT_DESCRIBE;
|
sl->options|= SELECT_DESCRIBE;
|
||||||
}
|
}
|
||||||
if (first->next_select())
|
if (unit->is_union())
|
||||||
{
|
{
|
||||||
unit->fake_select_lex->select_number= UINT_MAX; // jost for initialization
|
unit->fake_select_lex->select_number= UINT_MAX; // jost for initialization
|
||||||
unit->fake_select_lex->type= "UNION RESULT";
|
unit->fake_select_lex->type= "UNION RESULT";
|
||||||
|
@ -165,7 +165,7 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
|
|||||||
SELECT_LEX *lex_select_save= thd_arg->lex->current_select;
|
SELECT_LEX *lex_select_save= thd_arg->lex->current_select;
|
||||||
SELECT_LEX *sl, *first_sl= first_select();
|
SELECT_LEX *sl, *first_sl= first_select();
|
||||||
select_result *tmp_result;
|
select_result *tmp_result;
|
||||||
bool is_union;
|
bool is_union_select;
|
||||||
TABLE *empty_table= 0;
|
TABLE *empty_table= 0;
|
||||||
DBUG_ENTER("st_select_lex_unit::prepare");
|
DBUG_ENTER("st_select_lex_unit::prepare");
|
||||||
|
|
||||||
@ -203,11 +203,11 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
|
|||||||
|
|
||||||
thd_arg->lex->current_select= sl= first_sl;
|
thd_arg->lex->current_select= sl= first_sl;
|
||||||
found_rows_for_union= first_sl->options & OPTION_FOUND_ROWS;
|
found_rows_for_union= first_sl->options & OPTION_FOUND_ROWS;
|
||||||
is_union= first_sl->next_select() || fake_select_lex;
|
is_union_select= is_union() || fake_select_lex;
|
||||||
|
|
||||||
/* Global option */
|
/* Global option */
|
||||||
|
|
||||||
if (is_union)
|
if (is_union_select)
|
||||||
{
|
{
|
||||||
if (!(tmp_result= union_result= new select_union))
|
if (!(tmp_result= union_result= new select_union))
|
||||||
goto err;
|
goto err;
|
||||||
@ -238,7 +238,7 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
|
|||||||
|
|
||||||
thd_arg->lex->current_select= sl;
|
thd_arg->lex->current_select= sl;
|
||||||
|
|
||||||
can_skip_order_by= is_union && !(sl->braces && sl->explicit_limit);
|
can_skip_order_by= is_union_select && !(sl->braces && sl->explicit_limit);
|
||||||
|
|
||||||
saved_error= join->prepare(&sl->ref_pointer_array,
|
saved_error= join->prepare(&sl->ref_pointer_array,
|
||||||
(TABLE_LIST*) sl->table_list.first,
|
(TABLE_LIST*) sl->table_list.first,
|
||||||
@ -251,7 +251,7 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
|
|||||||
(ORDER*) 0 : (ORDER *)sl->order_list.first,
|
(ORDER*) 0 : (ORDER *)sl->order_list.first,
|
||||||
(ORDER*) sl->group_list.first,
|
(ORDER*) sl->group_list.first,
|
||||||
sl->having,
|
sl->having,
|
||||||
(is_union ? (ORDER*) 0 :
|
(is_union_select ? (ORDER*) 0 :
|
||||||
(ORDER*) thd_arg->lex->proc_list.first),
|
(ORDER*) thd_arg->lex->proc_list.first),
|
||||||
sl, this);
|
sl, this);
|
||||||
/* There are no * in the statement anymore (for PS) */
|
/* There are no * in the statement anymore (for PS) */
|
||||||
@ -264,7 +264,7 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
|
|||||||
Use items list of underlaid select for derived tables to preserve
|
Use items list of underlaid select for derived tables to preserve
|
||||||
information about fields lengths and exact types
|
information about fields lengths and exact types
|
||||||
*/
|
*/
|
||||||
if (!is_union)
|
if (!is_union_select)
|
||||||
types= first_sl->item_list;
|
types= first_sl->item_list;
|
||||||
else if (sl == first_sl)
|
else if (sl == first_sl)
|
||||||
{
|
{
|
||||||
@ -307,7 +307,7 @@ bool st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_union)
|
if (is_union_select)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Check that it was possible to aggregate
|
Check that it was possible to aggregate
|
||||||
@ -639,7 +639,7 @@ void st_select_lex_unit::reinit_exec_mechanism()
|
|||||||
{
|
{
|
||||||
prepared= optimized= executed= 0;
|
prepared= optimized= executed= 0;
|
||||||
#ifndef DBUG_OFF
|
#ifndef DBUG_OFF
|
||||||
if (first_select()->next_select())
|
if (is_union())
|
||||||
{
|
{
|
||||||
List_iterator_fast<Item> it(item_list);
|
List_iterator_fast<Item> it(item_list);
|
||||||
Item *field;
|
Item *field;
|
||||||
@ -706,7 +706,6 @@ bool st_select_lex_unit::change_result(select_subselect *new_result,
|
|||||||
List<Item> *st_select_lex_unit::get_unit_column_types()
|
List<Item> *st_select_lex_unit::get_unit_column_types()
|
||||||
{
|
{
|
||||||
SELECT_LEX *sl= first_select();
|
SELECT_LEX *sl= first_select();
|
||||||
bool is_union= test(sl->next_select());
|
|
||||||
bool is_procedure= test(sl->join->procedure);
|
bool is_procedure= test(sl->join->procedure);
|
||||||
|
|
||||||
if (is_procedure)
|
if (is_procedure)
|
||||||
@ -717,7 +716,7 @@ List<Item> *st_select_lex_unit::get_unit_column_types()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (is_union)
|
if (is_union())
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(prepared);
|
DBUG_ASSERT(prepared);
|
||||||
/* Types are generated during prepare */
|
/* Types are generated during prepare */
|
||||||
|
@ -818,7 +818,7 @@ loop_out:
|
|||||||
UNION
|
UNION
|
||||||
*/
|
*/
|
||||||
if (view->updatable_view &&
|
if (view->updatable_view &&
|
||||||
!lex->select_lex.next_select() &&
|
!lex->select_lex.master_unit()->is_union() &&
|
||||||
!((TABLE_LIST*)lex->select_lex.table_list.first)->next_local &&
|
!((TABLE_LIST*)lex->select_lex.table_list.first)->next_local &&
|
||||||
find_table_in_global_list(lex->query_tables->next_global,
|
find_table_in_global_list(lex->query_tables->next_global,
|
||||||
lex->query_tables->db,
|
lex->query_tables->db,
|
||||||
|
@ -7817,7 +7817,7 @@ order_clause:
|
|||||||
yet.
|
yet.
|
||||||
*/
|
*/
|
||||||
SELECT_LEX *first_sl= unit->first_select();
|
SELECT_LEX *first_sl= unit->first_select();
|
||||||
if (!first_sl->next_select() &&
|
if (!unit->is_union() &&
|
||||||
(first_sl->order_list.elements ||
|
(first_sl->order_list.elements ||
|
||||||
first_sl->select_limit) &&
|
first_sl->select_limit) &&
|
||||||
unit->add_fake_select_lex(lex->thd))
|
unit->add_fake_select_lex(lex->thd))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user