diff --git a/mysql-test/suite/versioning/r/cte.result b/mysql-test/suite/versioning/r/cte.result index 3043bcb4093..371c2257a94 100644 --- a/mysql-test/suite/versioning/r/cte.result +++ b/mysql-test/suite/versioning/r/cte.result @@ -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; diff --git a/mysql-test/suite/versioning/t/cte.test b/mysql-test/suite/versioning/t/cte.test index 488e7de5dfc..482c793a724 100644 --- a/mysql-test/suite/versioning/t/cte.test +++ b/mysql-test/suite/versioning/t/cte.test @@ -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; diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index af3add1a5b2..c112af9cd55 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -850,8 +850,6 @@ expli_table_err: { 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 diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index db22669d287..42e502a5fca 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -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; } diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 94fdc6442ab..5231dcf173c 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -1049,7 +1049,6 @@ private: 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 */ diff --git a/sql/sql_select.cc b/sql/sql_select.cc index a070a514c7f..bd9068e7cca 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -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; + } } }