Skip to content

Commit 60e456d

Browse files
committed
SQL: system_time propagation from derived table [fixes #228]
1 parent dcb5404 commit 60e456d

File tree

6 files changed

+88
-14
lines changed

6 files changed

+88
-14
lines changed

mysql-test/suite/versioning/r/cte_recursive.result renamed to mysql-test/suite/versioning/r/cte.result

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,36 @@ emp_id name mgr salary
6464
1 bill NULL 1000
6565
30 jane 1 750
6666
20 john 30 500
67+
create or replace table emp ( emp_id int, name varchar(127), mgr int) with system versioning;
68+
create or replace table addr ( emp_id int, address varchar(100)) with system versioning;
69+
insert emp values (1, 'bill', 0), (2, 'bill', 1), (3, 'kate', 1);
70+
insert addr values (1, 'Moscow'), (2, 'New York'), (3, 'London');
71+
set @ts=now(6);
72+
delete from emp;
73+
delete from addr;
74+
insert emp values (4, 'john', 1);
75+
insert addr values (4, 'Paris');
76+
with ancestors as (select * from emp natural join addr) select * from ancestors;
77+
emp_id name mgr address
78+
4 john 1 Paris
79+
with ancestors as (select * from emp natural join addr) select * from ancestors for system_time all;
80+
emp_id name mgr address
81+
1 bill 0 Moscow
82+
2 bill 1 New York
83+
3 kate 1 London
84+
4 john 1 Paris
85+
with ancestors as (select * from emp natural join addr query for system_time all) select * from ancestors;
86+
emp_id name mgr address
87+
1 bill 0 Moscow
88+
2 bill 1 New York
89+
3 kate 1 London
90+
4 john 1 Paris
91+
select * from emp natural join addr query for system_time all;
92+
emp_id name mgr address
93+
1 bill 0 Moscow
94+
2 bill 1 New York
95+
3 kate 1 London
96+
4 john 1 Paris
6797
drop table emp;
6898
drop table dept;
99+
drop table addr;

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,22 @@ ERROR HY000: Derived table is prohibited: system fields from multiple tables `t1
139139
select * from (select * from t1 for system_time as of timestamp @t0, t2) as s0;
140140
x y
141141
1 10
142-
select * from (select *, t1.sys_trx_end from t2, t1 for system_time as of timestamp @t0) as s0;
142+
with s1 as (select * from t1 for system_time as of timestamp @t0, t2) select * from s1;
143+
x y
144+
1 10
145+
select * from (select *, t1.sys_trx_end from t2, t1 for system_time as of timestamp @t0) as s2;
146+
y x
147+
10 1
148+
with s3 as (select *, t1.sys_trx_end from t2, t1 for system_time as of timestamp @t0) select * from s3;
149+
y x
150+
10 1
151+
select * from (select *, t1.sys_trx_start from t2 for system_time as of now, t1) as s4 query for system_time as of timestamp @t0;
152+
y x
153+
10 1
154+
with s5 as (select *, t1.sys_trx_start from t2 for system_time as of now, t1) select * from s5 for system_time as of timestamp @t0;
143155
y x
144156
10 1
145-
select * from (select *, t1.sys_trx_start from t2 for system_time as of now, t1) as s0 query for system_time as of timestamp @t0;
157+
with s6 as (select *, t1.sys_trx_start from t2 for system_time as of now, t1) select * from s6 query for system_time as of timestamp @t0;
146158
y x
147159
10 1
148160
set @q= concat("create view vt1 as select * from t1 for system_time as of timestamp '", @t0, "'");
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
--innodb --default-storage-engine=innodb
22
--plugin-load=versioning
3+
--versioning-hide=implicit

mysql-test/suite/versioning/t/cte_recursive.test renamed to mysql-test/suite/versioning/t/cte.test

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,5 +65,20 @@ as
6565
)
6666
select * from ancestors;
6767

68+
create or replace table emp ( emp_id int, name varchar(127), mgr int) with system versioning;
69+
create or replace table addr ( emp_id int, address varchar(100)) with system versioning;
70+
insert emp values (1, 'bill', 0), (2, 'bill', 1), (3, 'kate', 1);
71+
insert addr values (1, 'Moscow'), (2, 'New York'), (3, 'London');
72+
set @ts=now(6);
73+
delete from emp;
74+
delete from addr;
75+
insert emp values (4, 'john', 1);
76+
insert addr values (4, 'Paris');
77+
with ancestors as (select * from emp natural join addr) select * from ancestors;
78+
with ancestors as (select * from emp natural join addr) select * from ancestors for system_time all;
79+
with ancestors as (select * from emp natural join addr query for system_time all) select * from ancestors;
80+
select * from emp natural join addr query for system_time all;
81+
6882
drop table emp;
6983
drop table dept;
84+
drop table addr;

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,14 @@ select * from (select *, t1.sys_trx_end, t2.sys_trx_start from t1, t2) as s0;
103103

104104
# system_time propagation from inner to outer
105105
select * from (select * from t1 for system_time as of timestamp @t0, t2) as s0;
106+
with s1 as (select * from t1 for system_time as of timestamp @t0, t2) select * from s1;
106107
# leading table selection
107-
select * from (select *, t1.sys_trx_end from t2, t1 for system_time as of timestamp @t0) as s0;
108+
select * from (select *, t1.sys_trx_end from t2, t1 for system_time as of timestamp @t0) as s2;
109+
with s3 as (select *, t1.sys_trx_end from t2, t1 for system_time as of timestamp @t0) select * from s3;
108110
# system_time propagation from outer to inner
109-
select * from (select *, t1.sys_trx_start from t2 for system_time as of now, t1) as s0 query for system_time as of timestamp @t0;
111+
select * from (select *, t1.sys_trx_start from t2 for system_time as of now, t1) as s4 query for system_time as of timestamp @t0;
112+
with s5 as (select *, t1.sys_trx_start from t2 for system_time as of now, t1) select * from s5 for system_time as of timestamp @t0;
113+
with s6 as (select *, t1.sys_trx_start from t2 for system_time as of now, t1) select * from s6 query for system_time as of timestamp @t0;
110114

111115
# VIEW instead of t1
112116
set @q= concat("create view vt1 as select * from t1 for system_time as of timestamp '", @t0, "'");

sql/sql_select.cc

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -771,7 +771,7 @@ int vers_setup_select(THD *thd, TABLE_LIST *tables, COND **where_expr,
771771
}
772772

773773
SELECT_LEX *outer_slex= slex->next_select_in_list();
774-
bool use_slex_conds= false;
774+
bool force_slex_conds= false;
775775
if (outer_slex)
776776
{
777777
if (slex->vers_derived_conds)
@@ -786,15 +786,26 @@ int vers_setup_select(THD *thd, TABLE_LIST *tables, COND **where_expr,
786786
}
787787
if (slex->vers_conditions.import_outer)
788788
{
789-
// Propagate query conditions from nearest outer SELECT_LEX:
790-
while (outer_slex && (!outer_slex->vers_conditions || outer_slex->vers_conditions.from_inner))
791-
outer_slex= outer_slex->next_select_in_list();
792-
if (outer_slex)
789+
DBUG_ASSERT(slex->master_unit());
790+
TABLE_LIST* derived= slex->master_unit()->derived;
791+
DBUG_ASSERT(derived);
792+
if (derived->vers_conditions)
793793
{
794-
slex->vers_conditions= outer_slex->vers_conditions;
795-
outer_slex->vers_conditions.used= true;
796-
DBUG_ASSERT(slex->master_unit()->derived);
797-
use_slex_conds= slex->master_unit()->derived->is_view();
794+
slex->vers_conditions= derived->vers_conditions;
795+
derived->vers_conditions.used= true;
796+
force_slex_conds= derived->is_view();
797+
}
798+
else
799+
{
800+
// Propagate query conditions from nearest outer SELECT_LEX:
801+
while (outer_slex && (!outer_slex->vers_conditions || outer_slex->vers_conditions.from_inner))
802+
outer_slex= outer_slex->next_select_in_list();
803+
if (outer_slex)
804+
{
805+
slex->vers_conditions= outer_slex->vers_conditions;
806+
outer_slex->vers_conditions.used= true;
807+
force_slex_conds= derived->is_view();
808+
}
798809
}
799810
}
800811
}
@@ -803,7 +814,7 @@ int vers_setup_select(THD *thd, TABLE_LIST *tables, COND **where_expr,
803814
{
804815
if (table->table && table->table->versioned())
805816
{
806-
vers_select_conds_t &vers_conditions= use_slex_conds || !table->vers_conditions?
817+
vers_select_conds_t &vers_conditions= force_slex_conds || !table->vers_conditions?
807818
(slex->vers_conditions.used= true, slex->vers_conditions) :
808819
table->vers_conditions;
809820

0 commit comments

Comments
 (0)