summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <serg@serg.mysql.com>2002-10-14 10:44:17 +0000
committerunknown <serg@serg.mysql.com>2002-10-14 10:44:17 +0000
commitdb85094bc5386b58ff0b5fa93adab05b12eb9e16 (patch)
treea2ce1a2cb3c22636a894fd7b8ba344d645bbc835
parent2b70d7e56763e4b79feaf7f948ca2844a084861e (diff)
parenta299a27021a7bdd65f93f99f9eb0003f082b305d (diff)
downloadmariadb-git-db85094bc5386b58ff0b5fa93adab05b12eb9e16.tar.gz
Merge work:/home/bk/mysql-4.1
into serg.mysql.com:/usr/home/serg/Abk/mysql-4.1
-rw-r--r--mysql-test/r/subselect.result8
-rw-r--r--mysql-test/t/subselect.test3
-rw-r--r--sql/item_subselect.cc5
-rw-r--r--sql/item_subselect.h3
-rw-r--r--sql/sql_lex.cc2
-rw-r--r--sql/sql_lex.h1
-rw-r--r--sql/sql_union.cc7
7 files changed, 25 insertions, 4 deletions
diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result
index 6ea2a7ab3cf..b5b944583da 100644
--- a/mysql-test/r/subselect.result
+++ b/mysql-test/r/subselect.result
@@ -159,6 +159,14 @@ UNIQUE KEY `email` (`email`)
INSERT INTO inscrit (pseudo,email) VALUES ('joce','test');
INSERT INTO inscrit (pseudo,email) VALUES ('joce1','test1');
INSERT INTO inscrit (pseudo,email) VALUES ('2joce1','2test1');
+EXPLAIN SELECT pseudo,(SELECT email FROM inscrit WHERE pseudo=(SELECT
+pseudo FROM inscrit WHERE pseudo='joce')) FROM inscrit WHERE pseudo=(SELECT
+pseudo FROM inscrit WHERE pseudo='joce');
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY inscrit const PRIMARY PRIMARY 35 const 1
+4 SUBSELECT inscrit const PRIMARY PRIMARY 35 const 1
+2 SUBSELECT inscrit const PRIMARY PRIMARY 35 const 1
+3 SUBSELECT inscrit const PRIMARY PRIMARY 35 const 1
SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo,email FROM
inscrit WHERE pseudo='joce');
Subselect returns more than 1 field
diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test
index 37f68a3c4cb..120cbcbc05f 100644
--- a/mysql-test/t/subselect.test
+++ b/mysql-test/t/subselect.test
@@ -82,6 +82,9 @@ CREATE TABLE `inscrit` (
INSERT INTO inscrit (pseudo,email) VALUES ('joce','test');
INSERT INTO inscrit (pseudo,email) VALUES ('joce1','test1');
INSERT INTO inscrit (pseudo,email) VALUES ('2joce1','2test1');
+EXPLAIN SELECT pseudo,(SELECT email FROM inscrit WHERE pseudo=(SELECT
+pseudo FROM inscrit WHERE pseudo='joce')) FROM inscrit WHERE pseudo=(SELECT
+pseudo FROM inscrit WHERE pseudo='joce');
-- error 1239
SELECT pseudo FROM inscrit WHERE pseudo=(SELECT pseudo,email FROM
inscrit WHERE pseudo='joce');
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc
index cd4403ad0b8..de9c7e11313 100644
--- a/sql/item_subselect.cc
+++ b/sql/item_subselect.cc
@@ -212,7 +212,7 @@ subselect_single_select_engine::subselect_single_select_engine(THD *thd,
select_subselect *result,
Item_subselect *item):
subselect_engine(thd, item, result),
- executed(0), optimized(0)
+ prepared(0), optimized(0), executed(0)
{
select_lex= select;
SELECT_LEX_UNIT *unit= select_lex->master_unit();
@@ -251,6 +251,9 @@ subselect_union_engine::subselect_union_engine(THD *thd,
int subselect_single_select_engine::prepare()
{
+ if (prepared)
+ return 0;
+ prepared= 1;
SELECT_LEX *save_select= thd->lex.select;
thd->lex.select= select_lex;
if(join->prepare((TABLE_LIST*) select_lex->table_list.first,
diff --git a/sql/item_subselect.h b/sql/item_subselect.h
index 79b6b3a4292..33f82982708 100644
--- a/sql/item_subselect.h
+++ b/sql/item_subselect.h
@@ -179,8 +179,9 @@ public:
class subselect_single_select_engine: public subselect_engine
{
- my_bool executed; /* simple subselect is executed */
+ my_bool prepared; /* simple subselect is prepared */
my_bool optimized; /* simple subselect is optimized */
+ my_bool executed; /* simple subselect is executed */
st_select_lex *select_lex; /* corresponding select_lex */
JOIN * join; /* corresponding JOIN structure */
public:
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 122ceeedc54..46206079084 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -944,7 +944,7 @@ void st_select_lex_unit::init_query()
global_parameters= this;
select_limit_cnt= HA_POS_ERROR;
offset_limit_cnt= 0;
- optimized= 0;
+ prepared= optimized= 0;
item= 0;
}
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index acf73f34d5d..fe708d3b782 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -227,6 +227,7 @@ protected:
select_result *result;
int res;
bool describe, found_rows_for_union,
+ prepared, //prepare phase already performed for UNION (unit)
optimized; // optimize phase already performed for UNION (unit)
public:
/*
diff --git a/sql/sql_union.cc b/sql/sql_union.cc
index 1a18759eb5b..74cb8f6ffea 100644
--- a/sql/sql_union.cc
+++ b/sql/sql_union.cc
@@ -104,11 +104,16 @@ bool select_union::flush()
typedef JOIN * JOIN_P;
int st_select_lex_unit::prepare(THD *thd, select_result *result)
{
+ DBUG_ENTER("st_select_lex_unit::prepare");
+
+ if (prepared)
+ DBUG_RETURN(0);
+ prepared= 1;
+
describe=(first_select()->options & SELECT_DESCRIBE) ? 1 : 0;
res= 0;
found_rows_for_union= false;
TMP_TABLE_PARAM tmp_table_param;
- DBUG_ENTER("st_select_lex_unit::prepare");
this->thd= thd;
this->result= result;
SELECT_LEX *lex_select_save= thd->lex.select;