diff options
author | Sergey Petrunya <psergey@askmonty.org> | 2012-04-19 05:37:16 +0400 |
---|---|---|
committer | Sergey Petrunya <psergey@askmonty.org> | 2012-04-19 05:37:16 +0400 |
commit | b9bbe4a18ba8569cd1cedd391725e4ee214d9be7 (patch) | |
tree | 600fddc7dfc8927c8a3cbed5600db4da86e7e5fe | |
parent | 994c6db2d17eb035625387f4f5d4bdd8552fb767 (diff) | |
download | mariadb-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.result | 19 | ||||
-rw-r--r-- | mysql-test/r/subselect_sj_jcl6.result | 19 | ||||
-rw-r--r-- | mysql-test/t/subselect_sj.test | 3 | ||||
-rw-r--r-- | sql/opt_subselect.h | 4 |
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)) { |