mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Fixed a bug that caused crashes for SHOW CREATE VIEW <view> when <view> was recursive. Added a test case to check the fix.
This commit is contained in:
@ -239,15 +239,15 @@ as
|
|||||||
(
|
(
|
||||||
select *
|
select *
|
||||||
from folks
|
from folks
|
||||||
where name = 'Vasya' and dob = '2000-01-01'
|
where name = 'Vasya'
|
||||||
union
|
union
|
||||||
select p.*
|
select p.*
|
||||||
from folks as p, ancestors AS a
|
from folks as p, ancestors as fa
|
||||||
where p.id = a.father
|
where p.id = fa.father
|
||||||
union
|
union
|
||||||
select p.*
|
select p.*
|
||||||
from folks as p, ancestors AS a
|
from folks as p, ancestors as ma
|
||||||
where p.id = a.mother
|
where p.id = ma.mother
|
||||||
)
|
)
|
||||||
select * from ancestors;
|
select * from ancestors;
|
||||||
id name dob father mother
|
id name dob father mother
|
||||||
@ -346,7 +346,37 @@ id name dob father mother
|
|||||||
9 Grandma Ann 1941-10-15 NULL NULL
|
9 Grandma Ann 1941-10-15 NULL NULL
|
||||||
8 Grandma Sally 1943-08-23 5 6
|
8 Grandma Sally 1943-08-23 5 6
|
||||||
6 Grandgrandma Martha 1923-05-17 NULL NULL
|
6 Grandgrandma Martha 1923-05-17 NULL NULL
|
||||||
drop view v1;
|
create view v2 as
|
||||||
|
with recursive
|
||||||
|
ancestors
|
||||||
|
as
|
||||||
|
(
|
||||||
|
select *
|
||||||
|
from folks
|
||||||
|
where name = 'Vasya'
|
||||||
|
union
|
||||||
|
select p.*
|
||||||
|
from folks as p, ancestors as fa
|
||||||
|
where p.id = fa.father
|
||||||
|
union
|
||||||
|
select p.*
|
||||||
|
from folks as p, ancestors as ma
|
||||||
|
where p.id = ma.mother
|
||||||
|
)
|
||||||
|
select * from ancestors;
|
||||||
|
show create view v2;
|
||||||
|
View Create View character_set_client collation_connection
|
||||||
|
v2 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS with recursive ancestors as (select `folks`.`id` AS `id`,`folks`.`name` AS `name`,`folks`.`dob` AS `dob`,`folks`.`father` AS `father`,`folks`.`mother` AS `mother` from `folks` where (`folks`.`name` = 'Vasya') union select `p`.`id` AS `id`,`p`.`name` AS `name`,`p`.`dob` AS `dob`,`p`.`father` AS `father`,`p`.`mother` AS `mother` from (`folks` `p` join `ancestors` `fa`) where (`p`.`id` = `fa`.`father`) union select `p`.`id` AS `id`,`p`.`name` AS `name`,`p`.`dob` AS `dob`,`p`.`father` AS `father`,`p`.`mother` AS `mother` from (`folks` `p` join `ancestors` `ma`) where (`p`.`id` = `ma`.`mother`))select `ancestors`.`id` AS `id`,`ancestors`.`name` AS `name`,`ancestors`.`dob` AS `dob`,`ancestors`.`father` AS `father`,`ancestors`.`mother` AS `mother` from `ancestors` latin1 latin1_swedish_ci
|
||||||
|
select * from v2;
|
||||||
|
id name dob father mother
|
||||||
|
100 Vasya 2000-01-01 20 30
|
||||||
|
20 Dad 1970-02-02 10 9
|
||||||
|
30 Mom 1975-03-03 8 7
|
||||||
|
9 Grandma Ann 1941-10-15 NULL NULL
|
||||||
|
10 Grandpa Bill 1940-04-05 NULL NULL
|
||||||
|
8 Grandma Sally 1943-08-23 5 6
|
||||||
|
6 Grandgrandma Martha 1923-05-17 NULL NULL
|
||||||
|
drop view v1,v2;
|
||||||
explain extended
|
explain extended
|
||||||
with recursive
|
with recursive
|
||||||
ancestors
|
ancestors
|
||||||
|
@ -199,15 +199,15 @@ as
|
|||||||
(
|
(
|
||||||
select *
|
select *
|
||||||
from folks
|
from folks
|
||||||
where name = 'Vasya' and dob = '2000-01-01'
|
where name = 'Vasya'
|
||||||
union
|
union
|
||||||
select p.*
|
select p.*
|
||||||
from folks as p, ancestors AS a
|
from folks as p, ancestors as fa
|
||||||
where p.id = a.father
|
where p.id = fa.father
|
||||||
union
|
union
|
||||||
select p.*
|
select p.*
|
||||||
from folks as p, ancestors AS a
|
from folks as p, ancestors as ma
|
||||||
where p.id = a.mother
|
where p.id = ma.mother
|
||||||
)
|
)
|
||||||
select * from ancestors;
|
select * from ancestors;
|
||||||
|
|
||||||
@ -279,8 +279,30 @@ show create view v1;
|
|||||||
|
|
||||||
select * from v1;
|
select * from v1;
|
||||||
|
|
||||||
drop view v1;
|
create view v2 as
|
||||||
|
with recursive
|
||||||
|
ancestors
|
||||||
|
as
|
||||||
|
(
|
||||||
|
select *
|
||||||
|
from folks
|
||||||
|
where name = 'Vasya'
|
||||||
|
union
|
||||||
|
select p.*
|
||||||
|
from folks as p, ancestors as fa
|
||||||
|
where p.id = fa.father
|
||||||
|
union
|
||||||
|
select p.*
|
||||||
|
from folks as p, ancestors as ma
|
||||||
|
where p.id = ma.mother
|
||||||
|
)
|
||||||
|
select * from ancestors;
|
||||||
|
|
||||||
|
show create view v2;
|
||||||
|
|
||||||
|
select * from v2;
|
||||||
|
|
||||||
|
drop view v1,v2;
|
||||||
|
|
||||||
explain extended
|
explain extended
|
||||||
with recursive
|
with recursive
|
||||||
|
@ -330,8 +330,10 @@ With_element *With_clause::find_table_def(TABLE_LIST *table)
|
|||||||
with_elem != NULL;
|
with_elem != NULL;
|
||||||
with_elem= with_elem->next_elem)
|
with_elem= with_elem->next_elem)
|
||||||
{
|
{
|
||||||
if (my_strcasecmp(system_charset_info, with_elem->query_name->str, table->table_name) == 0)
|
if (my_strcasecmp(system_charset_info, with_elem->query_name->str,
|
||||||
|
table->table_name) == 0)
|
||||||
{
|
{
|
||||||
|
table->set_derived();
|
||||||
return with_elem;
|
return with_elem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -740,6 +742,8 @@ bool st_select_lex::check_unrestricted_recursive()
|
|||||||
encountered))
|
encountered))
|
||||||
return true;
|
return true;
|
||||||
with_elem->owner->unrestricted|= unrestricted;
|
with_elem->owner->unrestricted|= unrestricted;
|
||||||
|
if (with_sum_func)
|
||||||
|
with_elem->owner->unrestricted|= with_elem->mutually_recursive;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -813,7 +817,7 @@ bool With_element::check_unrestricted_recursive(st_select_lex *sel,
|
|||||||
{
|
{
|
||||||
if (tab->outer_join & (JOIN_TYPE_LEFT | JOIN_TYPE_RIGHT))
|
if (tab->outer_join & (JOIN_TYPE_LEFT | JOIN_TYPE_RIGHT))
|
||||||
{
|
{
|
||||||
unrestricted|= get_elem_map();
|
unrestricted|= mutually_recursive;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -205,13 +205,13 @@ select_union_recursive::create_result_table(THD *thd_arg,
|
|||||||
{
|
{
|
||||||
if (select_union::create_result_table(thd_arg, column_types,
|
if (select_union::create_result_table(thd_arg, column_types,
|
||||||
is_union_distinct, options,
|
is_union_distinct, options,
|
||||||
alias, bit_fields_as_long,
|
"", bit_fields_as_long,
|
||||||
create_table, keep_row_order))
|
create_table, keep_row_order))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (! (incr_table= create_tmp_table(thd_arg, &tmp_table_param, *column_types,
|
if (! (incr_table= create_tmp_table(thd_arg, &tmp_table_param, *column_types,
|
||||||
(ORDER*) 0, false, 1,
|
(ORDER*) 0, false, 1,
|
||||||
options, HA_POS_ERROR, alias,
|
options, HA_POS_ERROR, "",
|
||||||
!create_table, keep_row_order)))
|
!create_table, keep_row_order)))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user