Commit c917ba1d authored by Sergei Golubchik's avatar Sergei Golubchik

fix the comparison in st_select_lex::setup_ref_array()

the array only needs to be reallocated if it's smaller
than needed. Being larger is ok.

also: remove a duplicated check (merge error)
parent 5c30fcfa
...@@ -494,8 +494,7 @@ Item::Item(THD *thd): ...@@ -494,8 +494,7 @@ Item::Item(THD *thd):
{ {
enum_parsing_place place= enum_parsing_place place=
thd->lex->current_select->parsing_place; thd->lex->current_select->parsing_place;
if (place == SELECT_LIST || if (place == SELECT_LIST || place == IN_HAVING)
place == IN_HAVING)
thd->lex->current_select->select_n_having_items++; thd->lex->current_select->select_n_having_items++;
} }
} }
......
...@@ -116,9 +116,8 @@ void Item_subselect::init(st_select_lex *select_lex, ...@@ -116,9 +116,8 @@ void Item_subselect::init(st_select_lex *select_lex,
do not take into account expression inside aggregate functions because do not take into account expression inside aggregate functions because
they can access original table fields they can access original table fields
*/ */
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 (unit->is_union()) if (unit->is_union())
engine= new subselect_union_engine(unit, result, this); engine= new subselect_union_engine(unit, result, this);
else else
......
...@@ -2665,16 +2665,6 @@ bool st_select_lex::setup_ref_array(THD *thd, uint order_group_num) ...@@ -2665,16 +2665,6 @@ bool st_select_lex::setup_ref_array(THD *thd, uint order_group_num)
order_group_num) * 5; order_group_num) * 5;
if (!ref_pointer_array.is_null()) if (!ref_pointer_array.is_null())
{ {
/*
We need to take 'n_sum_items' into account when allocating the array,
and this may actually increase during the optimization phase due to
MIN/MAX rewrite in Item_in_subselect::single_value_transformer.
In the usual case we can reuse the array from the prepare phase.
If we need a bigger array, we must allocate a new one.
*/
if (ref_pointer_array.size() == n_elems)
return false;
/* /*
We need to take 'n_sum_items' into account when allocating the array, We need to take 'n_sum_items' into account when allocating the array,
and this may actually increase during the optimization phase due to and this may actually increase during the optimization phase due to
...@@ -2682,7 +2672,7 @@ bool st_select_lex::setup_ref_array(THD *thd, uint order_group_num) ...@@ -2682,7 +2672,7 @@ bool st_select_lex::setup_ref_array(THD *thd, uint order_group_num)
In the usual case we can reuse the array from the prepare phase. In the usual case we can reuse the array from the prepare phase.
If we need a bigger array, we must allocate a new one. If we need a bigger array, we must allocate a new one.
*/ */
if (ref_pointer_array.size() == n_elems) if (ref_pointer_array.size() >= n_elems)
return false; return false;
} }
Item **array= static_cast<Item**>(arena->alloc(sizeof(Item*) * n_elems)); Item **array= static_cast<Item**>(arena->alloc(sizeof(Item*) * n_elems));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment