summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorAleksey Midenkov <midenok@gmail.com>2019-12-02 12:46:15 +0300
committerAleksey Midenkov <midenok@gmail.com>2019-12-02 12:46:15 +0300
commit1d46923a0f6508d52d7ce679a7dd8e7e0e957ae4 (patch)
treee49b51394ca259fb5e54be41df8fb382f49fa420 /sql
parenta3b63b8da36b5896dc0093fdbceb2851e0a04214 (diff)
downloadmariadb-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.cc59
-rw-r--r--sql/table.h13
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;
};