1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

Merge remote-tracking branch 'origin/5.5' into 10.1

This commit is contained in:
Alexander Barkov
2019-08-16 20:58:14 +04:00
3 changed files with 70 additions and 2 deletions

View File

@ -16158,8 +16158,31 @@ static Field *create_tmp_field_from_item(THD *thd, Item *item, TABLE *table,
{
Field *UNINIT_VAR(new_field);
DBUG_ASSERT(thd == table->in_use);
new_field= item->Item::create_tmp_field(false, table);
if (item->type() == Item::FUNC_ITEM &&
static_cast<Item_func*>(item)->functype() == Item_func::SUSERVAR_FUNC)
{
/*
A temporary solution for versions 5.5 .. 10.3.
This change should be null-merged to 10.4.
Item_func_set_user_var is special. It overrides make_field().
by adding a special branch `if (result_field)...`.
So it's important to preserve the exact data type here,
to avoid type mismatch in Protocol_text::store_longlong()
See MDEV-15955.
Other Item_func descendants are not affected by MDEV-15955.
They don't override make_field() so they don't use result_field
when initializing Send_field.
This is properly fixed in 10.4 in the method
Item_func_user_var::create_tmp_field_ex().
*/
new_field= item->tmp_table_field_from_field_type(table, false, true);
}
else
new_field= item->Item::create_tmp_field(false, table);
if (copy_func &&
(item->is_result_field() ||
(item->real_item()->is_result_field())))