Commit 2f5c9b7a authored by bell@sanja.is.com.ua's avatar bell@sanja.is.com.ua

Merge sanja.is.com.ua:/home/bell/mysql/bk/mysql-4.1

into sanja.is.com.ua:/home/bell/mysql/bk/work-innodb-4.1
parents 79739b30 98a7b49d
......@@ -96,3 +96,13 @@ id value (select t1.value from t1 where t1.id=t2.id)
1 z a
2 x b
drop table t1,t2;
create table t1 (a int, b int) engine=innodb;
insert into t1 values (1,2), (1,3), (2,3), (2,4), (2,5), (3,4), (4,5), (4,100);
create table t2 (a int) engine=innodb;
insert into t2 values (1),(2),(3),(4);
select a, sum(b) as b from t1 group by a having b > (select max(a) from t2);
a b
1 5
2 12
4 105
drop table t1, t2;
......@@ -101,3 +101,13 @@ insert into t2 values (1,'z'),(2,'x');
select t2.id,t2.value,(select t1.value from t1 where t1.id=t2.id) from t2;
select t2.id,t2.value,(select t1.value from t1 where t1.id=t2.id) from t2;
drop table t1,t2;
#
# unlocking tables with subqueries in HAVING
#
create table t1 (a int, b int) engine=innodb;
insert into t1 values (1,2), (1,3), (2,3), (2,4), (2,5), (3,4), (4,5), (4,100);
create table t2 (a int) engine=innodb;
insert into t2 values (1),(2),(3),(4);
select a, sum(b) as b from t1 group by a having b > (select max(a) from t2);
drop table t1, t2;
......@@ -74,6 +74,11 @@ void Item_subselect::init(st_select_lex *select_lex,
else
engine= new subselect_single_select_engine(select_lex, result, this);
}
{
SELECT_LEX *upper= unit->outer_select();
if (upper->parsing_place == SELECT_LEX_NODE::IN_HAVING)
upper->subquery_in_having= 1;
}
DBUG_VOID_RETURN;
}
......
......@@ -1008,7 +1008,7 @@ void st_select_lex::init_query()
ref_pointer_array= 0;
select_n_having_items= 0;
prep_where= 0;
explicit_limit= 0;
subquery_in_having= explicit_limit= 0;
}
void st_select_lex::init_select()
......
......@@ -433,6 +433,11 @@ class st_select_lex: public st_select_lex_node
bool having_fix_field;
/* explicit LIMIT clause was used */
bool explicit_limit;
/*
there are subquery in HAVING clause => we can't close tables before
query processing end even if we use temporary table
*/
bool subquery_in_having;
/*
SELECT for SELECT command st_select_lex. Used to privent scaning
......
......@@ -3906,7 +3906,8 @@ JOIN::join_free(bool full)
*/
if ((full || !select_lex->uncacheable) &&
lock && thd->lock &&
!(select_options & SELECT_NO_UNLOCK))
!(select_options & SELECT_NO_UNLOCK) &&
!select_lex->subquery_in_having)
{
mysql_unlock_read_tables(thd, lock);// Don't free join->lock
lock=0;
......
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