diff options
author | Alexander Barkov <bar@mariadb.com> | 2019-08-16 20:58:14 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2019-08-16 20:58:14 +0400 |
commit | f987de7122b8bd72b758cb8e172bec1ff5f7124b (patch) | |
tree | 916212ad16a941791c4a8bd4bbe59ada34207ad2 | |
parent | ecdacf7264eecb520657ef9ed42021bcc0bcad06 (diff) | |
parent | ec1f195ecf797fc5f37b0cfdbe4ee76d71a96729 (diff) | |
download | mariadb-git-f987de7122b8bd72b758cb8e172bec1ff5f7124b.tar.gz |
Merge remote-tracking branch 'origin/5.5' into 10.1
-rw-r--r-- | mysql-test/r/type_int.result | 24 | ||||
-rw-r--r-- | mysql-test/t/type_int.test | 21 | ||||
-rw-r--r-- | sql/sql_select.cc | 27 |
3 files changed, 70 insertions, 2 deletions
diff --git a/mysql-test/r/type_int.result b/mysql-test/r/type_int.result index 4e7b928ac07..1364f58169e 100644 --- a/mysql-test/r/type_int.result +++ b/mysql-test/r/type_int.result @@ -1,4 +1,28 @@ # +# Start of 5.5 tests +# +# +# MDEV-15955 Assertion `field_types == 0 || field_types[field_pos] == MYSQL_TYPE_LONGLONG' failed in Protocol_text::store_longlong +# +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); +SELECT @a := 1 FROM t1 ORDER BY STRCMP(STDDEV_SAMP(a), 'bar'); +@a := 1 +1 +SELECT COALESCE(1) FROM t1 ORDER BY STRCMP(STDDEV_SAMP(a), 'bar'); +COALESCE(1) +1 +SELECT COALESCE(@a:=1) FROM t1 ORDER BY STRCMP(STDDEV_SAMP(a), 'bar'); +COALESCE(@a:=1) +1 +SELECT COALESCE(@a) FROM t1 ORDER BY STRCMP(STDDEV_SAMP(a), 'bar'); +COALESCE(@a) +1 +DROP TABLE t1; +# +# End of 5.5 tests +# +# # Start of 10.1 tests # # diff --git a/mysql-test/t/type_int.test b/mysql-test/t/type_int.test index e8b9b2cffcd..8eba40c7e32 100644 --- a/mysql-test/t/type_int.test +++ b/mysql-test/t/type_int.test @@ -1,4 +1,25 @@ --echo # +--echo # Start of 5.5 tests +--echo # + +--echo # +--echo # MDEV-15955 Assertion `field_types == 0 || field_types[field_pos] == MYSQL_TYPE_LONGLONG' failed in Protocol_text::store_longlong +--echo # + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); +SELECT @a := 1 FROM t1 ORDER BY STRCMP(STDDEV_SAMP(a), 'bar'); +SELECT COALESCE(1) FROM t1 ORDER BY STRCMP(STDDEV_SAMP(a), 'bar'); +SELECT COALESCE(@a:=1) FROM t1 ORDER BY STRCMP(STDDEV_SAMP(a), 'bar'); +SELECT COALESCE(@a) FROM t1 ORDER BY STRCMP(STDDEV_SAMP(a), 'bar'); +DROP TABLE t1; + +--echo # +--echo # End of 5.5 tests +--echo # + + +--echo # --echo # Start of 10.1 tests --echo # diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 29fc3f80ed0..5b96c15bff5 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -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()))) |