mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 02:05:57 +01:00
Bug#14845133:
The problem is related to the changes made in bug#13025132. get_partition_set can do dynamic pruning which limits the partitions to scan even further. This is not accounted for when setting the correct start of the preallocated record buffer used in the priority queue, thus leading to wrong buffer is used (including wrong preset partitioning id, connected to that buffer). Solution is to fast forward the buffer pointer to point to the correct partition record buffer.
This commit is contained in:
parent
8cde305749
commit
9b50775d82
1 changed files with 19 additions and 2 deletions
|
@ -4077,6 +4077,7 @@ bool ha_partition::init_record_priority_queue()
|
|||
{
|
||||
if (bitmap_is_set(&m_part_info->used_partitions, i))
|
||||
{
|
||||
DBUG_PRINT("info", ("init rec-buf for part %u", i));
|
||||
int2store(ptr, i);
|
||||
ptr+= m_rec_length + PARTITION_BYTES_IN_POS;
|
||||
}
|
||||
|
@ -4981,11 +4982,27 @@ int ha_partition::handle_ordered_index_scan(uchar *buf, bool reverse_order)
|
|||
m_top_entry= NO_CURRENT_PART_ID;
|
||||
queue_remove_all(&m_queue);
|
||||
|
||||
DBUG_PRINT("info", ("m_part_spec.start_part %d", m_part_spec.start_part));
|
||||
for (i= m_part_spec.start_part; i <= m_part_spec.end_part; i++)
|
||||
/*
|
||||
Position part_rec_buf_ptr to point to the first used partition >=
|
||||
start_part. There may be partitions marked by used_partitions,
|
||||
but is before start_part. These partitions has allocated record buffers
|
||||
but is dynamically pruned, so those buffers must be skipped.
|
||||
*/
|
||||
uint first_used_part= bitmap_get_first_set(&m_part_info->used_partitions);
|
||||
for (; first_used_part < m_part_spec.start_part; first_used_part++)
|
||||
{
|
||||
if (bitmap_is_set(&(m_part_info->used_partitions), first_used_part))
|
||||
part_rec_buf_ptr+= m_rec_length + PARTITION_BYTES_IN_POS;
|
||||
}
|
||||
DBUG_PRINT("info", ("m_part_spec.start_part %u first_used_part %u",
|
||||
m_part_spec.start_part, first_used_part));
|
||||
for (i= first_used_part; i <= m_part_spec.end_part; i++)
|
||||
{
|
||||
if (!(bitmap_is_set(&(m_part_info->used_partitions), i)))
|
||||
continue;
|
||||
DBUG_PRINT("info", ("reading from part %u (scan_type: %u)",
|
||||
i, m_index_scan_type));
|
||||
DBUG_ASSERT(i == uint2korr(part_rec_buf_ptr));
|
||||
uchar *rec_buf_ptr= part_rec_buf_ptr + PARTITION_BYTES_IN_POS;
|
||||
int error;
|
||||
handler *file= m_file[i];
|
||||
|
|
Loading…
Add table
Reference in a new issue