Commit 968069d8 authored by Ramil Kalimullin's avatar Ramil Kalimullin

Fix for bug#42944: partition not pruned correctly

Problem: we don't prune a LESS THAN partition if MAXVALUE is given and
given value is equal to a LESS THAN value.

Fix: prune partitions in such cases.


mysql-test/r/partition.result:
  Fix for bug#42944: partition not pruned correctly
    - test result.
mysql-test/t/partition.test:
  Fix for bug#42944: partition not pruned correctly
    - test case.
sql/sql_partition.cc:
  Fix for bug#42944: partition not pruned correctly
    - prune partition if given value is equal to a LESS THAN value
      and it's not a "PARTITION ... LESS THAN MAXVALUE" one.
parent ab958ee0
...@@ -1911,5 +1911,18 @@ select count(*) from t1; ...@@ -1911,5 +1911,18 @@ select count(*) from t1;
count(*) count(*)
288 288
drop table t1; drop table t1;
#
# Bug#42944: partition not pruned correctly
#
CREATE TABLE t1 (a int) PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (100),
PARTITION p1 VALUES LESS THAN (200),
PARTITION p2 VALUES LESS THAN (300),
PARTITION p3 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (10), (100), (200), (300), (400);
EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a>=200;
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p2,p3 ALL NULL NULL NULL NULL 3 Using where
DROP TABLE t1;
End of 5.1 tests End of 5.1 tests
SET @@global.general_log= @old_general_log; SET @@global.general_log= @old_general_log;
...@@ -1922,6 +1922,19 @@ insert into t1 select s1 from t1 where s1=3; ...@@ -1922,6 +1922,19 @@ insert into t1 select s1 from t1 where s1=3;
select count(*) from t1; select count(*) from t1;
drop table t1; drop table t1;
--echo #
--echo # Bug#42944: partition not pruned correctly
--echo #
CREATE TABLE t1 (a int) PARTITION BY RANGE (a)
(PARTITION p0 VALUES LESS THAN (100),
PARTITION p1 VALUES LESS THAN (200),
PARTITION p2 VALUES LESS THAN (300),
PARTITION p3 VALUES LESS THAN MAXVALUE);
INSERT INTO t1 VALUES (10), (100), (200), (300), (400);
EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a>=200;
DROP TABLE t1;
--echo End of 5.1 tests --echo End of 5.1 tests
......
...@@ -2937,7 +2937,8 @@ uint32 get_partition_id_range_for_endpoint(partition_info *part_info, ...@@ -2937,7 +2937,8 @@ uint32 get_partition_id_range_for_endpoint(partition_info *part_info,
the maximum value is in the current partition. the maximum value is in the current partition.
*/ */
if (part_func_value > bound || if (part_func_value > bound ||
(part_func_value == bound && !part_info->defined_max_value)) (part_func_value == bound &&
(!part_info->defined_max_value || loc_part_id < max_partition)))
loc_part_id++; loc_part_id++;
} }
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment