From 9a780a59d53a905d8acf67e51cba5f1492e706b6 Mon Sep 17 00:00:00 2001 From: Sergey Petrunya Date: Thu, 25 Jul 2013 22:42:26 +0400 Subject: [PATCH] MDEV-4687: impossible where with < operation, but =-5 return one row - Let _ma_record_pos() set SEARCH_PART_KEY when doing a search on a prefix of a [unique] key. Otherwise, _ma_search_pos() would find the first key equal to search key, and assume it is also the last one, which will make a wrong estimate of key's position. A wrong key position may cause min_pos > max_pos and records_in_range() will return 0, which will make the optimizer think it's an impossible range while in fact it is not. --- storage/maria/ma_range.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/storage/maria/ma_range.c b/storage/maria/ma_range.c index bb72c10bba7..2a01359f1a1 100644 --- a/storage/maria/ma_range.c +++ b/storage/maria/ma_range.c @@ -144,6 +144,10 @@ static ha_rows _ma_record_pos(MARIA_HA *info, const uchar *key_data, (HA_KEYSEG**) 0); DBUG_EXECUTE("key", _ma_print_key(DBUG_FILE, &key);); nextflag=maria_read_vec[search_flag]; + + /* Indicate if we're doing a search on a key prefix */ + if (((((key_part_map)1) << key.keyinfo->keysegs) - 1) != keypart_map) + nextflag |= SEARCH_PART_KEY; /* my_handler.c:ha_compare_text() has a flag 'skip_end_space'.