Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
bc4a8669
Commit
bc4a8669
authored
7 years ago
by
Aleksey Midenkov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
SQL: recursive CTE inner derived vers_conditions [fix #385]
parent
22f45062
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
48 additions
and
12 deletions
+48
-12
mysql-test/suite/versioning/r/cte.result
mysql-test/suite/versioning/r/cte.result
+17
-0
mysql-test/suite/versioning/t/cte.test
mysql-test/suite/versioning/t/cte.test
+15
-0
sql/sql_derived.cc
sql/sql_derived.cc
+0
-2
sql/sql_lex.cc
sql/sql_lex.cc
+0
-1
sql/sql_lex.h
sql/sql_lex.h
+0
-1
sql/sql_select.cc
sql/sql_select.cc
+16
-8
No files found.
mysql-test/suite/versioning/r/cte.result
View file @
bc4a8669
...
...
@@ -91,6 +91,23 @@ insert addr values (1, 'Moscow'), (2, 'New York'), (3, 'London');
set @ts=now(6);
delete from emp;
delete from addr;
with recursive
ancestors
as
(
select e.emp_id, e.name, e.mgr
from emp for system_time as of timestamp @ts as e
where name = 'bill'
union
select ee.emp_id, ee.name, ee.mgr
from emp for system_time as of timestamp @ts as ee, ancestors as a
where ee.mgr = a.emp_id
)
select * from ancestors;
emp_id name mgr
1 bill 0
2 bill 1
3 kate 1
insert emp values (4, 'john', 1);
insert addr values (4, 'Paris');
with ancestors as (select * from emp natural join addr) select * from ancestors;
...
...
This diff is collapsed.
Click to expand it.
mysql-test/suite/versioning/t/cte.test
View file @
bc4a8669
...
...
@@ -90,6 +90,21 @@ insert addr values (1, 'Moscow'), (2, 'New York'), (3, 'London');
set
@
ts
=
now
(
6
);
delete
from
emp
;
delete
from
addr
;
with
recursive
ancestors
as
(
select
e
.
emp_id
,
e
.
name
,
e
.
mgr
from
emp
for
system_time
as
of
timestamp
@
ts
as
e
where
name
=
'bill'
union
select
ee
.
emp_id
,
ee
.
name
,
ee
.
mgr
from
emp
for
system_time
as
of
timestamp
@
ts
as
ee
,
ancestors
as
a
where
ee
.
mgr
=
a
.
emp_id
)
select
*
from
ancestors
;
insert
emp
values
(
4
,
'john'
,
1
);
insert
addr
values
(
4
,
'Paris'
);
with
ancestors
as
(
select
*
from
emp
natural
join
addr
)
select
*
from
ancestors
;
...
...
This diff is collapsed.
Click to expand it.
sql/sql_derived.cc
View file @
bc4a8669
...
...
@@ -850,8 +850,6 @@ bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *derived)
{
sl
->
vers_export_outer
=
impli_table
->
vers_conditions
;
}
else
sl
->
vers_import_outer
=
true
;
// FIXME: is needed?
}
}
// if (sl->table_list.elements > 0)
// System Versioning end
...
...
This diff is collapsed.
Click to expand it.
sql/sql_lex.cc
View file @
bc4a8669
...
...
@@ -2313,7 +2313,6 @@ void st_select_lex::init_select()
in_tvc
=
false
;
vers_saved_where
=
NULL
;
vers_export_outer
.
empty
();
vers_import_outer
=
false
;
versioned_tables
=
0
;
}
...
...
This diff is collapsed.
Click to expand it.
sql/sql_lex.h
View file @
bc4a8669
...
...
@@ -1049,7 +1049,6 @@ class st_select_lex: public st_select_lex_node
Item
*
vers_saved_where
;
public:
vers_select_conds_t
vers_export_outer
;
bool
vers_import_outer
;
uint
versioned_tables
;
int
vers_setup_conds
(
THD
*
thd
,
TABLE_LIST
*
tables
,
COND
**
where_expr
);
/* push new Item_field into item_list */
...
...
This diff is collapsed.
Click to expand it.
sql/sql_select.cc
View file @
bc4a8669
...
...
@@ -829,19 +829,27 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables, COND **where_expr
vers_select_conds_t &vers_conditions= table->vers_conditions;
// propagate system_time from nearest outer SELECT_LEX
if (!vers_conditions && outer_slex
&& vers_import_outer
)
if (!vers_conditions && outer_slex)
{
TABLE_LIST* derived= master_unit()->derived;
// inner SELECT may not be a derived table (derived == NULL)
while (derived && outer_slex && (!derived->vers_conditions || derived->vers_conditions.from_inner))
if (derived == table && vers_export_outer) // recursive CTE
{
derived= outer_slex->master_unit()->derived;
outer_slex= outer_slex->next_select_in_list();
vers_conditions= vers_export_outer;
}
if (derived && outer_slex && !derived->vers_conditions.from_inner)
else
{
DBUG_ASSERT(derived->vers_conditions);
vers_conditions= derived->vers_conditions;
// inner SELECT may not be a derived table (derived == NULL)
while (derived && outer_slex &&
(!derived->vers_conditions || derived->vers_conditions.from_inner))
{
derived= outer_slex->master_unit()->derived;
outer_slex= outer_slex->next_select_in_list();
}
if (derived && outer_slex && !derived->vers_conditions.from_inner)
{
DBUG_ASSERT(derived->vers_conditions);
vers_conditions= derived->vers_conditions;
}
}
}
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment