mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Bug#51830: Incorrect partition pruning on range partition
(regression) Problem was that partition pruning did not exclude the last partition if the range was beyond it (i.e. not using MAXVALUE) Fix was to not include the last partition if the partitioning function value was not within the partition range.
This commit is contained in:
@@ -2876,6 +2876,7 @@ int get_partition_id_range(partition_info *part_info,
|
||||
*func_value= part_func_value;
|
||||
if (unsigned_flag)
|
||||
part_func_value-= 0x8000000000000000ULL;
|
||||
/* Search for the partition containing part_func_value */
|
||||
while (max_part_id > min_part_id)
|
||||
{
|
||||
loc_part_id= (max_part_id + min_part_id) / 2;
|
||||
@@ -3015,11 +3016,17 @@ uint32 get_partition_id_range_for_endpoint(partition_info *part_info,
|
||||
part_end_val= range_array[loc_part_id];
|
||||
if (left_endpoint)
|
||||
{
|
||||
DBUG_ASSERT(part_func_value > part_end_val ?
|
||||
(loc_part_id == max_partition &&
|
||||
!part_info->defined_max_value) :
|
||||
1);
|
||||
/*
|
||||
In case of PARTITION p VALUES LESS THAN MAXVALUE
|
||||
the maximum value is in the current partition.
|
||||
the maximum value is in the current (last) partition.
|
||||
If value is equal or greater than the endpoint,
|
||||
the range starts from the next partition.
|
||||
*/
|
||||
if (part_func_value == part_end_val &&
|
||||
if (part_func_value >= part_end_val &&
|
||||
(loc_part_id < max_partition || !part_info->defined_max_value))
|
||||
loc_part_id++;
|
||||
}
|
||||
|
Reference in New Issue
Block a user