diff options
author | Aleksey Midenkov <midenok@gmail.com> | 2019-12-02 12:46:15 +0300 |
---|---|---|
committer | Aleksey Midenkov <midenok@gmail.com> | 2019-12-02 12:46:15 +0300 |
commit | 1d46923a0f6508d52d7ce679a7dd8e7e0e957ae4 (patch) | |
tree | e49b51394ca259fb5e54be41df8fb382f49fa420 /sql | |
parent | a3b63b8da36b5896dc0093fdbceb2851e0a04214 (diff) | |
download | mariadb-git-1d46923a0f6508d52d7ce679a7dd8e7e0e957ae4.tar.gz |
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
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_select.cc | 59 | ||||
-rw-r--r-- | sql/table.h | 13 |
2 files changed, 45 insertions, 27 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc index a50736047cd..337b1d5e02a 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -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) + 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); - join->conds= where; + 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); } - 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); diff --git a/sql/table.h b/sql/table.h index ae46b192854..6b125fe43ad 100644 --- a/sql/table.h +++ b/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; }; |