MDEV-6434: Wrong result (extra rows) with ORDER BY, multiple-column index, InnoDB
- Part #2. Fix obvious problems in the previous patch.
This commit is contained in:
parent
07c0b1d8d0
commit
c714073bfd
@ -10521,6 +10521,7 @@ QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table,
|
|||||||
uint part;
|
uint part;
|
||||||
bool create_err= FALSE;
|
bool create_err= FALSE;
|
||||||
COST_VECT cost;
|
COST_VECT cost;
|
||||||
|
uint max_used_key_len;
|
||||||
|
|
||||||
old_root= thd->mem_root;
|
old_root= thd->mem_root;
|
||||||
/* The following call may change thd->mem_root */
|
/* The following call may change thd->mem_root */
|
||||||
@ -10538,7 +10539,6 @@ QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table,
|
|||||||
if (quick->init())
|
if (quick->init())
|
||||||
goto err;
|
goto err;
|
||||||
quick->records= records;
|
quick->records= records;
|
||||||
quick->max_used_key_length= ref->key_parts;
|
|
||||||
|
|
||||||
if ((cp_buffer_from_ref(thd, table, ref) && thd->is_fatal_error) ||
|
if ((cp_buffer_from_ref(thd, table, ref) && thd->is_fatal_error) ||
|
||||||
!(range= new(alloc) QUICK_RANGE()))
|
!(range= new(alloc) QUICK_RANGE()))
|
||||||
@ -10554,6 +10554,7 @@ QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table,
|
|||||||
alloc_root(&quick->alloc,sizeof(KEY_PART)*ref->key_parts)))
|
alloc_root(&quick->alloc,sizeof(KEY_PART)*ref->key_parts)))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
max_used_key_len=0;
|
||||||
for (part=0 ; part < ref->key_parts ;part++,key_part++)
|
for (part=0 ; part < ref->key_parts ;part++,key_part++)
|
||||||
{
|
{
|
||||||
key_part->part=part;
|
key_part->part=part;
|
||||||
@ -10562,7 +10563,12 @@ QUICK_RANGE_SELECT *get_quick_select_for_ref(THD *thd, TABLE *table,
|
|||||||
key_part->store_length= key_info->key_part[part].store_length;
|
key_part->store_length= key_info->key_part[part].store_length;
|
||||||
key_part->null_bit= key_info->key_part[part].null_bit;
|
key_part->null_bit= key_info->key_part[part].null_bit;
|
||||||
key_part->flag= (uint8) key_info->key_part[part].key_part_flag;
|
key_part->flag= (uint8) key_info->key_part[part].key_part_flag;
|
||||||
|
|
||||||
|
max_used_key_len +=key_info->key_part[part].store_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
quick->max_used_key_length= max_used_key_len;
|
||||||
|
|
||||||
if (insert_dynamic(&quick->ranges,(uchar*)&range))
|
if (insert_dynamic(&quick->ranges,(uchar*)&range))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
@ -11759,18 +11765,24 @@ void QUICK_ROR_UNION_SELECT::add_keys_and_lengths(String *key_names,
|
|||||||
|
|
||||||
void QUICK_RANGE_SELECT::add_used_key_part_to_set(MY_BITMAP *col_set)
|
void QUICK_RANGE_SELECT::add_used_key_part_to_set(MY_BITMAP *col_set)
|
||||||
{
|
{
|
||||||
for (uint i=0; i < max_used_key_length; i++)
|
uint key_len;
|
||||||
|
KEY_PART *part= key_parts;
|
||||||
|
for (key_len=0; key_len < max_used_key_length;
|
||||||
|
key_len += (part++)->store_length)
|
||||||
{
|
{
|
||||||
bitmap_set_bit(col_set, key_parts[i].field->field_index);
|
bitmap_set_bit(col_set, part->field->field_index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void QUICK_GROUP_MIN_MAX_SELECT::add_used_key_part_to_set(MY_BITMAP *col_set)
|
void QUICK_GROUP_MIN_MAX_SELECT::add_used_key_part_to_set(MY_BITMAP *col_set)
|
||||||
{
|
{
|
||||||
for (uint i=0; i < max_used_key_length; i++)
|
uint key_len;
|
||||||
|
KEY_PART_INFO *part= index_info->key_part;
|
||||||
|
for (key_len=0; key_len < max_used_key_length;
|
||||||
|
key_len += (part++)->store_length)
|
||||||
{
|
{
|
||||||
bitmap_set_bit(col_set, index_info->key_part[i].field->field_index);
|
bitmap_set_bit(col_set, part->field->field_index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user