summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Petrunya <psergey@askmonty.org>2012-04-19 05:37:16 +0400
committerSergey Petrunya <psergey@askmonty.org>2012-04-19 05:37:16 +0400
commitb9bbe4a18ba8569cd1cedd391725e4ee214d9be7 (patch)
tree600fddc7dfc8927c8a3cbed5600db4da86e7e5fe
parent994c6db2d17eb035625387f4f5d4bdd8552fb767 (diff)
downloadmariadb-git-b9bbe4a18ba8569cd1cedd391725e4ee214d9be7.tar.gz
BUG#978479: Wrong result (extra rows) with derived_with_keys+loosescan+semijoin=ON, materialization=OFF
- Part#2: Don't try to construct a LooseScan access on indexes that do not guarantee index-ordered reads.
-rw-r--r--mysql-test/r/subselect_sj.result19
-rw-r--r--mysql-test/r/subselect_sj_jcl6.result19
-rw-r--r--mysql-test/t/subselect_sj.test3
-rw-r--r--sql/opt_subselect.h4
4 files changed, 38 insertions, 7 deletions
diff --git a/mysql-test/r/subselect_sj.result b/mysql-test/r/subselect_sj.result
index 710b2c92677..db0a278bc8a 100644
--- a/mysql-test/r/subselect_sj.result
+++ b/mysql-test/r/subselect_sj.result
@@ -2680,10 +2680,23 @@ EXPLAIN
SELECT * FROM t1 AS t1_1, t1 AS t1_2
WHERE (t1_1.a, t1_2.a) IN ( SELECT a, b FROM v1 );
id select_type table type possible_keys key key_len ref rows Extra
-1 PRIMARY t1_1 ALL NULL NULL NULL NULL 11
-1 PRIMARY <derived3> ALL NULL NULL NULL NULL 11 Using where; LooseScan
-1 PRIMARY t1_2 ALL NULL NULL NULL NULL 11 Using where
+1 PRIMARY t1_1 ALL NULL NULL NULL NULL 11 Using where
+1 PRIMARY <derived3> ref key0 key0 5 test.t1_1.a 2 Start temporary
+1 PRIMARY t1_2 ALL NULL NULL NULL NULL 11 Using where; End temporary
3 DERIVED t1 ALL NULL NULL NULL NULL 11
+SELECT * FROM t1 AS t1_1, t1 AS t1_2
+WHERE (t1_1.a, t1_2.a) IN ( SELECT a, b FROM v1 );
+a b a b
+3 1 9 1
+5 8 4 0
+3 9 9 1
+2 4 6 8
+2 4 4 0
+2 6 6 8
+2 6 4 0
+5 4 4 0
+7 7 7 7
+5 4 4 0
DROP VIEW v1;
DROP TABLE t1;
set @@join_cache_level= @tmp_jcl_978479;
diff --git a/mysql-test/r/subselect_sj_jcl6.result b/mysql-test/r/subselect_sj_jcl6.result
index 454e0e36ed7..8e9aba81935 100644
--- a/mysql-test/r/subselect_sj_jcl6.result
+++ b/mysql-test/r/subselect_sj_jcl6.result
@@ -2694,10 +2694,23 @@ EXPLAIN
SELECT * FROM t1 AS t1_1, t1 AS t1_2
WHERE (t1_1.a, t1_2.a) IN ( SELECT a, b FROM v1 );
id select_type table type possible_keys key key_len ref rows Extra
-1 PRIMARY t1_1 ALL NULL NULL NULL NULL 11
-1 PRIMARY <derived3> ALL NULL NULL NULL NULL 11 Using where; LooseScan
-1 PRIMARY t1_2 ALL NULL NULL NULL NULL 11 Using where
+1 PRIMARY t1_1 ALL NULL NULL NULL NULL 11 Using where
+1 PRIMARY <derived3> ref key0 key0 5 test.t1_1.a 2 Start temporary
+1 PRIMARY t1_2 ALL NULL NULL NULL NULL 11 Using where; End temporary
3 DERIVED t1 ALL NULL NULL NULL NULL 11
+SELECT * FROM t1 AS t1_1, t1 AS t1_2
+WHERE (t1_1.a, t1_2.a) IN ( SELECT a, b FROM v1 );
+a b a b
+3 1 9 1
+5 8 4 0
+3 9 9 1
+2 4 6 8
+2 4 4 0
+2 6 6 8
+2 6 4 0
+5 4 4 0
+7 7 7 7
+5 4 4 0
DROP VIEW v1;
DROP TABLE t1;
set @@join_cache_level= @tmp_jcl_978479;
diff --git a/mysql-test/t/subselect_sj.test b/mysql-test/t/subselect_sj.test
index 59f36ac3be9..7f1181bb562 100644
--- a/mysql-test/t/subselect_sj.test
+++ b/mysql-test/t/subselect_sj.test
@@ -2390,6 +2390,9 @@ EXPLAIN
SELECT * FROM t1 AS t1_1, t1 AS t1_2
WHERE (t1_1.a, t1_2.a) IN ( SELECT a, b FROM v1 );
+SELECT * FROM t1 AS t1_1, t1 AS t1_2
+ WHERE (t1_1.a, t1_2.a) IN ( SELECT a, b FROM v1 );
+
DROP VIEW v1;
DROP TABLE t1;
set @@join_cache_level= @tmp_jcl_978479;
diff --git a/sql/opt_subselect.h b/sql/opt_subselect.h
index 07f1fc77a20..eca7b1acb3b 100644
--- a/sql/opt_subselect.h
+++ b/sql/opt_subselect.h
@@ -130,7 +130,9 @@ public:
void add_keyuse(table_map remaining_tables, KEYUSE *keyuse)
{
- if (try_loosescan && keyuse->sj_pred_no != UINT_MAX)
+ if (try_loosescan && keyuse->sj_pred_no != UINT_MAX &&
+ (keyuse->table->file->index_flags(keyuse->key, 0, 1 ) & HA_READ_ORDER))
+
{
if (!(remaining_tables & keyuse->used_tables))
{