summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/subselect_sj_jcl6.result48
-rw-r--r--mysql-test/t/subselect_sj_jcl6.test42
-rw-r--r--sql/opt_subselect.cc4
3 files changed, 92 insertions, 2 deletions
diff --git a/mysql-test/r/subselect_sj_jcl6.result b/mysql-test/r/subselect_sj_jcl6.result
index 26a2f93fc86..6c4f5d30ade 100644
--- a/mysql-test/r/subselect_sj_jcl6.result
+++ b/mysql-test/r/subselect_sj_jcl6.result
@@ -2094,6 +2094,54 @@ a
3
set optimizer_switch=@save_optimizer_switch;
drop table t0, t1, t2;
+#
+# Bug #891995: IN subquery with join_cache_level >= 3
+#
+CREATE TABLE t1 (a varchar(1));
+INSERT INTO t1 VALUES ('w'),('q');
+CREATE TABLE t2 (a int NOT NULL, b time, PRIMARY KEY (a));
+INSERT INTO t2 VALUES
+(2,'18:56:33'), (5,'19:11:10'), (3,'18:56:33'), (7,'19:11:10');
+CREATE TABLE t3 (
+a int NOT NULL, b int, c int, d varchar(1), PRIMARY KEY (a), KEY (d,c)
+);
+INSERT INTO t3 VALUES
+(25,158,10,'f'), (26,5,2,'v'), (27,163,103,'f'), (28,2,3,'q'), (29,8,6,'y');
+set @save_optimizer_switch=@@optimizer_switch;
+SET SESSION optimizer_switch='semijoin=on';
+SET SESSION optimizer_switch='join_cache_hashed=on';
+SET SESSION join_cache_level=3;
+EXPLAIN
+SELECT * FROM t1, t2
+WHERE t2.a IN (SELECT b FROM t3 WHERE t3.d <= t1.a);
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY t1 ALL NULL NULL NULL NULL 2 Start temporary
+1 PRIMARY t3 ALL d NULL NULL NULL 5 Range checked for each record (index map: 0x2)
+1 PRIMARY t2 hash_ALL PRIMARY #hash#PRIMARY 4 test.t3.b 4 End temporary; Using join buffer (flat, BNLH join)
+SELECT * FROM t1, t2
+WHERE t2.a IN (SELECT b FROM t3 WHERE t3.d <= t1.a);
+a a b
+w 2 18:56:33
+q 2 18:56:33
+w 5 19:11:10
+SET SESSION optimizer_switch='mrr=on';
+SET SESSION join_cache_level=6;
+EXPLAIN
+SELECT * FROM t1, t2
+WHERE t2.a IN (SELECT b FROM t3 WHERE t3.d <= t1.a);
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY t1 ALL NULL NULL NULL NULL 2 Start temporary
+1 PRIMARY t3 ALL d NULL NULL NULL 5 Range checked for each record (index map: 0x2)
+1 PRIMARY t2 eq_ref PRIMARY PRIMARY 4 test.t3.b 1 End temporary; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
+SELECT * FROM t1, t2
+WHERE t2.a IN (SELECT b FROM t3 WHERE t3.d <= t1.a);
+a a b
+w 2 18:56:33
+q 2 18:56:33
+w 5 19:11:10
+set optimizer_switch=@save_optimizer_switch;
+set join_cache_level=default;
+DROP TABLE t1,t2,t3;
# End
set join_cache_level=default;
show variables like 'join_cache_level';
diff --git a/mysql-test/t/subselect_sj_jcl6.test b/mysql-test/t/subselect_sj_jcl6.test
index e475adbf9a8..fc539ec1a01 100644
--- a/mysql-test/t/subselect_sj_jcl6.test
+++ b/mysql-test/t/subselect_sj_jcl6.test
@@ -43,6 +43,48 @@ SELECT * FROM t0 WHERE t0.a IN
set optimizer_switch=@save_optimizer_switch;
drop table t0, t1, t2;
+--echo #
+--echo # Bug #891995: IN subquery with join_cache_level >= 3
+--echo #
+
+CREATE TABLE t1 (a varchar(1));
+INSERT INTO t1 VALUES ('w'),('q');
+
+CREATE TABLE t2 (a int NOT NULL, b time, PRIMARY KEY (a));
+INSERT INTO t2 VALUES
+ (2,'18:56:33'), (5,'19:11:10'), (3,'18:56:33'), (7,'19:11:10');
+
+CREATE TABLE t3 (
+ a int NOT NULL, b int, c int, d varchar(1), PRIMARY KEY (a), KEY (d,c)
+);
+INSERT INTO t3 VALUES
+ (25,158,10,'f'), (26,5,2,'v'), (27,163,103,'f'), (28,2,3,'q'), (29,8,6,'y');
+
+set @save_optimizer_switch=@@optimizer_switch;
+SET SESSION optimizer_switch='semijoin=on';
+
+SET SESSION optimizer_switch='join_cache_hashed=on';
+SET SESSION join_cache_level=3;
+EXPLAIN
+SELECT * FROM t1, t2
+ WHERE t2.a IN (SELECT b FROM t3 WHERE t3.d <= t1.a);
+SELECT * FROM t1, t2
+ WHERE t2.a IN (SELECT b FROM t3 WHERE t3.d <= t1.a);
+
+
+SET SESSION optimizer_switch='mrr=on';
+SET SESSION join_cache_level=6;
+EXPLAIN
+SELECT * FROM t1, t2
+ WHERE t2.a IN (SELECT b FROM t3 WHERE t3.d <= t1.a);
+SELECT * FROM t1, t2
+ WHERE t2.a IN (SELECT b FROM t3 WHERE t3.d <= t1.a);
+
+set optimizer_switch=@save_optimizer_switch;
+set join_cache_level=default;
+
+DROP TABLE t1,t2,t3;
+
--echo # End
set join_cache_level=default;
diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc
index a954811bdfa..efaac11f53b 100644
--- a/sql/opt_subselect.cc
+++ b/sql/opt_subselect.cc
@@ -3921,8 +3921,8 @@ int setup_semijoin_dups_elimination(JOIN *join, ulonglong options,
if (j != join->const_tables && js_tab->use_quick != 2 &&
j <= no_jbuf_after &&
((js_tab->type == JT_ALL && join_cache_level != 0) ||
- (join_cache_level > 2 && (tab->type == JT_REF ||
- tab->type == JT_EQ_REF))))
+ (join_cache_level > 2 && (js_tab->type == JT_REF ||
+ js_tab->type == JT_EQ_REF))))
{
/* Looks like we'll be using join buffer */
first_table= join->const_tables;