mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
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.
This commit is contained in:
parent
994c6db2d1
commit
b9bbe4a18b
4 changed files with 38 additions and 7 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue