summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <bell@sanja.is.com.ua>2004-06-23 18:58:52 +0300
committerunknown <bell@sanja.is.com.ua>2004-06-23 18:58:52 +0300
commit4b370d3d9a16bc73c2a57aaa825b2ecb93bba7b7 (patch)
tree03d6e45ebec0117838f059ec5754ddce04a6d1ec /sql
parent4603a7b376c5347b8015970a171a443160c37aa3 (diff)
parent07b5fdbcdb656b46c83d3585dc548107b5711609 (diff)
downloadmariadb-git-4b370d3d9a16bc73c2a57aaa825b2ecb93bba7b7.tar.gz
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 sql/item_subselect.cc: Auto merged sql/sql_lex.cc: Auto merged sql/sql_lex.h: Auto merged sql/sql_select.cc: Auto merged
Diffstat (limited to 'sql')
-rw-r--r--sql/item_subselect.cc5
-rw-r--r--sql/sql_lex.cc2
-rw-r--r--sql/sql_lex.h5
-rw-r--r--sql/sql_select.cc3
4 files changed, 13 insertions, 2 deletions
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc
index 691ec5f4c7b..082c434f2d9 100644
--- a/sql/item_subselect.cc
+++ b/sql/item_subselect.cc
@@ -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;
}
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index b6cb61fe10e..d945eef1425 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -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()
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index 54d9a09c1f3..328df2f6bb9 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -433,6 +433,11 @@ public:
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
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index f1f93343a63..946c21bf24f 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -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;