Skip to content

Commit bc4a866

Browse files
committed
SQL: recursive CTE inner derived vers_conditions [fix #385]
1 parent 22f4506 commit bc4a866

File tree

6 files changed

+48
-12
lines changed

6 files changed

+48
-12
lines changed

mysql-test/suite/versioning/r/cte.result

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,23 @@ insert addr values (1, 'Moscow'), (2, 'New York'), (3, 'London');
9191
set @ts=now(6);
9292
delete from emp;
9393
delete from addr;
94+
with recursive
95+
ancestors
96+
as
97+
(
98+
select e.emp_id, e.name, e.mgr
99+
from emp for system_time as of timestamp @ts as e
100+
where name = 'bill'
101+
union
102+
select ee.emp_id, ee.name, ee.mgr
103+
from emp for system_time as of timestamp @ts as ee, ancestors as a
104+
where ee.mgr = a.emp_id
105+
)
106+
select * from ancestors;
107+
emp_id name mgr
108+
1 bill 0
109+
2 bill 1
110+
3 kate 1
94111
insert emp values (4, 'john', 1);
95112
insert addr values (4, 'Paris');
96113
with ancestors as (select * from emp natural join addr) select * from ancestors;

mysql-test/suite/versioning/t/cte.test

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,21 @@ insert addr values (1, 'Moscow'), (2, 'New York'), (3, 'London');
9090
set @ts=now(6);
9191
delete from emp;
9292
delete from addr;
93+
94+
with recursive
95+
ancestors
96+
as
97+
(
98+
select e.emp_id, e.name, e.mgr
99+
from emp for system_time as of timestamp @ts as e
100+
where name = 'bill'
101+
union
102+
select ee.emp_id, ee.name, ee.mgr
103+
from emp for system_time as of timestamp @ts as ee, ancestors as a
104+
where ee.mgr = a.emp_id
105+
)
106+
select * from ancestors;
107+
93108
insert emp values (4, 'john', 1);
94109
insert addr values (4, 'Paris');
95110
with ancestors as (select * from emp natural join addr) select * from ancestors;

sql/sql_derived.cc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -850,8 +850,6 @@ bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *derived)
850850
{
851851
sl->vers_export_outer= impli_table->vers_conditions;
852852
}
853-
else
854-
sl->vers_import_outer= true; // FIXME: is needed?
855853
}
856854
} // if (sl->table_list.elements > 0)
857855
// System Versioning end

sql/sql_lex.cc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2313,7 +2313,6 @@ void st_select_lex::init_select()
23132313
in_tvc= false;
23142314
vers_saved_where= NULL;
23152315
vers_export_outer.empty();
2316-
vers_import_outer= false;
23172316
versioned_tables= 0;
23182317
}
23192318

sql/sql_lex.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1049,7 +1049,6 @@ class st_select_lex: public st_select_lex_node
10491049
Item *vers_saved_where;
10501050
public:
10511051
vers_select_conds_t vers_export_outer;
1052-
bool vers_import_outer;
10531052
uint versioned_tables;
10541053
int vers_setup_conds(THD *thd, TABLE_LIST *tables, COND **where_expr);
10551054
/* push new Item_field into item_list */

sql/sql_select.cc

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -829,19 +829,27 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables, COND **where_expr
829829
vers_select_conds_t &vers_conditions= table->vers_conditions;
830830

831831
// propagate system_time from nearest outer SELECT_LEX
832-
if (!vers_conditions && outer_slex && vers_import_outer)
832+
if (!vers_conditions && outer_slex)
833833
{
834834
TABLE_LIST* derived= master_unit()->derived;
835-
// inner SELECT may not be a derived table (derived == NULL)
836-
while (derived && outer_slex && (!derived->vers_conditions || derived->vers_conditions.from_inner))
835+
if (derived == table && vers_export_outer) // recursive CTE
837836
{
838-
derived= outer_slex->master_unit()->derived;
839-
outer_slex= outer_slex->next_select_in_list();
837+
vers_conditions= vers_export_outer;
840838
}
841-
if (derived && outer_slex && !derived->vers_conditions.from_inner)
839+
else
842840
{
843-
DBUG_ASSERT(derived->vers_conditions);
844-
vers_conditions= derived->vers_conditions;
841+
// inner SELECT may not be a derived table (derived == NULL)
842+
while (derived && outer_slex &&
843+
(!derived->vers_conditions || derived->vers_conditions.from_inner))
844+
{
845+
derived= outer_slex->master_unit()->derived;
846+
outer_slex= outer_slex->next_select_in_list();
847+
}
848+
if (derived && outer_slex && !derived->vers_conditions.from_inner)
849+
{
850+
DBUG_ASSERT(derived->vers_conditions);
851+
vers_conditions= derived->vers_conditions;
852+
}
845853
}
846854
}
847855

0 commit comments

Comments
 (0)