From a26f8d91aa400f60fcabaab6c243956a0d9419fd Mon Sep 17 00:00:00 2001 From: Ramil Kalimullin Date: Wed, 1 Apr 2009 10:34:59 +0500 Subject: [PATCH] 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 | 13 +++++++++++++ mysql-test/t/partition.test | 13 +++++++++++++ sql/sql_partition.cc | 3 ++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/partition.result b/mysql-test/r/partition.result index c5733e33569..f69ba522a9c 100644 --- a/mysql-test/r/partition.result +++ b/mysql-test/r/partition.result @@ -1911,5 +1911,18 @@ select count(*) from t1; count(*) 288 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 SET @@global.general_log= @old_general_log; diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test index fc6a33819d6..ce89609de39 100644 --- a/mysql-test/t/partition.test +++ b/mysql-test/t/partition.test @@ -1922,6 +1922,19 @@ insert into t1 select s1 from t1 where s1=3; select count(*) from 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 diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index ae55c194c3c..4a50650b6f4 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -2937,7 +2937,8 @@ uint32 get_partition_id_range_for_endpoint(partition_info *part_info, the maximum value is in the current partition. */ 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++; } else