1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

Fixed the bug mdev-11574.

Do not build an index merge of two indexes when one index is
an infix of the other index.
This commit is contained in:
Igor Babaev
2017-10-06 00:08:36 -07:00
parent e6862cf1ff
commit dbeffabc83
4 changed files with 246 additions and 8 deletions

View File

@ -8990,6 +8990,34 @@ bool sel_trees_can_be_ored(RANGE_OPT_PARAM* param,
DBUG_RETURN(!common_keys->is_clear_all());
}
/*
Check whether the key parts inf_init..inf_end-1 of one index can compose
an infix for the key parts key_init..key_end-1 of another index
*/
static
bool is_key_infix(KEY_PART *key_init, KEY_PART *key_end,
KEY_PART *inf_init, KEY_PART *inf_end)
{
KEY_PART *key_part, *inf_part;
for (key_part= key_init; key_part < key_end; key_part++)
{
if (key_part->field->eq(inf_init->field))
break;
}
if (key_part == key_end)
return false;
for (key_part++, inf_part= inf_init + 1;
key_part < key_end && inf_part < inf_end;
key_part++, inf_part++)
{
if (!key_part->field->eq(inf_part->field))
return false;
}
return inf_part == inf_end;
}
/*
Check whether range parts of two trees must be ored for some indexes
@ -9046,14 +9074,9 @@ bool sel_trees_must_be_ored(RANGE_OPT_PARAM* param,
KEY_PART *key2_init= param->key[idx2]+tree2->keys[idx2]->part;
KEY_PART *key2_end= param->key[idx2]+tree2->keys[idx2]->max_part_no;
KEY_PART *part1, *part2;
for (part1= key1_init, part2= key2_init;
part1 < key1_end && part2 < key2_end;
part1++, part2++)
{
if (!part1->field->eq(part2->field))
DBUG_RETURN(FALSE);
}
if (!is_key_infix(key1_init, key1_end, key2_init, key2_end) &&
!is_key_infix(key2_init, key2_end, key1_init, key1_end))
DBUG_RETURN(FALSE);
}
}