summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <bell@sanja.is.com.ua>2005-02-09 21:08:08 +0200
committerunknown <bell@sanja.is.com.ua>2005-02-09 21:08:08 +0200
commit86d5bfc42b11773d74aa04b014e4304e5a1b9440 (patch)
treeb282078b0a55de48c5719097df453c4d80e1d4d9
parentfa657a0642fb02ba36b00ef23c06ae1eab710f61 (diff)
downloadmariadb-git-86d5bfc42b11773d74aa04b014e4304e5a1b9440.tar.gz
reverted patch for BUG#7351 (because of performance ussie)
-rw-r--r--mysql-test/r/subselect.result38
-rw-r--r--mysql-test/t/subselect.test30
-rw-r--r--sql/item_cmpfunc.cc5
-rw-r--r--sql/item_subselect.cc13
4 files changed, 12 insertions, 74 deletions
diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result
index 03dcc23c919..3018726e6a1 100644
--- a/mysql-test/r/subselect.result
+++ b/mysql-test/r/subselect.result
@@ -1425,7 +1425,7 @@ Note 1003 (select test.t1.s1 AS `s1` from test.t1)
s1
tttt
drop table t1;
-create table t1 (s1 char(5) not null, index s1(s1));
+create table t1 (s1 char(5), index s1(s1));
create table t2 (s1 char(5), index s1(s1));
insert into t1 values ('a1'),('a2'),('a3');
insert into t2 values ('a1'),('a2');
@@ -1451,25 +1451,25 @@ a2 1
a3 1
explain extended select s1, s1 NOT IN (SELECT s1 FROM t2) from t1;
id select_type table type possible_keys key key_len ref rows Extra
-1 PRIMARY t1 index NULL s1 5 NULL 3 Using index
+1 PRIMARY t1 index NULL s1 6 NULL 3 Using index
2 DEPENDENT SUBQUERY t2 index_subquery s1 s1 6 func 2 Using index
Warnings:
Note 1003 select test.t1.s1 AS `s1`,not(<in_optimizer>(test.t1.s1,<exists>(<index_lookup>(<cache>(test.t1.s1) in t2 on s1 chicking NULL)))) AS `s1 NOT IN (SELECT s1 FROM t2)` from test.t1
explain extended select s1, s1 = ANY (SELECT s1 FROM t2) from t1;
id select_type table type possible_keys key key_len ref rows Extra
-1 PRIMARY t1 index NULL s1 5 NULL 3 Using index
+1 PRIMARY t1 index NULL s1 6 NULL 3 Using index
2 DEPENDENT SUBQUERY t2 index_subquery s1 s1 6 func 2 Using index
Warnings:
Note 1003 select test.t1.s1 AS `s1`,<in_optimizer>(test.t1.s1,<exists>(<index_lookup>(<cache>(test.t1.s1) in t2 on s1 chicking NULL))) AS `s1 = ANY (SELECT s1 FROM t2)` from test.t1
explain extended select s1, s1 <> ALL (SELECT s1 FROM t2) from t1;
id select_type table type possible_keys key key_len ref rows Extra
-1 PRIMARY t1 index NULL s1 5 NULL 3 Using index
+1 PRIMARY t1 index NULL s1 6 NULL 3 Using index
2 DEPENDENT SUBQUERY t2 index_subquery s1 s1 6 func 2 Using index
Warnings:
Note 1003 select test.t1.s1 AS `s1`,not(<in_optimizer>(test.t1.s1,<exists>(<index_lookup>(<cache>(test.t1.s1) in t2 on s1 chicking NULL)))) AS `s1 <> ALL (SELECT s1 FROM t2)` from test.t1
explain extended select s1, s1 NOT IN (SELECT s1 FROM t2 WHERE s1 < 'a2') from t1;
id select_type table type possible_keys key key_len ref rows Extra
-1 PRIMARY t1 index NULL s1 5 NULL 3 Using index
+1 PRIMARY t1 index NULL s1 6 NULL 3 Using index
2 DEPENDENT SUBQUERY t2 index_subquery s1 s1 6 func 1 Using index; Using where
Warnings:
Note 1003 select test.t1.s1 AS `s1`,not(<in_optimizer>(test.t1.s1,<exists>(<index_lookup>(<cache>(test.t1.s1) in t2 on s1 chicking NULL where (test.t2.s1 < _latin1'a2'))))) AS `s1 NOT IN (SELECT s1 FROM t2 WHERE s1 < 'a2')` from test.t1
@@ -2125,34 +2125,6 @@ SELECT DISTINCT Continent AS c FROM t1 WHERE Code <> SOME ( SELECT Code FROM t1
c
Oceania
drop table t1;
-CREATE TABLE t1 ( f1 BIGINT );
-INSERT INTO t1 SET f1= NULL;
-INSERT INTO t1 SET f1= 1;
-CREATE TABLE t2 ( f1 BIGINT );
-SELECT f1 FROM t1
-WHERE f1 <> ALL ( SELECT f1 FROM t2 );
-f1
-NULL
-1
-INSERT INTO t2 VALUES (1), (2);
-SELECT f1 FROM t1
-WHERE f1 <> ALL ( SELECT f1 FROM t2 WHERE f1 > 2 );
-f1
-NULL
-1
-SELECT f1 FROM t1
-WHERE f1 <> ALL ( SELECT f1 FROM t2 WHERE f1 > 2
-UNION
-SELECT f1 FROM t2 WHERE f1 > 3);
-f1
-NULL
-1
-SELECT f1 FROM t1
-WHERE f1 <> ALL ( SELECT SUM(f1) AS sf1 FROM t2 HAVING sf1 > 10000);
-f1
-NULL
-1
-drop table t1,t2;
create table t1 (a1 int);
create table t2 (b1 int);
select * from t1 where a2 > any(select b1 from t2);
diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test
index 55400dae0be..cb4f2eab923 100644
--- a/mysql-test/t/subselect.test
+++ b/mysql-test/t/subselect.test
@@ -889,7 +889,7 @@ drop table t1;
#
# IN optimisation test results
#
-create table t1 (s1 char(5) not null, index s1(s1));
+create table t1 (s1 char(5), index s1(s1));
create table t2 (s1 char(5), index s1(s1));
insert into t1 values ('a1'),('a2'),('a3');
insert into t2 values ('a1'),('a2');
@@ -1388,34 +1388,6 @@ SELECT DISTINCT Continent AS c FROM t1 WHERE Code <> SOME ( SELECT Code FROM t1
drop table t1;
#
-# Test cases for bug #7351:
-# quantified predicate with subquery returning empty result set
-#
-
-CREATE TABLE t1 ( f1 BIGINT );
-INSERT INTO t1 SET f1= NULL;
-INSERT INTO t1 SET f1= 1;
-CREATE TABLE t2 ( f1 BIGINT );
-
-SELECT f1 FROM t1
- WHERE f1 <> ALL ( SELECT f1 FROM t2 );
-
-INSERT INTO t2 VALUES (1), (2);
-
-SELECT f1 FROM t1
- WHERE f1 <> ALL ( SELECT f1 FROM t2 WHERE f1 > 2 );
-
-SELECT f1 FROM t1
- WHERE f1 <> ALL ( SELECT f1 FROM t2 WHERE f1 > 2
- UNION
- SELECT f1 FROM t2 WHERE f1 > 3);
-
-SELECT f1 FROM t1
- WHERE f1 <> ALL ( SELECT SUM(f1) AS sf1 FROM t2 HAVING sf1 > 10000);
-
-drop table t1,t2;
-
-#
# Test for BUG#7885: Server crash when 'any' subselect compared to
# non-existant field.
#
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 2b9a612da18..79295eb90b0 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -636,13 +636,12 @@ longlong Item_in_optimizer::val_int()
{
DBUG_ASSERT(fixed == 1);
cache->store(args[0]);
- longlong tmp= args[1]->val_int_result();
if (cache->null_value)
{
- if (tmp)
- null_value= 1;
+ null_value= 1;
return 0;
}
+ longlong tmp= args[1]->val_int_result();
null_value= args[1]->null_value;
return tmp;
}
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc
index 16186b1a6d3..3a1e1918e55 100644
--- a/sql/item_subselect.cc
+++ b/sql/item_subselect.cc
@@ -825,8 +825,6 @@ Item_in_subselect::single_value_transformer(JOIN *join,
select_lex->ref_pointer_array,
(char *)"<ref>",
this->full_name()));
- if (!abort_on_null && left_expr->maybe_null)
- item= new Item_cond_or(new Item_func_isnull(left_expr), item);
/*
AND and comparison functions can't be changed during fix_fields()
we can assign select_lex->having here, and pass 0 as last
@@ -872,8 +870,6 @@ Item_in_subselect::single_value_transformer(JOIN *join,
select_lex->having_fix_field= 0;
item= new Item_cond_or(item,
new Item_func_isnull(orig_item));
- if (left_expr->maybe_null)
- item= new Item_cond_or(new Item_func_isnull(left_expr), item);
}
item->name= (char *)in_additional_cond;
/*
@@ -894,13 +890,12 @@ Item_in_subselect::single_value_transformer(JOIN *join,
we can assign select_lex->having here, and pass 0 as last
argument (reference) to fix_fields()
*/
- item= func->create(expr,
- new Item_null_helper(this, item,
+ select_lex->having=
+ join->having=
+ func->create(expr,
+ new Item_null_helper(this, item,
(char *)"<no matter>",
(char *)"<result>"));
- if (!abort_on_null && left_expr->maybe_null)
- item= new Item_cond_or(new Item_func_isnull(left_expr), item);
- select_lex->having= join->having= item;
select_lex->having_fix_field= 1;
if (join->having->fix_fields(thd, join->tables_list,
0))