diff --git a/mysql-test/r/func_json.result b/mysql-test/r/func_json.result index 74798b13e3a..e74d6292476 100644 --- a/mysql-test/r/func_json.result +++ b/mysql-test/r/func_json.result @@ -830,3 +830,15 @@ SET sql_mode=default; select JSON_VALID( '{"a":1]' ); JSON_VALID( '{"a":1]' ) 0 +# +# MDEV-18886 JSON_ARRAY() does not recognise JSON argument. +# +SELECT JSON_ARRAY(_UTF8 'str', JSON_OBJECT(_LATIN1 'plugin', _LATIN1'unix_socket')); +JSON_ARRAY(_UTF8 'str', JSON_OBJECT(_LATIN1 'plugin', _LATIN1'unix_socket')) +["str", {"plugin": "unix_socket"}] +SELECT CHARSET(JSON_ARRAY()); +CHARSET(JSON_ARRAY()) +latin1 +SELECT CHARSET(JSON_OBJECT()); +CHARSET(JSON_OBJECT()) +latin1 diff --git a/mysql-test/t/func_json.test b/mysql-test/t/func_json.test index 43bd19801d5..ef3fdc685fe 100644 --- a/mysql-test/t/func_json.test +++ b/mysql-test/t/func_json.test @@ -487,3 +487,10 @@ SET sql_mode=default; select JSON_VALID( '{"a":1]' ); +--echo # +--echo # MDEV-18886 JSON_ARRAY() does not recognise JSON argument. +--echo # +SELECT JSON_ARRAY(_UTF8 'str', JSON_OBJECT(_LATIN1 'plugin', _LATIN1'unix_socket')); +SELECT CHARSET(JSON_ARRAY()); +SELECT CHARSET(JSON_OBJECT()); + diff --git a/sql/item_jsonfunc.cc b/sql/item_jsonfunc.cc index 27bc97f4c5e..78eb58506ff 100644 --- a/sql/item_jsonfunc.cc +++ b/sql/item_jsonfunc.cc @@ -1488,9 +1488,10 @@ bool Item_func_json_array::fix_length_and_dec() if (arg_count == 0) { - collation.set(&my_charset_utf8_general_ci, + THD* thd= current_thd; + collation.set(thd->variables.collation_connection, DERIVATION_COERCIBLE, MY_REPERTOIRE_ASCII); - tmp_val.set_charset(&my_charset_utf8_general_ci); + tmp_val.set_charset(thd->variables.collation_connection); max_length= 2; return FALSE; } diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index a908aba2d2f..b3baae99c15 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -1192,6 +1192,7 @@ public: (cs->state & MY_CS_UNICODE)); } } + bool is_json_type() { return args[0]->is_json_type(); } String *val_str(String *); longlong val_int() {