summaryrefslogtreecommitdiff
path: root/sql/sql_select.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r--sql/sql_select.cc38
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,