diff --git a/mysql-test/r/partition_pruning.result b/mysql-test/r/partition_pruning.result index cbad5d067b0..16dc23cdf42 100644 --- a/mysql-test/r/partition_pruning.result +++ b/mysql-test/r/partition_pruning.result @@ -545,3 +545,41 @@ show status like 'Handler_read_next'; Variable_name Value Handler_read_next 0 drop table t1, t2; +create table t1 ( f_int1 mediumint, f_int2 integer) +partition by list(mod(f_int1,4)) ( +partition p_3 values in (-3), +partition p_2 values in (-2), +partition p_1 values in (-1), +partition p0 values in (0), +partition p1 values in (1), +partition p2 values in (2), +partition p3 values in (3) +); +insert into t1 values (9, 9), (8, 8), (7, 7), (6, 6), (5, 5), +(4, 4), (3, 3), (2, 2), (1, 1); +select * from t1 where f_int1 between 5 and 15 order by f_int1; +f_int1 f_int2 +5 5 +6 6 +7 7 +8 8 +9 9 +drop table t1; +create table t1 (a char(10)) partition by list(length(a)) ( +partition p1 values in (1), +partition p2 values in (2), +partition p3 values in (3), +partition p4 values in (4), +partition p5 values in (5) +); +insert into t1 values ('a'),('bb'),('ccc'),('dddd'),('eeEee'); +select * from t1 where a>='a' and a <= 'dddd'; +a +a +bb +ccc +dddd +explain partitions select * from t1 where a>='a' and a <= 'dddd'; +id select_type table partitions type possible_keys key key_len ref rows Extra +1 SIMPLE t1 p1,p2,p3,p4,p5 ALL NULL NULL NULL NULL 5 Using where +drop table t1; diff --git a/mysql-test/t/partition_pruning.test b/mysql-test/t/partition_pruning.test index 30f4f37ee04..25320e9f80d 100644 --- a/mysql-test/t/partition_pruning.test +++ b/mysql-test/t/partition_pruning.test @@ -447,5 +447,37 @@ show status like 'Handler_read_next'; drop table t1, t2; +# BUG#18025 +# part1: mediumint columns +create table t1 ( f_int1 mediumint, f_int2 integer) +partition by list(mod(f_int1,4)) ( + partition p_3 values in (-3), + partition p_2 values in (-2), + partition p_1 values in (-1), + partition p0 values in (0), + partition p1 values in (1), + partition p2 values in (2), + partition p3 values in (3) +); + +insert into t1 values (9, 9), (8, 8), (7, 7), (6, 6), (5, 5), + (4, 4), (3, 3), (2, 2), (1, 1); +select * from t1 where f_int1 between 5 and 15 order by f_int1; + +drop table t1; + +# part2: bug in pruning code +create table t1 (a char(10)) partition by list(length(a)) ( + partition p1 values in (1), + partition p2 values in (2), + partition p3 values in (3), + partition p4 values in (4), + partition p5 values in (5) +); +insert into t1 values ('a'),('bb'),('ccc'),('dddd'),('eeEee'); +select * from t1 where a>='a' and a <= 'dddd'; +explain partitions select * from t1 where a>='a' and a <= 'dddd'; +drop table t1; + # No tests for NULLs in RANGE(monotonic_expr()) - they depend on BUG#15447 # being fixed. diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 7036702ca44..4ffce67638d 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -339,7 +339,7 @@ public: if (min_flag || max_flag) return FALSE; byte *min_val= (byte *)min_value; - byte *max_val= (byte *)min_value; + byte *max_val= (byte *)max_value; if (maybe_null) { diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index aca8830ffe0..4f1daada0bf 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -5643,6 +5643,7 @@ static void set_up_range_analysis_info(partition_info *part_info) switch (field->type()) { case MYSQL_TYPE_TINY: case MYSQL_TYPE_SHORT: + case MYSQL_TYPE_INT24: case MYSQL_TYPE_LONG: case MYSQL_TYPE_LONGLONG: part_info->get_part_iter_for_interval=