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
Current easy fix is not possible, because SELECT clones ha_partition
and then closes the clone which leads to unclosed transaction in
partitions we forcely prune out. We cound solve this by closing these
partitions (and release from transaction) in
change_partitions_to_open() at versioning conditions stage, but this
is problematic because table lock is acquired for each partition at
open stage and therefore must be released when we close partition
handler in change_partitions_to_open(). More details in MDEV-20376.
This should change after MDEV-20250 where mechanism of opening
partitions will be improved.
This reverts commit cdbac54df0
.
This commit is contained in:
@ -721,19 +721,6 @@ 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");
|
||||
@ -801,13 +788,12 @@ 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
|
||||
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 (table->partition_names && table->table->part_info->vers_info)
|
||||
{
|
||||
/* 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);
|
||||
@ -816,19 +802,6 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables)
|
||||
else
|
||||
vers_conditions.init(SYSTEM_TIME_ALL);
|
||||
}
|
||||
else if (!vers_conditions.is_set() &&
|
||||
/* We cannot optimize REPLACE .. SELECT because it may need
|
||||
to call vers_set_hist_part() to update history. */
|
||||
thd->lex->sql_command != SQLCOM_REPLACE_SELECT)
|
||||
{
|
||||
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())
|
||||
@ -978,7 +951,6 @@ 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.
|
||||
|
Reference in New Issue
Block a user