mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fixed LP bug #874006.
This bug manifested itself with queries containing non-correlated IN subqueries over materialized views/derived tables. The bug happened because the code of the function generate_derived_keys did not take into account that the function could be called twice when the optimizer was deciding whether in-exist transformation should be applied.
This commit is contained in:
@ -781,7 +781,7 @@ SELECT * FROM t3
|
||||
WHERE t3.a IN (SELECT v1.a FROM v1, t2 WHERE t2.a = v1.b);
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 4 100.00 Using where
|
||||
2 DEPENDENT SUBQUERY <derived3> ref key0 key0 5 func 2 100.00
|
||||
2 DEPENDENT SUBQUERY <derived3> ref key1 key1 5 func 2 100.00
|
||||
2 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 3 100.00 Using where; Using join buffer (flat, BNL join)
|
||||
3 DERIVED t1 ALL NULL NULL NULL NULL 3 100.00 Using temporary; Using filesort
|
||||
Warnings:
|
||||
@ -1462,4 +1462,46 @@ b a
|
||||
9 2
|
||||
7 2
|
||||
DROP TABLE t1,t2,t3;
|
||||
#
|
||||
# LP bug #874006: materialized view used in IN subquery
|
||||
#
|
||||
CREATE TABLE t3 (a int NOT NULL, b varchar(1), c varchar(1));
|
||||
INSERT INTO t3 VALUES (19,NULL,NULL), (20,'r','r');
|
||||
CREATE TABLE t1 (a int, b varchar(1) , c varchar(1));
|
||||
INSERT INTO t1 VALUES (1,NULL,NULL), (5,'r','r'), (7,'y','y');
|
||||
CREATE TABLE t2 (a int NOT NULL , b int, c varchar(1));
|
||||
INSERT INTO t2 VALUES (4,3,'r');
|
||||
CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
|
||||
SET SESSION optimizer_switch='derived_with_keys=off';
|
||||
EXPLAIN
|
||||
SELECT * FROM t3
|
||||
WHERE t3.b IN (SELECT v1.b FROM v1, t2
|
||||
WHERE t2.c = v1.c AND t2.c = v1.b AND v1.b = t3.c);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 2 Using where
|
||||
2 DEPENDENT SUBQUERY t2 system NULL NULL NULL NULL 1
|
||||
2 DEPENDENT SUBQUERY <derived3> ALL NULL NULL NULL NULL 3 Using where
|
||||
3 DERIVED t1 ALL NULL NULL NULL NULL 3
|
||||
SELECT * FROM t3
|
||||
WHERE t3.b IN (SELECT v1.b FROM v1, t2
|
||||
WHERE t2.c = v1.c AND t2.c = v1.b AND v1.b = t3.c);
|
||||
a b c
|
||||
20 r r
|
||||
SET SESSION optimizer_switch='derived_with_keys=on';
|
||||
EXPLAIN
|
||||
SELECT * FROM t3
|
||||
WHERE t3.b IN (SELECT v1.b FROM v1, t2
|
||||
WHERE t2.c = v1.c AND t2.c = v1.b AND v1.b = t3.c);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 2 Using where
|
||||
2 DEPENDENT SUBQUERY t2 system NULL NULL NULL NULL 1
|
||||
2 DEPENDENT SUBQUERY <derived3> ref key1 key1 10 const,const 0 Using where
|
||||
3 DERIVED t1 ALL NULL NULL NULL NULL 3
|
||||
SELECT * FROM t3
|
||||
WHERE t3.b IN (SELECT v1.b FROM v1, t2
|
||||
WHERE t2.c = v1.c AND t2.c = v1.b AND v1.b = t3.c);
|
||||
a b c
|
||||
20 r r
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1,t2,t3;
|
||||
set optimizer_switch=@exit_optimizer_switch;
|
||||
|
@ -910,5 +910,42 @@ SELECT * FROM t1 , t2
|
||||
|
||||
DROP TABLE t1,t2,t3;
|
||||
|
||||
--echo #
|
||||
--echo # LP bug #874006: materialized view used in IN subquery
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t3 (a int NOT NULL, b varchar(1), c varchar(1));
|
||||
INSERT INTO t3 VALUES (19,NULL,NULL), (20,'r','r');
|
||||
|
||||
CREATE TABLE t1 (a int, b varchar(1) , c varchar(1));
|
||||
INSERT INTO t1 VALUES (1,NULL,NULL), (5,'r','r'), (7,'y','y');
|
||||
|
||||
CREATE TABLE t2 (a int NOT NULL , b int, c varchar(1));
|
||||
INSERT INTO t2 VALUES (4,3,'r');
|
||||
|
||||
CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
|
||||
|
||||
SET SESSION optimizer_switch='derived_with_keys=off';
|
||||
EXPLAIN
|
||||
SELECT * FROM t3
|
||||
WHERE t3.b IN (SELECT v1.b FROM v1, t2
|
||||
WHERE t2.c = v1.c AND t2.c = v1.b AND v1.b = t3.c);
|
||||
SELECT * FROM t3
|
||||
WHERE t3.b IN (SELECT v1.b FROM v1, t2
|
||||
WHERE t2.c = v1.c AND t2.c = v1.b AND v1.b = t3.c);
|
||||
|
||||
SET SESSION optimizer_switch='derived_with_keys=on';
|
||||
EXPLAIN
|
||||
SELECT * FROM t3
|
||||
WHERE t3.b IN (SELECT v1.b FROM v1, t2
|
||||
WHERE t2.c = v1.c AND t2.c = v1.b AND v1.b = t3.c);
|
||||
SELECT * FROM t3
|
||||
WHERE t3.b IN (SELECT v1.b FROM v1, t2
|
||||
WHERE t2.c = v1.c AND t2.c = v1.b AND v1.b = t3.c);
|
||||
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1,t2,t3;
|
||||
|
||||
|
||||
# The following command must be the last one the file
|
||||
set optimizer_switch=@exit_optimizer_switch;
|
||||
|
Reference in New Issue
Block a user