summaryrefslogtreecommitdiff
path: root/sql/sql_select.cc
diff options
context:
space:
mode:
authorGeorgi Kodinov <kgeorge@mysql.com>2008-07-17 18:51:24 +0300
committerGeorgi Kodinov <kgeorge@mysql.com>2008-07-17 18:51:24 +0300
commit90d608b696fb33f653259d19a44d50c3e7d5e795 (patch)
treeaab43632f08db39d938c98978b7eb3336ae9689a /sql/sql_select.cc
parentd528c7307b99e8f4a2298f24b4e121904f6cb411 (diff)
parent4fc5b6da99d6c48b2a186592b7afee19709f5415 (diff)
downloadmariadb-git-90d608b696fb33f653259d19a44d50c3e7d5e795.tar.gz
merge of bug #37830 to 5.1
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r--sql/sql_select.cc29
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);
}