summaryrefslogtreecommitdiff
path: root/mysql-test/r/subselect.result
diff options
context:
space:
mode:
authorigor@rurik.mysql.com <>2004-12-25 19:17:57 -0800
committerigor@rurik.mysql.com <>2004-12-25 19:17:57 -0800
commitd3fa24536394c8419bce81977c1b55e66ee05436 (patch)
tree5fd3149194f671afa2f117c7d5fff0f9720577f2 /mysql-test/r/subselect.result
parentf1fe6e178427bef9e4ac791e1ef4a9ae9be99d57 (diff)
downloadmariadb-git-d3fa24536394c8419bce81977c1b55e66ee05436.tar.gz
subselect.result, subselect.test:
Added test cases for bug #7351. item_cmpfunc.cc: Fixed bug #7351: incorrect result for a query with a subquery returning empty set. If in the predicate v IN (SELECT a FROM t WHERE cond) v is null, then the result of the predicate is either INKNOWN or FALSE. It is FALSE if the subquery returns an empty set. item_subselect.cc: Fixed bug #7351: incorrect result for a query with a subquery returning empty set. The problem was due to not a quite legal transformation for 'IN' subqueries. A subquery containing a predicate of the form v IN (SELECT a FROM t WHERE cond) was transformed into EXISTS(SELECT a FROM t WHERE cond AND (a=v OR a IS NULL)). Yet, this transformation is valid only if v is not null. If v is null, then, in the case when (SELECT a FROM t WHERE cond) returns an empty set the value of the predicate is FALSE, otherwise the result of the predicate is INKNOWN. The fix resolves this problem by changing the result of the transformation to EXISTS(SELECT a FROM t WHERE cond AND (v IS NULL OR (a=v OR a IS NULL))) in the case when v is nullable. The new transformation prevents applying the lookup optimization for IN subqueries. To make it still applicable we have to introduce guarded access methods.
Diffstat (limited to 'mysql-test/r/subselect.result')
-rw-r--r--mysql-test/r/subselect.result25
1 files changed, 20 insertions, 5 deletions
diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result
index 0735f133e6f..b264018866c 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), index s1(s1));
+create table t1 (s1 char(5) not null, 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 6 NULL 3 Using index
+1 PRIMARY t1 index NULL s1 5 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 6 NULL 3 Using index
+1 PRIMARY t1 index NULL s1 5 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 6 NULL 3 Using index
+1 PRIMARY t1 index NULL s1 5 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 6 NULL 3 Using index
+1 PRIMARY t1 index NULL s1 5 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,3 +2125,18 @@ 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