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
This commit is contained in:
parent
a3b63b8da3
commit
1d46923a0f
@ -353,6 +353,18 @@ id s e datediff(e, s)
|
||||
1 1999-01-01 1999-01-03 2
|
||||
1 2018-12-10 2018-12-12 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 view v;
|
||||
drop procedure log;
|
||||
|
@ -181,6 +181,20 @@ delete from t for portion of apptime from '1999-01-03' to '2018-12-10';
|
||||
--sorted_result
|
||||
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 view v;
|
||||
drop procedure log;
|
||||
|
@ -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);
|
||||
select * from t1 partition (p0) for system_time all;
|
||||
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
|
||||
create or replace table t1 (pk int primary key)
|
||||
engine=myisam
|
||||
|
@ -356,6 +356,21 @@ ERROR HY000: Table `t` is not system-versioned
|
||||
create or replace table t1 (x int) with system versioning engine myisam;
|
||||
select * from t1 for system_time as of transaction 1;
|
||||
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 (
|
||||
x int,
|
||||
sys_trx_start bigint unsigned as row start invisible,
|
||||
|
@ -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);
|
||||
show create view v1;
|
||||
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 tables t1, t3;
|
||||
#
|
||||
|
@ -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);
|
||||
--error ER_VERS_QUERY_IN_PARTITION
|
||||
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
|
||||
create or replace table t1 (pk int primary key)
|
||||
|
@ -228,6 +228,21 @@ for system_time all as t;
|
||||
create or replace table t1 (x int) with system versioning engine myisam;
|
||||
--error ER_VERS_ENGINE_UNSUPPORTED
|
||||
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 (
|
||||
x int,
|
||||
|
@ -888,9 +888,7 @@ bool skip_setup_conds(THD *thd)
|
||||
int SELECT_LEX::period_setup_conds(THD *thd, TABLE_LIST *tables)
|
||||
{
|
||||
DBUG_ENTER("SELECT_LEX::period_setup_conds");
|
||||
|
||||
if (skip_setup_conds(thd))
|
||||
DBUG_RETURN(0);
|
||||
const bool update_conds= !skip_setup_conds(thd);
|
||||
|
||||
Query_arena 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)
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
|
||||
conds.period= &table->table->s->period;
|
||||
result= and_items(thd, result,
|
||||
period_get_condition(thd, table, this, &conds, true));
|
||||
if (update_conds)
|
||||
{
|
||||
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)
|
||||
thd->restore_active_arena(arena, &backup);
|
||||
@ -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)
|
||||
{
|
||||
DBUG_ENTER("SELECT_LEX::vers_setup_conds");
|
||||
|
||||
if (skip_setup_conds(thd))
|
||||
DBUG_RETURN(0);
|
||||
const bool update_conds= !skip_setup_conds(thd);
|
||||
|
||||
if (!versioned_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 (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);
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
else
|
||||
vers_conditions.init(SYSTEM_TIME_ALL);
|
||||
else if (!vers_conditions.is_set())
|
||||
vers_conditions.set_all();
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1050,24 +1052,27 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables)
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
if (update_conds)
|
||||
{
|
||||
if (join)
|
||||
{
|
||||
where= and_items(thd, join->conds, cond);
|
||||
join->conds= where;
|
||||
}
|
||||
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, where, cond);
|
||||
table->where= and_items(thd, table->where, cond);
|
||||
}
|
||||
{
|
||||
if (join)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
table->vers_conditions.type= SYSTEM_TIME_ALL;
|
||||
table->vers_conditions.set_all();
|
||||
}
|
||||
} // for (table= tables; ...)
|
||||
|
||||
DBUG_RETURN(0);
|
||||
|
13
sql/table.h
13
sql/table.h
@ -1929,6 +1929,7 @@ public:
|
||||
struct vers_select_conds_t
|
||||
{
|
||||
vers_system_time_t type;
|
||||
vers_system_time_t orig_type;
|
||||
bool used:1;
|
||||
bool delete_history:1;
|
||||
Vers_history_point start;
|
||||
@ -1943,6 +1944,7 @@ struct vers_select_conds_t
|
||||
void empty()
|
||||
{
|
||||
type= SYSTEM_TIME_UNSPECIFIED;
|
||||
orig_type= SYSTEM_TIME_UNSPECIFIED;
|
||||
used= false;
|
||||
delete_history= false;
|
||||
start.empty();
|
||||
@ -1955,6 +1957,7 @@ struct vers_select_conds_t
|
||||
Lex_ident _name= "SYSTEM_TIME")
|
||||
{
|
||||
type= _type;
|
||||
orig_type= _type;
|
||||
used= false;
|
||||
delete_history= (type == SYSTEM_TIME_HISTORY ||
|
||||
type == SYSTEM_TIME_BEFORE);
|
||||
@ -1963,6 +1966,12 @@ struct vers_select_conds_t
|
||||
name= _name;
|
||||
}
|
||||
|
||||
void set_all()
|
||||
{
|
||||
type= SYSTEM_TIME_ALL;
|
||||
name= "SYSTEM_TIME";
|
||||
}
|
||||
|
||||
void print(String *str, enum_query_type query_type) const;
|
||||
|
||||
bool init_from_sysvar(THD *thd);
|
||||
@ -1971,6 +1980,10 @@ struct vers_select_conds_t
|
||||
{
|
||||
return type != SYSTEM_TIME_UNSPECIFIED;
|
||||
}
|
||||
bool was_set() const
|
||||
{
|
||||
return orig_type != SYSTEM_TIME_UNSPECIFIED;
|
||||
}
|
||||
bool resolve_units(THD *thd);
|
||||
bool eq(const vers_select_conds_t &conds) const;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user