@@ -2008,6 +2008,58 @@ Note 1003 select `test`.`t3`.`pk` AS `pk`,`test`.`t3`.`c1` AS `c1`,`test`.`t3`.`
20082008DROP TABLE t1,t2,t3;
20092009set join_cache_level= @save_join_cache_level;
20102010set optimizer_switch=@save_optimizer_switch;
2011+ #
2012+ # MDEV-27624: Nested left joins with not_exists optimization
2013+ # for most inner left join
2014+ #
2015+ set @save_join_cache_level= @@join_cache_level;
2016+ CREATE TABLE t1 (a INT NOT NULL, b INT, c INT);
2017+ INSERT INTO t1 VALUES (1,1,1), (1,2,1), (1,3,1);
2018+ CREATE TABLE t2(a INT NOT NULL);
2019+ INSERT INTO t2 VALUES (1), (2);
2020+ CREATE TABLE t3(a INT not null, b INT);
2021+ INSERT INTO t3 VALUES (1, 1), (2, 1), (3, 1);
2022+ set join_cache_level = 0;
2023+ EXPLAIN SELECT *
2024+ FROM t1
2025+ LEFT JOIN
2026+ ( t2 LEFT JOIN t3 ON t2.a = t3.b )
2027+ ON t2.a = 1 AND (t3.b = t1.a AND t3.a > t1.b OR t3.a is NULL)
2028+ WHERE t1.c = 1 AND t3.a is NULL;
2029+ id select_type table type possible_keys key key_len ref rows Extra
2030+ 1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using where
2031+ 1 SIMPLE t2 ALL NULL NULL NULL NULL 2 Using where
2032+ 1 SIMPLE t3 ALL NULL NULL NULL NULL 3 Using where; Not exists
2033+ SELECT *
2034+ FROM t1
2035+ LEFT JOIN
2036+ ( t2 LEFT JOIN t3 ON t2.a = t3.b )
2037+ ON t2.a = 1 AND (t3.b = t1.a AND t3.a > t1.b OR t3.a is NULL)
2038+ WHERE t1.c = 1 AND t3.a is NULL;
2039+ a b c a a b
2040+ 1 3 1 NULL NULL NULL
2041+ set join_cache_level = 2;
2042+ EXPLAIN SELECT *
2043+ FROM t1
2044+ LEFT JOIN
2045+ ( t2 LEFT JOIN t3 ON t2.a = t3.b )
2046+ ON t2.a = 1 AND (t3.b = t1.a AND t3.a > t1.b OR t3.a is NULL)
2047+ WHERE t1.c = 1 AND t3.a is NULL;
2048+ id select_type table type possible_keys key key_len ref rows Extra
2049+ 1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using where
2050+ 1 SIMPLE t2 ALL NULL NULL NULL NULL 2 Using where; Using join buffer (flat, BNL join)
2051+ 1 SIMPLE t3 ALL NULL NULL NULL NULL 3 Using where; Not exists; Using join buffer (incremental, BNL join)
2052+ SELECT *
2053+ FROM t1
2054+ LEFT JOIN
2055+ ( t2 LEFT JOIN t3 ON t2.a = t3.b )
2056+ ON t2.a = 1 AND (t3.b = t1.a AND t3.a > t1.b OR t3.a is NULL)
2057+ WHERE t1.c = 1 AND t3.a is NULL;
2058+ a b c a a b
2059+ 1 3 1 NULL NULL NULL
2060+ DROP TABLE t1, t2, t3;
2061+ set join_cache_level= @save_join_cache_level;
2062+ # end of 10.3 tests
20112063CREATE TABLE t5 (a int, b int, c int, PRIMARY KEY(a), KEY b_i (b));
20122064CREATE TABLE t6 (a int, b int, c int, PRIMARY KEY(a), KEY b_i (b));
20132065CREATE TABLE t7 (a int, b int, c int, PRIMARY KEY(a), KEY b_i (b));
0 commit comments