diff --git a/mysql-test/suite/versioning/r/partition.result b/mysql-test/suite/versioning/r/partition.result index c0a163ed027..588e6432c4a 100644 --- a/mysql-test/suite/versioning/r/partition.result +++ b/mysql-test/suite/versioning/r/partition.result @@ -546,6 +546,17 @@ t1 CREATE TABLE `t1` ( # create or replace table t1 (f int) with system versioning partition by hash(f); insert delayed into t1 values (1); +# +# MDEV-17613 MIN/MAX Optimization (Select tables optimized away) does not work +# +create or replace table t1 (pk int primary key) with system versioning +partition by system_time ( +partition p1 history, +partition pn current); +insert into t1 values (1), (2); +explain select max(pk) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away # Test cleanup drop database test; create database test; diff --git a/mysql-test/suite/versioning/r/partition_rotation.result b/mysql-test/suite/versioning/r/partition_rotation.result index 7e25f122238..69b30a56bd6 100644 --- a/mysql-test/suite/versioning/r/partition_rotation.result +++ b/mysql-test/suite/versioning/r/partition_rotation.result @@ -44,7 +44,7 @@ i 6 explain partitions select * from t1; id select_type table partitions type possible_keys key key_len ref rows Extra -1 SIMPLE t1 pn_pnsp0,pn_pnsp1 ALL NULL NULL NULL NULL 2 Using where +1 SIMPLE t1 pn_pnsp0,pn_pnsp1 ALL NULL NULL NULL NULL 2 explain partitions select * from t1 for system_time as of '2001-02-04 10:20:30'; id select_type table partitions type possible_keys key key_len ref rows Extra 1 SIMPLE t1 p1_p1sp0,p1_p1sp1,p0_p0sp0,p0_p0sp1,p2_p2sp0,p2_p2sp1,pn_pnsp0,pn_pnsp1 ALL NULL NULL NULL NULL # Using where diff --git a/mysql-test/suite/versioning/t/partition.test b/mysql-test/suite/versioning/t/partition.test index cd16ab7c466..29e4c413f77 100644 --- a/mysql-test/suite/versioning/t/partition.test +++ b/mysql-test/suite/versioning/t/partition.test @@ -497,6 +497,27 @@ create or replace table t1 (f int) with system versioning partition by hash(f); --error 0,ER_DELAYED_NOT_SUPPORTED insert delayed into t1 values (1); +--echo # +--echo # MDEV-17613 MIN/MAX Optimization (Select tables optimized away) does not work +--echo # +--disable_query_log +set @saved_storage_engine= @@default_storage_engine; +if ($MTR_COMBINATION_HEAP) +{ + # This case does not work with HEAP + set default_storage_engine= myisam; +} +--enable_query_log +create or replace table t1 (pk int primary key) with system versioning +partition by system_time ( + partition p1 history, + partition pn current); +insert into t1 values (1), (2); +explain select max(pk) from t1; +--disable_query_log +set default_storage_engine= @saved_storage_engine; +--enable_query_log + --echo # Test cleanup drop database test; create database test; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index cc3ff1037ad..33ff0bc70cc 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -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 *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.