mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Fixed bug mdev-12360.
The method With_element::check_unrestricted_recursive() icorrectly performed the check that no recursive reference is not encountered in inner parts of outer joins. As a result the server reported errors for valid specifications with outer joins.
This commit is contained in:
@ -2408,3 +2408,48 @@ ANALYZE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#
|
||||||
|
# mdev-12360: recursive reference in left operand of LEFT JOIN
|
||||||
|
#
|
||||||
|
create table folks(id int, name char(32), dob date, father int, mother int);
|
||||||
|
insert into folks values
|
||||||
|
(100, 'Me', '2000-01-01', 20, 30),
|
||||||
|
(20, 'Dad', '1970-02-02', 10, 9),
|
||||||
|
(30, 'Mom', '1975-03-03', 8, 7),
|
||||||
|
(10, 'Grandpa Bill', '1940-04-05', null, null),
|
||||||
|
(9, 'Grandma Ann', '1941-10-15', null, null),
|
||||||
|
(25, 'Uncle Jim', '1968-11-18', 8, 7),
|
||||||
|
(98, 'Sister Amy', '2001-06-20', 20, 30),
|
||||||
|
(7, 'Grandma Sally', '1943-08-23', null, 6),
|
||||||
|
(8, 'Grandpa Ben', '1940-10-21', null, null),
|
||||||
|
(6, 'Grandgrandma Martha', '1923-05-17', null, null),
|
||||||
|
(67, 'Cousin Eddie', '1992-02-28', 25, 27),
|
||||||
|
(27, 'Auntie Melinda', '1971-03-29', null, null);
|
||||||
|
with recursive
|
||||||
|
ancestor_ids (id)
|
||||||
|
as
|
||||||
|
(
|
||||||
|
select father from folks where name = 'Me'
|
||||||
|
union
|
||||||
|
select mother from folks where name = 'Me'
|
||||||
|
union
|
||||||
|
select father from ancestor_ids as a left join folks on folks.id = a.id
|
||||||
|
union
|
||||||
|
select mother from ancestor_ids as a left join folks on folks.id = a.id
|
||||||
|
),
|
||||||
|
ancestors
|
||||||
|
as
|
||||||
|
(
|
||||||
|
select p.* from folks as p, ancestor_ids as a
|
||||||
|
where p.id = a.id
|
||||||
|
)
|
||||||
|
select * from ancestors;
|
||||||
|
id name dob father mother
|
||||||
|
20 Dad 1970-02-02 10 9
|
||||||
|
30 Mom 1975-03-03 8 7
|
||||||
|
10 Grandpa Bill 1940-04-05 NULL NULL
|
||||||
|
9 Grandma Ann 1941-10-15 NULL NULL
|
||||||
|
7 Grandma Sally 1943-08-23 NULL 6
|
||||||
|
8 Grandpa Ben 1940-10-21 NULL NULL
|
||||||
|
6 Grandgrandma Martha 1923-05-17 NULL NULL
|
||||||
|
drop table folks;
|
||||||
|
@ -1517,3 +1517,45 @@ with recursive src(counter) as
|
|||||||
union
|
union
|
||||||
select counter+1 from src where counter<10
|
select counter+1 from src where counter<10
|
||||||
) select * from src;
|
) select * from src;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # mdev-12360: recursive reference in left operand of LEFT JOIN
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
create table folks(id int, name char(32), dob date, father int, mother int);
|
||||||
|
|
||||||
|
insert into folks values
|
||||||
|
(100, 'Me', '2000-01-01', 20, 30),
|
||||||
|
(20, 'Dad', '1970-02-02', 10, 9),
|
||||||
|
(30, 'Mom', '1975-03-03', 8, 7),
|
||||||
|
(10, 'Grandpa Bill', '1940-04-05', null, null),
|
||||||
|
(9, 'Grandma Ann', '1941-10-15', null, null),
|
||||||
|
(25, 'Uncle Jim', '1968-11-18', 8, 7),
|
||||||
|
(98, 'Sister Amy', '2001-06-20', 20, 30),
|
||||||
|
(7, 'Grandma Sally', '1943-08-23', null, 6),
|
||||||
|
(8, 'Grandpa Ben', '1940-10-21', null, null),
|
||||||
|
(6, 'Grandgrandma Martha', '1923-05-17', null, null),
|
||||||
|
(67, 'Cousin Eddie', '1992-02-28', 25, 27),
|
||||||
|
(27, 'Auntie Melinda', '1971-03-29', null, null);
|
||||||
|
|
||||||
|
with recursive
|
||||||
|
ancestor_ids (id)
|
||||||
|
as
|
||||||
|
(
|
||||||
|
select father from folks where name = 'Me'
|
||||||
|
union
|
||||||
|
select mother from folks where name = 'Me'
|
||||||
|
union
|
||||||
|
select father from ancestor_ids as a left join folks on folks.id = a.id
|
||||||
|
union
|
||||||
|
select mother from ancestor_ids as a left join folks on folks.id = a.id
|
||||||
|
),
|
||||||
|
ancestors
|
||||||
|
as
|
||||||
|
(
|
||||||
|
select p.* from folks as p, ancestor_ids as a
|
||||||
|
where p.id = a.id
|
||||||
|
)
|
||||||
|
select * from ancestors;
|
||||||
|
|
||||||
|
drop table folks;
|
||||||
|
@ -1168,6 +1168,8 @@ bool With_element::check_unrestricted_recursive(st_select_lex *sel,
|
|||||||
ti.rewind();
|
ti.rewind();
|
||||||
while ((tbl= ti++))
|
while ((tbl= ti++))
|
||||||
{
|
{
|
||||||
|
if (!tbl->is_with_table_recursive_reference())
|
||||||
|
continue;
|
||||||
for (TABLE_LIST *tab= tbl; tab; tab= tab->embedding)
|
for (TABLE_LIST *tab= tbl; tab; tab= tab->embedding)
|
||||||
{
|
{
|
||||||
if (tab->outer_join & (JOIN_TYPE_LEFT | JOIN_TYPE_RIGHT))
|
if (tab->outer_join & (JOIN_TYPE_LEFT | JOIN_TYPE_RIGHT))
|
||||||
|
Reference in New Issue
Block a user