diff options
author | unknown <bell@sanja.is.com.ua> | 2004-06-23 18:58:52 +0300 |
---|---|---|
committer | unknown <bell@sanja.is.com.ua> | 2004-06-23 18:58:52 +0300 |
commit | 4b370d3d9a16bc73c2a57aaa825b2ecb93bba7b7 (patch) | |
tree | 03d6e45ebec0117838f059ec5754ddce04a6d1ec /sql | |
parent | 4603a7b376c5347b8015970a171a443160c37aa3 (diff) | |
parent | 07b5fdbcdb656b46c83d3585dc548107b5711609 (diff) | |
download | mariadb-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.cc | 5 | ||||
-rw-r--r-- | sql/sql_lex.cc | 2 | ||||
-rw-r--r-- | sql/sql_lex.h | 5 | ||||
-rw-r--r-- | sql/sql_select.cc | 3 |
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; |