Commit 1d46923a authored by Aleksey Midenkov's avatar Aleksey Midenkov

MDEV-18929 2nd execution of SP does not detect ER_VERS_NOT_VERSIONED (10.4)

Don't do skip_setup_conds() unless all errors are checked.

Fixes following errors:
      ER_PERIOD_NOT_FOUND
      ER_VERS_QUERY_IN_PARTITION
      ER_VERS_ENGINE_UNSUPPORTED
      ER_VERS_NOT_VERSIONED
parent a3b63b8d
...@@ -353,6 +353,18 @@ id s e datediff(e, s) ...@@ -353,6 +353,18 @@ id s e datediff(e, s)
1 1999-01-01 1999-01-03 2 1 1999-01-01 1999-01-03 2
1 2018-12-10 2018-12-12 2 1 2018-12-10 2018-12-12 2
2 1999-01-01 1999-01-03 2 2 1999-01-01 1999-01-03 2
#
# MDEV-18929 2nd execution of SP does not detect ER_VERS_NOT_VERSIONED
#
create or replace table t1 (id int, s date, e date, period for apptime(s,e));
create or replace procedure sp()
delete from t1 for portion of othertime from '2000-01-01' to '2018-01-01';
call sp;
ERROR HY000: Period `othertime` is not found in table
call sp;
ERROR HY000: Period `othertime` is not found in table
drop table t1;
drop procedure sp;
drop table t,t2,t3,log_tbl; drop table t,t2,t3,log_tbl;
drop view v; drop view v;
drop procedure log; drop procedure log;
...@@ -181,6 +181,20 @@ delete from t for portion of apptime from '1999-01-03' to '2018-12-10'; ...@@ -181,6 +181,20 @@ delete from t for portion of apptime from '1999-01-03' to '2018-12-10';
--sorted_result --sorted_result
select *, datediff(e, s) from t; select *, datediff(e, s) from t;
--echo #
--echo # MDEV-18929 2nd execution of SP does not detect ER_VERS_NOT_VERSIONED
--echo #
create or replace table t1 (id int, s date, e date, period for apptime(s,e));
create or replace procedure sp()
delete from t1 for portion of othertime from '2000-01-01' to '2018-01-01';
--error ER_PERIOD_NOT_FOUND
call sp;
--error ER_PERIOD_NOT_FOUND
call sp;
drop table t1;
drop procedure sp;
drop table t,t2,t3,log_tbl; drop table t,t2,t3,log_tbl;
drop view v; drop view v;
drop procedure log; drop procedure log;
...@@ -512,6 +512,14 @@ delete from t1 where a is not null; ...@@ -512,6 +512,14 @@ delete from t1 where a is not null;
create or replace table t1 (i int) with system versioning partition by system_time limit 10 (partition p0 history, partition pn current); create or replace table t1 (i int) with system versioning partition by system_time limit 10 (partition p0 history, partition pn current);
select * from t1 partition (p0) for system_time all; select * from t1 partition (p0) for system_time all;
ERROR HY000: SYSTEM_TIME partitions in table `t1` does not support historical query ERROR HY000: SYSTEM_TIME partitions in table `t1` does not support historical query
# MDEV-18929 2nd execution of SP does not detect ER_VERS_NOT_VERSIONED
create or replace procedure sp()
select * from t1 partition (p0) for system_time all;
call sp;
ERROR HY000: SYSTEM_TIME partitions in table `t1` does not support historical query
call sp;
ERROR HY000: SYSTEM_TIME partitions in table `t1` does not support historical query
drop procedure sp;
# MDEV-15380 Index for versioned table gets corrupt after partitioning and DELETE # MDEV-15380 Index for versioned table gets corrupt after partitioning and DELETE
create or replace table t1 (pk int primary key) create or replace table t1 (pk int primary key)
engine=myisam engine=myisam
......
...@@ -356,6 +356,21 @@ ERROR HY000: Table `t` is not system-versioned ...@@ -356,6 +356,21 @@ ERROR HY000: Table `t` is not system-versioned
create or replace table t1 (x int) with system versioning engine myisam; create or replace table t1 (x int) with system versioning engine myisam;
select * from t1 for system_time as of transaction 1; select * from t1 for system_time as of transaction 1;
ERROR HY000: Transaction-precise system versioning for `t1` is not supported ERROR HY000: Transaction-precise system versioning for `t1` is not supported
# MDEV-18929 2nd execution of SP does not detect ER_VERS_NOT_VERSIONED
create or replace procedure sp()
select * from t1 for system_time as of transaction 1;
call sp;
ERROR HY000: Transaction-precise system versioning for `t1` is not supported
call sp;
ERROR HY000: Transaction-precise system versioning for `t1` is not supported
create or replace table t1 (a int);
create or replace procedure sp()
select * from t1 for system_time all;
call sp;
ERROR HY000: Table `t1` is not system-versioned
call sp;
ERROR HY000: Table `t1` is not system-versioned
drop procedure sp;
create or replace table t1 ( create or replace table t1 (
x int, x int,
sys_trx_start bigint unsigned as row start invisible, sys_trx_start bigint unsigned as row start invisible,
......
...@@ -146,7 +146,7 @@ i ...@@ -146,7 +146,7 @@ i
create or replace view v1 as select * from t1 for system_time as of date_sub(now(), interval 6 second); create or replace view v1 as select * from t1 for system_time as of date_sub(now(), interval 6 second);
show create view v1; show create view v1;
View Create View character_set_client collation_connection View Create View character_set_client collation_connection
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`i` AS `i` from `t1` FOR SYSTEM_TIME AS OF current_timestamp() - interval 6 second latin1 latin1_swedish_ci v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`i` AS `i` from `t1` FOR SYSTEM_TIME AS OF TIMESTAMP current_timestamp() - interval 6 second latin1 latin1_swedish_ci
drop view v1, vt1, vt12; drop view v1, vt1, vt12;
drop tables t1, t3; drop tables t1, t3;
# #
......
...@@ -446,6 +446,14 @@ delete from t1 where a is not null; ...@@ -446,6 +446,14 @@ delete from t1 where a is not null;
create or replace table t1 (i int) with system versioning partition by system_time limit 10 (partition p0 history, partition pn current); create or replace table t1 (i int) with system versioning partition by system_time limit 10 (partition p0 history, partition pn current);
--error ER_VERS_QUERY_IN_PARTITION --error ER_VERS_QUERY_IN_PARTITION
select * from t1 partition (p0) for system_time all; select * from t1 partition (p0) for system_time all;
--echo # MDEV-18929 2nd execution of SP does not detect ER_VERS_NOT_VERSIONED
create or replace procedure sp()
select * from t1 partition (p0) for system_time all;
--error ER_VERS_QUERY_IN_PARTITION
call sp;
--error ER_VERS_QUERY_IN_PARTITION
call sp;
drop procedure sp;
--echo # MDEV-15380 Index for versioned table gets corrupt after partitioning and DELETE --echo # MDEV-15380 Index for versioned table gets corrupt after partitioning and DELETE
create or replace table t1 (pk int primary key) create or replace table t1 (pk int primary key)
......
...@@ -228,6 +228,21 @@ for system_time all as t; ...@@ -228,6 +228,21 @@ for system_time all as t;
create or replace table t1 (x int) with system versioning engine myisam; create or replace table t1 (x int) with system versioning engine myisam;
--error ER_VERS_ENGINE_UNSUPPORTED --error ER_VERS_ENGINE_UNSUPPORTED
select * from t1 for system_time as of transaction 1; select * from t1 for system_time as of transaction 1;
--echo # MDEV-18929 2nd execution of SP does not detect ER_VERS_NOT_VERSIONED
create or replace procedure sp()
select * from t1 for system_time as of transaction 1;
--error ER_VERS_ENGINE_UNSUPPORTED
call sp;
--error ER_VERS_ENGINE_UNSUPPORTED
call sp;
create or replace table t1 (a int);
create or replace procedure sp()
select * from t1 for system_time all;
--error ER_VERS_NOT_VERSIONED
call sp;
--error ER_VERS_NOT_VERSIONED
call sp;
drop procedure sp;
create or replace table t1 ( create or replace table t1 (
x int, x int,
......
...@@ -888,9 +888,7 @@ bool skip_setup_conds(THD *thd) ...@@ -888,9 +888,7 @@ bool skip_setup_conds(THD *thd)
int SELECT_LEX::period_setup_conds(THD *thd, TABLE_LIST *tables) int SELECT_LEX::period_setup_conds(THD *thd, TABLE_LIST *tables)
{ {
DBUG_ENTER("SELECT_LEX::period_setup_conds"); DBUG_ENTER("SELECT_LEX::period_setup_conds");
const bool update_conds= !skip_setup_conds(thd);
if (skip_setup_conds(thd))
DBUG_RETURN(0);
Query_arena backup; Query_arena backup;
Query_arena *arena= thd->activate_stmt_arena_if_needed(&backup); Query_arena *arena= thd->activate_stmt_arena_if_needed(&backup);
...@@ -911,11 +909,15 @@ int SELECT_LEX::period_setup_conds(THD *thd, TABLE_LIST *tables) ...@@ -911,11 +909,15 @@ int SELECT_LEX::period_setup_conds(THD *thd, TABLE_LIST *tables)
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
conds.period= &table->table->s->period; if (update_conds)
result= and_items(thd, result, {
period_get_condition(thd, table, this, &conds, true)); conds.period= &table->table->s->period;
result= and_items(thd, result,
period_get_condition(thd, table, this, &conds, true));
}
} }
where= and_items(thd, where, result); if (update_conds)
where= and_items(thd, where, result);
if (arena) if (arena)
thd->restore_active_arena(arena, &backup); thd->restore_active_arena(arena, &backup);
...@@ -926,9 +928,7 @@ int SELECT_LEX::period_setup_conds(THD *thd, TABLE_LIST *tables) ...@@ -926,9 +928,7 @@ int SELECT_LEX::period_setup_conds(THD *thd, TABLE_LIST *tables)
int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables) int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables)
{ {
DBUG_ENTER("SELECT_LEX::vers_setup_conds"); DBUG_ENTER("SELECT_LEX::vers_setup_conds");
const bool update_conds= !skip_setup_conds(thd);
if (skip_setup_conds(thd))
DBUG_RETURN(0);
if (!versioned_tables) if (!versioned_tables)
{ {
...@@ -999,13 +999,15 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables) ...@@ -999,13 +999,15 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables)
*/ */
if (table->partition_names && table->table->part_info->vers_info) if (table->partition_names && table->table->part_info->vers_info)
{ {
if (vers_conditions.is_set()) /* If the history is stored in partitions, then partitions
themselves are not versioned. */
if (vers_conditions.was_set())
{ {
my_error(ER_VERS_QUERY_IN_PARTITION, MYF(0), table->alias.str); my_error(ER_VERS_QUERY_IN_PARTITION, MYF(0), table->alias.str);
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
else else if (!vers_conditions.is_set())
vers_conditions.init(SYSTEM_TIME_ALL); vers_conditions.set_all();
} }
#endif #endif
...@@ -1050,24 +1052,27 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables) ...@@ -1050,24 +1052,27 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables)
} }
} }
vers_conditions.period = &table->table->s->vers; if (update_conds)
Item *cond= period_get_condition(thd, table, this, &vers_conditions,
timestamps_only);
if (is_select)
table->on_expr= and_items(thd, table->on_expr, cond);
else
{ {
if (join) vers_conditions.period = &table->table->s->vers;
Item *cond= period_get_condition(thd, table, this, &vers_conditions,
timestamps_only);
if (is_select)
table->on_expr= and_items(thd, table->on_expr, cond);
else
{ {
where= and_items(thd, join->conds, cond); if (join)
join->conds= where; {
where= and_items(thd, join->conds, cond);
join->conds= where;
}
else
where= and_items(thd, where, cond);
table->where= and_items(thd, table->where, cond);
} }
else
where= and_items(thd, where, cond);
table->where= and_items(thd, table->where, cond);
}
table->vers_conditions.type= SYSTEM_TIME_ALL; table->vers_conditions.set_all();
}
} // for (table= tables; ...) } // for (table= tables; ...)
DBUG_RETURN(0); DBUG_RETURN(0);
......
...@@ -1929,6 +1929,7 @@ class Vers_history_point : public vers_history_point_t ...@@ -1929,6 +1929,7 @@ class Vers_history_point : public vers_history_point_t
struct vers_select_conds_t struct vers_select_conds_t
{ {
vers_system_time_t type; vers_system_time_t type;
vers_system_time_t orig_type;
bool used:1; bool used:1;
bool delete_history:1; bool delete_history:1;
Vers_history_point start; Vers_history_point start;
...@@ -1943,6 +1944,7 @@ struct vers_select_conds_t ...@@ -1943,6 +1944,7 @@ struct vers_select_conds_t
void empty() void empty()
{ {
type= SYSTEM_TIME_UNSPECIFIED; type= SYSTEM_TIME_UNSPECIFIED;
orig_type= SYSTEM_TIME_UNSPECIFIED;
used= false; used= false;
delete_history= false; delete_history= false;
start.empty(); start.empty();
...@@ -1955,6 +1957,7 @@ struct vers_select_conds_t ...@@ -1955,6 +1957,7 @@ struct vers_select_conds_t
Lex_ident _name= "SYSTEM_TIME") Lex_ident _name= "SYSTEM_TIME")
{ {
type= _type; type= _type;
orig_type= _type;
used= false; used= false;
delete_history= (type == SYSTEM_TIME_HISTORY || delete_history= (type == SYSTEM_TIME_HISTORY ||
type == SYSTEM_TIME_BEFORE); type == SYSTEM_TIME_BEFORE);
...@@ -1963,6 +1966,12 @@ struct vers_select_conds_t ...@@ -1963,6 +1966,12 @@ struct vers_select_conds_t
name= _name; name= _name;
} }
void set_all()
{
type= SYSTEM_TIME_ALL;
name= "SYSTEM_TIME";
}
void print(String *str, enum_query_type query_type) const; void print(String *str, enum_query_type query_type) const;
bool init_from_sysvar(THD *thd); bool init_from_sysvar(THD *thd);
...@@ -1971,6 +1980,10 @@ struct vers_select_conds_t ...@@ -1971,6 +1980,10 @@ struct vers_select_conds_t
{ {
return type != SYSTEM_TIME_UNSPECIFIED; return type != SYSTEM_TIME_UNSPECIFIED;
} }
bool was_set() const
{
return orig_type != SYSTEM_TIME_UNSPECIFIED;
}
bool resolve_units(THD *thd); bool resolve_units(THD *thd);
bool eq(const vers_select_conds_t &conds) const; bool eq(const vers_select_conds_t &conds) const;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment