diff options
author | Georgi Kodinov <kgeorge@mysql.com> | 2008-07-17 18:51:24 +0300 |
---|---|---|
committer | Georgi Kodinov <kgeorge@mysql.com> | 2008-07-17 18:51:24 +0300 |
commit | 90d608b696fb33f653259d19a44d50c3e7d5e795 (patch) | |
tree | aab43632f08db39d938c98978b7eb3336ae9689a /sql/sql_select.cc | |
parent | d528c7307b99e8f4a2298f24b4e121904f6cb411 (diff) | |
parent | 4fc5b6da99d6c48b2a186592b7afee19709f5415 (diff) | |
download | mariadb-git-90d608b696fb33f653259d19a44d50c3e7d5e795.tar.gz |
merge of bug #37830 to 5.1
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r-- | sql/sql_select.cc | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 9b094474216..068c8c0e402 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -12508,6 +12508,9 @@ part_of_refkey(TABLE *table,Field *field) @note used_key_parts is set to correct key parts used if return value != 0 (On other cases, used_key_part may be changed) + Note that the value may actually be greater than the number of index + key parts. This can happen for storage engines that have the primary + key parts as a suffix for every secondary key. @retval 1 key is ok. @@ -12580,11 +12583,27 @@ static int test_if_order_by_key(ORDER *order, TABLE *table, uint idx, reverse=flag; // Remember if reverse key_part++; } - *used_key_parts= on_primary_key ? table->key_info[idx].key_parts : - (uint) (key_part - table->key_info[idx].key_part); - if (reverse == -1 && !(table->file->index_flags(idx, *used_key_parts-1, 1) & - HA_READ_PREV)) - reverse= 0; // Index can't be used + if (on_primary_key) + { + uint used_key_parts_secondary= table->key_info[idx].key_parts; + uint used_key_parts_pk= + (uint) (key_part - table->key_info[table->s->primary_key].key_part); + *used_key_parts= used_key_parts_pk + used_key_parts_secondary; + + if (reverse == -1 && + (!(table->file->index_flags(idx, used_key_parts_secondary - 1, 1) & + HA_READ_PREV) || + !(table->file->index_flags(table->s->primary_key, + used_key_parts_pk - 1, 1) & HA_READ_PREV))) + reverse= 0; // Index can't be used + } + else + { + *used_key_parts= (uint) (key_part - table->key_info[idx].key_part); + if (reverse == -1 && + !(table->file->index_flags(idx, *used_key_parts-1, 1) & HA_READ_PREV)) + reverse= 0; // Index can't be used + } DBUG_RETURN(reverse); } |