From b9bbe4a18ba8569cd1cedd391725e4ee214d9be7 Mon Sep 17 00:00:00 2001 From: Sergey Petrunya Date: Thu, 19 Apr 2012 05:37:16 +0400 Subject: [PATCH] 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. --- mysql-test/r/subselect_sj.result | 19 ++++++++++++++++--- mysql-test/r/subselect_sj_jcl6.result | 19 ++++++++++++++++--- mysql-test/t/subselect_sj.test | 3 +++ 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 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 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 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 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)) {