mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
merge
This commit is contained in:
@ -4370,6 +4370,58 @@ int ha_partition::index_read_last_map(uchar *buf, const uchar *key,
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Optimization of the default implementation to take advantage of dynamic
|
||||
partition pruning.
|
||||
*/
|
||||
int ha_partition::index_read_idx_map(uchar *buf, uint index,
|
||||
const uchar *key,
|
||||
key_part_map keypart_map,
|
||||
enum ha_rkey_function find_flag)
|
||||
{
|
||||
int error= HA_ERR_KEY_NOT_FOUND;
|
||||
DBUG_ENTER("ha_partition::index_read_idx_map");
|
||||
|
||||
if (find_flag == HA_READ_KEY_EXACT)
|
||||
{
|
||||
uint part;
|
||||
m_start_key.key= key;
|
||||
m_start_key.keypart_map= keypart_map;
|
||||
m_start_key.flag= find_flag;
|
||||
m_start_key.length= calculate_key_len(table, index, m_start_key.key,
|
||||
m_start_key.keypart_map);
|
||||
|
||||
get_partition_set(table, buf, index, &m_start_key, &m_part_spec);
|
||||
|
||||
/* How can it be more than one partition with the current use? */
|
||||
DBUG_ASSERT(m_part_spec.start_part == m_part_spec.end_part);
|
||||
|
||||
for (part= m_part_spec.start_part; part <= m_part_spec.end_part; part++)
|
||||
{
|
||||
if (bitmap_is_set(&(m_part_info->used_partitions), part))
|
||||
{
|
||||
error= m_file[part]->index_read_idx_map(buf, index, key,
|
||||
keypart_map, find_flag);
|
||||
if (error != HA_ERR_KEY_NOT_FOUND &&
|
||||
error != HA_ERR_END_OF_FILE)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
If not only used with READ_EXACT, we should investigate if possible
|
||||
to optimize for other find_flag's as well.
|
||||
*/
|
||||
DBUG_ASSERT(0);
|
||||
/* fall back on the default implementation */
|
||||
error= handler::index_read_idx_map(buf, index, key, keypart_map, find_flag);
|
||||
}
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Read next record in a forward index scan
|
||||
|
||||
|
Reference in New Issue
Block a user