Commit 45751090 authored by unknown's avatar unknown
Browse files

Fix for BUG#18025: Wrong query results because of bugs in partition pruning:

 - Fix typo bug in SEL_ARG::is_singlepoint()
 - In set_up_range_analysis_info(), treat MEDIUMINT as enumerable type just like other integer types


mysql-test/r/partition_pruning.result:
  Testcase for BUG#18025
mysql-test/t/partition_pruning.test:
  Testcase for BUG#18025
sql/opt_range.cc:
  BUG#18025: Fix a typo bug in SEL_ARG::is_singlepoint()
sql/sql_partition.cc:
  BUG#18025: In set_up_range_analysis_info(), treat MEDIUMINT as enumerable type just like other integer types.
parent b002c117
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -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;
+32 −0
Original line number Diff line number Diff line
@@ -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.
+1 −1
Original line number Diff line number Diff line
@@ -339,7 +339,7 @@ class SEL_ARG :public Sql_alloc
    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)
    {
+1 −0
Original line number Diff line number Diff line
@@ -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=