Commit 48b4e335 authored by Igor Babaev's avatar Igor Babaev

Allowed to use WITH clauses before SELECT in CREATE ... SELECT

and INSERT ... SELECT.
Added test cases.
parent 4368efe8
...@@ -1556,6 +1556,54 @@ EXPLAIN ...@@ -1556,6 +1556,54 @@ EXPLAIN
} }
} }
} }
create table my_ancestors
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 folks, ancestor_ids a where folks.id = a.id
union
select mother from folks, ancestor_ids a where folks.id = a.id
)
select p.* from folks as p, ancestor_ids as a where p.id = a.id;
select * from my_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
delete from my_ancestors;
insert into my_ancestors
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 folks, ancestor_ids a where folks.id = a.id
union
select mother from folks, ancestor_ids a where folks.id = a.id
)
select p.* from folks as p, ancestor_ids as a where p.id = a.id;
select * from my_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 my_ancestors;
drop table folks; drop table folks;
# #
# MDEV-10372: [bb-10.2-mdev9864 tree] EXPLAIN with recursive CTE enters endless recursion # MDEV-10372: [bb-10.2-mdev9864 tree] EXPLAIN with recursive CTE enters endless recursion
......
...@@ -1162,6 +1162,44 @@ select h_name, h_dob, w_name, w_dob ...@@ -1162,6 +1162,44 @@ select h_name, h_dob, w_name, w_dob
from ancestor_couples; from ancestor_couples;
create table my_ancestors
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 folks, ancestor_ids a where folks.id = a.id
union
select mother from folks, ancestor_ids a where folks.id = a.id
)
select p.* from folks as p, ancestor_ids as a where p.id = a.id;
select * from my_ancestors;
delete from my_ancestors;
insert into my_ancestors
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 folks, ancestor_ids a where folks.id = a.id
union
select mother from folks, ancestor_ids a where folks.id = a.id
)
select p.* from folks as p, ancestor_ids as a where p.id = a.id;
select * from my_ancestors;
drop table my_ancestors;
drop table folks; drop table folks;
--echo # --echo #
......
...@@ -3781,7 +3781,8 @@ mysql_execute_command(THD *thd) ...@@ -3781,7 +3781,8 @@ mysql_execute_command(THD *thd)
/* Copy temporarily the statement flags to thd for lock_table_names() */ /* Copy temporarily the statement flags to thd for lock_table_names() */
uint save_thd_create_info_options= thd->lex->create_info.options; uint save_thd_create_info_options= thd->lex->create_info.options;
thd->lex->create_info.options|= create_info.options; thd->lex->create_info.options|= create_info.options;
res= open_and_lock_tables(thd, create_info, lex->query_tables, TRUE, 0); if (!(res= check_dependencies_in_with_clauses(lex->with_clauses_list)))
res= open_and_lock_tables(thd, create_info, lex->query_tables, TRUE, 0);
thd->lex->create_info.options= save_thd_create_info_options; thd->lex->create_info.options= save_thd_create_info_options;
if (res) if (res)
{ {
...@@ -4394,7 +4395,8 @@ mysql_execute_command(THD *thd) ...@@ -4394,7 +4395,8 @@ mysql_execute_command(THD *thd)
unit->set_limit(select_lex); unit->set_limit(select_lex);
if (!(res= open_and_lock_tables(thd, all_tables, TRUE, 0))) if (!(res= check_dependencies_in_with_clauses(lex->with_clauses_list)) &&
!(res=open_and_lock_tables(thd, all_tables, TRUE, 0)))
{ {
MYSQL_INSERT_SELECT_START(thd->query()); MYSQL_INSERT_SELECT_START(thd->query());
/* /*
......
...@@ -4810,16 +4810,22 @@ create_like: ...@@ -4810,16 +4810,22 @@ create_like:
opt_create_select: opt_create_select:
/* empty */ {} /* empty */ {}
| opt_duplicate opt_as create_select_query_expression_body | opt_duplicate opt_as create_select_query_expression
; ;
create_select_query_expression_body: create_select_query_expression:
SELECT_SYM create_select_part2 opt_table_expression opt_with_clause SELECT_SYM create_select_part2 opt_table_expression
create_select_part4 create_select_part4
{ Select->set_braces(0);} {
Select->set_braces(0);
Select->set_with_clause($1);
}
union_clause union_clause
| SELECT_SYM create_select_part2 create_select_part3_union_not_ready | opt_with_clause SELECT_SYM create_select_part2
create_select_part4 create_select_part3_union_not_ready create_select_part4
{
Select->set_with_clause($1);
}
| '(' create_select_query_specification ')' | '(' create_select_query_specification ')'
| '(' create_select_query_specification ')' | '(' create_select_query_specification ')'
{ Select->set_braces(1);} union_list {} { Select->set_braces(1);} union_list {}
...@@ -5519,7 +5525,11 @@ opt_part_option: ...@@ -5519,7 +5525,11 @@ opt_part_option:
*/ */
create_select_query_specification: create_select_query_specification:
SELECT_SYM create_select_part2 create_select_part3 create_select_part4 SELECT_SYM opt_with_clause create_select_part2 create_select_part3
create_select_part4
{
Select->set_with_clause($2);
}
; ;
create_select_part2: create_select_part2:
...@@ -12308,7 +12318,7 @@ fields: ...@@ -12308,7 +12318,7 @@ fields:
insert_values: insert_values:
VALUES values_list {} VALUES values_list {}
| VALUE_SYM values_list {} | VALUE_SYM values_list {}
| create_select_query_expression_body {} | create_select_query_expression {}
; ;
values_list: values_list:
......
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