Commit 8f80663b authored by Igor Babaev's avatar Igor Babaev

Merge

parents b9890b05 f491ab53
...@@ -1743,4 +1743,62 @@ ON t4.carrier = t1.carrier; ...@@ -1743,4 +1743,62 @@ ON t4.carrier = t1.carrier;
COUNT(*) COUNT(*)
6 6
DROP TABLE t1,t2,t3,t4,t5; DROP TABLE t1,t2,t3,t4,t5;
CREATE TABLE t1 (
pk int NOT NULL AUTO_INCREMENT PRIMARY KEY,
a int DEFAULT NULL,
KEY idx(a)
);
CREATE TABLE t2 (
pk int NOT NULL AUTO_INCREMENT PRIMARY KEY,
a int DEFAULT NULL,
KEY idx(a)
);
CREATE TABLE t3 (
pk int NOT NULL AUTO_INCREMENT PRIMARY KEY,
a int DEFAULT NULL,
KEY idx(a)
);
INSERT INTO t1 VALUES
(1,2), (2,7), (3,5), (4,7), (5,5), (6,NULL), (7,NULL), (8,9);
INSERT INTO t2 VALUES
(1,NULL), (4,2), (5,2), (3,4), (2,8);
INSERT INTO t3 VALUES
(1,9), (2,2), (3,5), (4,2), (5,7), (6,0), (7,5);
SELECT t1.pk, t1.a, t2.pk, t2.a,t3.pk, t3.a
FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t3.a=t2.a) ON t2.a=t1.a;
pk a pk a pk a
1 2 4 2 2 2
1 2 4 2 4 2
1 2 5 2 2 2
1 2 5 2 4 2
2 7 NULL NULL NULL NULL
3 5 NULL NULL NULL NULL
4 7 NULL NULL NULL NULL
5 5 NULL NULL NULL NULL
6 NULL NULL NULL NULL NULL
7 NULL NULL NULL NULL NULL
8 9 NULL NULL NULL NULL
SELECT t1.pk, t1.a, t2.pk, t2.a,t3.pk, t3.a
FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t3.a=t2.a) ON t2.a=t1.a
WHERE t2.pk IS NULL;
pk a pk a pk a
2 7 NULL NULL NULL NULL
3 5 NULL NULL NULL NULL
4 7 NULL NULL NULL NULL
5 5 NULL NULL NULL NULL
6 NULL NULL NULL NULL NULL
7 NULL NULL NULL NULL NULL
8 9 NULL NULL NULL NULL
SELECT t1.pk, t1.a, t2.pk, t2.a,t3.pk, t3.a
FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t3.a=t2.a) ON t2.a=t1.a
WHERE t3.pk IS NULL;
pk a pk a pk a
2 7 NULL NULL NULL NULL
3 5 NULL NULL NULL NULL
4 7 NULL NULL NULL NULL
5 5 NULL NULL NULL NULL
6 NULL NULL NULL NULL NULL
7 NULL NULL NULL NULL NULL
8 9 NULL NULL NULL NULL
DROP TABLE t1, t2, t3;
End of 5.0 tests End of 5.0 tests
...@@ -1196,5 +1196,45 @@ SELECT COUNT(*) ...@@ -1196,5 +1196,45 @@ SELECT COUNT(*)
DROP TABLE t1,t2,t3,t4,t5; DROP TABLE t1,t2,t3,t4,t5;
#
# BUG#49322: Nested left joins + not-exist optimization
#
CREATE TABLE t1 (
pk int NOT NULL AUTO_INCREMENT PRIMARY KEY,
a int DEFAULT NULL,
KEY idx(a)
);
CREATE TABLE t2 (
pk int NOT NULL AUTO_INCREMENT PRIMARY KEY,
a int DEFAULT NULL,
KEY idx(a)
);
CREATE TABLE t3 (
pk int NOT NULL AUTO_INCREMENT PRIMARY KEY,
a int DEFAULT NULL,
KEY idx(a)
);
INSERT INTO t1 VALUES
(1,2), (2,7), (3,5), (4,7), (5,5), (6,NULL), (7,NULL), (8,9);
INSERT INTO t2 VALUES
(1,NULL), (4,2), (5,2), (3,4), (2,8);
INSERT INTO t3 VALUES
(1,9), (2,2), (3,5), (4,2), (5,7), (6,0), (7,5);
SELECT t1.pk, t1.a, t2.pk, t2.a,t3.pk, t3.a
FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t3.a=t2.a) ON t2.a=t1.a;
SELECT t1.pk, t1.a, t2.pk, t2.a,t3.pk, t3.a
FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t3.a=t2.a) ON t2.a=t1.a
WHERE t2.pk IS NULL;
SELECT t1.pk, t1.a, t2.pk, t2.a,t3.pk, t3.a
FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t3.a=t2.a) ON t2.a=t1.a
WHERE t3.pk IS NULL;
DROP TABLE t1, t2, t3;
--echo End of 5.0 tests --echo End of 5.0 tests
...@@ -11738,6 +11738,7 @@ evaluate_join_record(JOIN *join, JOIN_TAB *join_tab, ...@@ -11738,6 +11738,7 @@ evaluate_join_record(JOIN *join, JOIN_TAB *join_tab,
condition is true => a match is found. condition is true => a match is found.
*/ */
bool found= 1; bool found= 1;
bool use_not_exists_opt= 0;
while (join_tab->first_unmatched && found) while (join_tab->first_unmatched && found)
{ {
/* /*
...@@ -11754,7 +11755,7 @@ evaluate_join_record(JOIN *join, JOIN_TAB *join_tab, ...@@ -11754,7 +11755,7 @@ evaluate_join_record(JOIN *join, JOIN_TAB *join_tab,
for (JOIN_TAB *tab= first_unmatched; tab <= join_tab; tab++) for (JOIN_TAB *tab= first_unmatched; tab <= join_tab; tab++)
{ {
if (tab->table->reginfo.not_exists_optimize) if (tab->table->reginfo.not_exists_optimize)
return NESTED_LOOP_NO_MORE_ROWS; use_not_exists_opt= 1;
/* Check all predicates that has just been activated. */ /* Check all predicates that has just been activated. */
/* /*
Actually all predicates non-guarded by first_unmatched->found Actually all predicates non-guarded by first_unmatched->found
...@@ -11787,6 +11788,9 @@ evaluate_join_record(JOIN *join, JOIN_TAB *join_tab, ...@@ -11787,6 +11788,9 @@ evaluate_join_record(JOIN *join, JOIN_TAB *join_tab,
join_tab->first_unmatched= first_unmatched; join_tab->first_unmatched= first_unmatched;
} }
if (use_not_exists_opt)
return NESTED_LOOP_NO_MORE_ROWS;
/* /*
It was not just a return to lower loop level when one It was not just a return to lower loop level when one
of the newly activated predicates is evaluated as false of the newly activated predicates is evaluated as false
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment