mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +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:
@ -546,6 +546,17 @@ t1 CREATE TABLE `t1` (
|
|||||||
#
|
#
|
||||||
create or replace table t1 (f int) with system versioning partition by hash(f);
|
create or replace table t1 (f int) with system versioning partition by hash(f);
|
||||||
insert delayed into t1 values (1);
|
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
|
# Test cleanup
|
||||||
drop database test;
|
drop database test;
|
||||||
create database test;
|
create database test;
|
||||||
|
@ -44,7 +44,7 @@ i
|
|||||||
6
|
6
|
||||||
explain partitions select * from t1;
|
explain partitions select * from t1;
|
||||||
id select_type table partitions type possible_keys key key_len ref rows Extra
|
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';
|
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
|
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
|
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
|
||||||
|
@ -497,6 +497,27 @@ create or replace table t1 (f int) with system versioning partition by hash(f);
|
|||||||
--error 0,ER_DELAYED_NOT_SUPPORTED
|
--error 0,ER_DELAYED_NOT_SUPPORTED
|
||||||
insert delayed into t1 values (1);
|
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
|
--echo # Test cleanup
|
||||||
drop database test;
|
drop database test;
|
||||||
create database test;
|
create database test;
|
||||||
|
@ -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)
|
int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("SELECT_LEX::vers_setup_cond");
|
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;
|
vers_select_conds_t &vers_conditions= table->vers_conditions;
|
||||||
|
|
||||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||||
/*
|
Vers_part_info *vers_info;
|
||||||
if the history is stored in partitions, then partitions
|
if (table->table->part_info && (vers_info= table->table->part_info->vers_info))
|
||||||
themselves are not versioned
|
|
||||||
*/
|
|
||||||
if (table->partition_names && 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())
|
if (vers_conditions.is_set())
|
||||||
{
|
{
|
||||||
my_error(ER_VERS_QUERY_IN_PARTITION, MYF(0), table->alias.str);
|
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
|
else
|
||||||
vers_conditions.init(SYSTEM_TIME_ALL);
|
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
|
#endif
|
||||||
|
|
||||||
if (outer_table && !vers_conditions.is_set())
|
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);
|
DBUG_RETURN(0);
|
||||||
#undef newx
|
#undef newx
|
||||||
}
|
}
|
||||||
|
#undef newx
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
Check fields, find best join, do the select and output fields.
|
Check fields, find best join, do the select and output fields.
|
||||||
|
Reference in New Issue
Block a user