Bug#14463247 ORDER BY SUBQUERY REFERENCING OUTER ALIAS FAILS
Documentation for class Item_outer_ref was wrong: (*ref) may point to Item_field as well (see e.g. Item_outer_ref::fix_fields) So this casting in get_store_key() was wrong: (*(Item_ref**)((Item_ref*)keyuse->val)->ref)->ref_type()
This commit is contained in:
parent
61f064eb6d
commit
a16e00a6c4
@ -2676,6 +2676,7 @@ public:
|
||||
resolved is a grouping one. After it has been fixed the ref field will point
|
||||
to either an Item_ref or an Item_direct_ref object which will be used to
|
||||
access the field.
|
||||
The ref field may also point to an Item_field instance.
|
||||
See also comments for the fix_inner_refs() and the
|
||||
Item_field::fix_outer_field() functions.
|
||||
*/
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user