diff options
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r-- | sql/sql_select.cc | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 7169a834ff7..808af9d69ab 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -6019,19 +6019,33 @@ get_store_key(THD *thd, KEYUSE *keyuse, table_map used_tables, key_part->length, keyuse->val); } - else if (keyuse->val->type() == Item::FIELD_ITEM || - (keyuse->val->type() == Item::REF_ITEM && - ((Item_ref*)keyuse->val)->ref_type() == Item_ref::OUTER_REF && - (*(Item_ref**)((Item_ref*)keyuse->val)->ref)->ref_type() == - Item_ref::DIRECT_REF && - keyuse->val->real_item()->type() == Item::FIELD_ITEM)) + + Item_field *field_item= NULL; + if (keyuse->val->type() == Item::FIELD_ITEM) + field_item= static_cast<Item_field*>(keyuse->val->real_item()); + else if (keyuse->val->type() == Item::REF_ITEM) + { + Item_ref *item_ref= static_cast<Item_ref*>(keyuse->val); + if (item_ref->ref_type() == Item_ref::OUTER_REF) + { + if ((*item_ref->ref)->type() == Item::FIELD_ITEM) + field_item= static_cast<Item_field*>(item_ref->real_item()); + else if ((*(Item_ref**)(item_ref)->ref)->ref_type() + == Item_ref::DIRECT_REF + && + item_ref->real_item()->type() == Item::FIELD_ITEM) + field_item= static_cast<Item_field*>(item_ref->real_item()); + } + } + if (field_item) return new store_key_field(thd, - key_part->field, - key_buff + maybe_null, - maybe_null ? key_buff : 0, - key_part->length, - ((Item_field*) keyuse->val->real_item())->field, - keyuse->val->full_name()); + key_part->field, + key_buff + maybe_null, + maybe_null ? key_buff : 0, + key_part->length, + field_item->field, + keyuse->val->full_name()); + return new store_key_item(thd, key_part->field, key_buff + maybe_null, |