mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
SQL: derived fixes [related to #185]
This commit is contained in:
@ -41,7 +41,7 @@ from emp as e for system_time as of timestamp @ts_1,
|
|||||||
ancestors as a
|
ancestors as a
|
||||||
where e.mgr = a.emp_id
|
where e.mgr = a.emp_id
|
||||||
)
|
)
|
||||||
select * from ancestors;
|
select * from ancestors for system_time as of now;
|
||||||
emp_id name mgr salary
|
emp_id name mgr salary
|
||||||
1 bill NULL 1000
|
1 bill NULL 1000
|
||||||
30 jane 1 750
|
30 jane 1 750
|
||||||
@ -59,7 +59,7 @@ from emp as e for system_time as of timestamp @ts_2,
|
|||||||
ancestors as a
|
ancestors as a
|
||||||
where e.mgr = a.emp_id
|
where e.mgr = a.emp_id
|
||||||
)
|
)
|
||||||
select * from ancestors for system_time as of timestamp @ts_2;
|
select * from ancestors;
|
||||||
emp_id name mgr salary
|
emp_id name mgr salary
|
||||||
1 bill NULL 1000
|
1 bill NULL 1000
|
||||||
30 jane 1 750
|
30 jane 1 750
|
||||||
|
@ -39,9 +39,13 @@ x
|
|||||||
drop prepare stmt;
|
drop prepare stmt;
|
||||||
select * from vt1;
|
select * from vt1;
|
||||||
x
|
x
|
||||||
|
2
|
||||||
|
1
|
||||||
prepare stmt from 'select * from vt1';
|
prepare stmt from 'select * from vt1';
|
||||||
execute stmt;
|
execute stmt;
|
||||||
x
|
x
|
||||||
|
2
|
||||||
|
1
|
||||||
drop prepare stmt;
|
drop prepare stmt;
|
||||||
select * from t1 for system_time as of timestamp @t1;
|
select * from t1 for system_time as of timestamp @t1;
|
||||||
x
|
x
|
||||||
|
@ -47,7 +47,7 @@ as
|
|||||||
ancestors as a
|
ancestors as a
|
||||||
where e.mgr = a.emp_id
|
where e.mgr = a.emp_id
|
||||||
)
|
)
|
||||||
select * from ancestors;
|
select * from ancestors for system_time as of now;
|
||||||
|
|
||||||
/* Expected 3 rows */
|
/* Expected 3 rows */
|
||||||
with recursive
|
with recursive
|
||||||
@ -63,7 +63,7 @@ as
|
|||||||
ancestors as a
|
ancestors as a
|
||||||
where e.mgr = a.emp_id
|
where e.mgr = a.emp_id
|
||||||
)
|
)
|
||||||
select * from ancestors for system_time as of timestamp @ts_2;
|
select * from ancestors;
|
||||||
|
|
||||||
drop table emp;
|
drop table emp;
|
||||||
drop table dept;
|
drop table dept;
|
||||||
|
@ -824,8 +824,12 @@ expli_table_err:
|
|||||||
if (!expli_end && (res= sl->vers_push_field(thd, impli_table, impli_end)))
|
if (!expli_end && (res= sl->vers_push_field(thd, impli_table, impli_end)))
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
if (impli_table->vers_conditions && !derived->is_view())
|
if (impli_table->vers_conditions)
|
||||||
|
{
|
||||||
sl->vers_derived_conds= impli_table->vers_conditions;
|
sl->vers_derived_conds= impli_table->vers_conditions;
|
||||||
|
if (derived->is_view() && !sl->vers_conditions)
|
||||||
|
sl->vers_conditions.import_outer= true;
|
||||||
|
}
|
||||||
else if (sl->vers_conditions)
|
else if (sl->vers_conditions)
|
||||||
sl->vers_derived_conds= sl->vers_conditions;
|
sl->vers_derived_conds= sl->vers_conditions;
|
||||||
else
|
else
|
||||||
|
@ -771,6 +771,7 @@ int vers_setup_select(THD *thd, TABLE_LIST *tables, COND **where_expr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
SELECT_LEX *outer_slex= slex->next_select_in_list();
|
SELECT_LEX *outer_slex= slex->next_select_in_list();
|
||||||
|
bool use_slex_conds= false;
|
||||||
if (outer_slex)
|
if (outer_slex)
|
||||||
{
|
{
|
||||||
if (slex->vers_derived_conds)
|
if (slex->vers_derived_conds)
|
||||||
@ -778,11 +779,12 @@ int vers_setup_select(THD *thd, TABLE_LIST *tables, COND **where_expr,
|
|||||||
// Propagate derived conditions to outer SELECT_LEX:
|
// Propagate derived conditions to outer SELECT_LEX:
|
||||||
if (!outer_slex->vers_conditions)
|
if (!outer_slex->vers_conditions)
|
||||||
{
|
{
|
||||||
(outer_slex->vers_conditions= slex->vers_derived_conds).
|
outer_slex->vers_conditions= slex->vers_derived_conds;
|
||||||
from_inner= true;
|
outer_slex->vers_conditions.from_inner= true;
|
||||||
|
outer_slex->vers_conditions.used= true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (slex->vers_conditions.import_outer)
|
if (slex->vers_conditions.import_outer)
|
||||||
{
|
{
|
||||||
// Propagate query conditions from nearest outer SELECT_LEX:
|
// Propagate query conditions from nearest outer SELECT_LEX:
|
||||||
while (outer_slex && (!outer_slex->vers_conditions || outer_slex->vers_conditions.from_inner))
|
while (outer_slex && (!outer_slex->vers_conditions || outer_slex->vers_conditions.from_inner))
|
||||||
@ -791,6 +793,8 @@ int vers_setup_select(THD *thd, TABLE_LIST *tables, COND **where_expr,
|
|||||||
{
|
{
|
||||||
slex->vers_conditions= outer_slex->vers_conditions;
|
slex->vers_conditions= outer_slex->vers_conditions;
|
||||||
outer_slex->vers_conditions.used= true;
|
outer_slex->vers_conditions.used= true;
|
||||||
|
DBUG_ASSERT(slex->master_unit()->derived);
|
||||||
|
use_slex_conds= slex->master_unit()->derived->is_view();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -799,7 +803,7 @@ int vers_setup_select(THD *thd, TABLE_LIST *tables, COND **where_expr,
|
|||||||
{
|
{
|
||||||
if (table->table && table->table->versioned())
|
if (table->table && table->table->versioned())
|
||||||
{
|
{
|
||||||
vers_select_conds_t &vers_conditions= !table->vers_conditions?
|
vers_select_conds_t &vers_conditions= use_slex_conds || !table->vers_conditions?
|
||||||
(slex->vers_conditions.used= true, slex->vers_conditions) :
|
(slex->vers_conditions.used= true, slex->vers_conditions) :
|
||||||
table->vers_conditions;
|
table->vers_conditions;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user