1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

MDEV-17613 MIN/MAX Optimization (Select tables optimized away) does not work

Prune to now-partition when there is no FOR SYSTEM_TIME clause.
This commit is contained in:
Aleksey Midenkov
2018-12-26 13:24:45 +03:00
parent 43882e764d
commit cdbac54df0
4 changed files with 63 additions and 6 deletions

View File

@ -721,6 +721,19 @@ void vers_select_conds_t::print(String *str, enum_query_type query_type) const
}
}
/**
Setup System Versioning conditions
Add WHERE condition according to FOR SYSTEM_TIME clause.
If the table is partitioned by SYSTEM_TIME and there is no FOR SYSTEM_TIME
clause, then select now-partition instead of modifying WHERE condition.
@retval
-1 on error
@retval
0 on success
*/
int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables)
{
DBUG_ENTER("SELECT_LEX::vers_setup_cond");
@ -788,12 +801,13 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables)
vers_select_conds_t &vers_conditions= table->vers_conditions;
#ifdef WITH_PARTITION_STORAGE_ENGINE
/*
if the history is stored in partitions, then partitions
themselves are not versioned
*/
if (table->partition_names && table->table->part_info->vers_info)
Vers_part_info *vers_info;
if (table->table->part_info && (vers_info= table->table->part_info->vers_info))
{
if (table->partition_names)
{
/* If the history is stored in partitions, then partitions
themselves are not versioned. */
if (vers_conditions.is_set())
{
my_error(ER_VERS_QUERY_IN_PARTITION, MYF(0), table->alias.str);
@ -802,6 +816,16 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables)
else
vers_conditions.init(SYSTEM_TIME_ALL);
}
else if (!vers_conditions.is_set())
{
table->partition_names= newx List<String>;
String *s= newx String(vers_info->now_part->partition_name,
system_charset_info);
table->partition_names->push_back(s);
table->table->file->change_partitions_to_open(table->partition_names);
vers_conditions.init(SYSTEM_TIME_ALL);
}
}
#endif
if (outer_table && !vers_conditions.is_set())
@ -951,6 +975,7 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables)
DBUG_RETURN(0);
#undef newx
}
#undef newx
/*****************************************************************************
Check fields, find best join, do the select and output fields.