mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
MDEV-8949: COLUMN_CREATE unicode name breakage
Use utf-mb4 if it is possible.
This commit is contained in:
@@ -63,6 +63,12 @@ typedef struct st_mysql_lex_string LEX_STRING;
|
||||
/* NO and OK is the same used just to show semantics */
|
||||
#define ER_DYNCOL_NO ER_DYNCOL_OK
|
||||
|
||||
#ifdef HAVE_CHARSET_utf8mb4
|
||||
#define DYNCOL_UTF (&my_charset_utf8mb4_general_ci)
|
||||
#else
|
||||
#define DYNCOL_UTF (&my_charset_utf8_general_ci)
|
||||
#endif
|
||||
|
||||
enum enum_dyncol_func_result
|
||||
{
|
||||
ER_DYNCOL_OK= 0,
|
||||
|
||||
@@ -3379,5 +3379,32 @@ F09F988E78
|
||||
78F09F988E78
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-8949: COLUMN_CREATE unicode name breakage
|
||||
#
|
||||
SET NAMES utf8mb4;
|
||||
SELECT COLUMN_JSON(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1));
|
||||
COLUMN_JSON(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1))
|
||||
{"😎":1}
|
||||
SELECT COLUMN_LIST(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1));
|
||||
COLUMN_LIST(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1))
|
||||
`😎`
|
||||
SELECT COLUMN_GET(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1), _utf8mb4 0xF09F988E
|
||||
as int);
|
||||
COLUMN_GET(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1), _utf8mb4 0xF09F988E
|
||||
as int)
|
||||
1
|
||||
CREATE TABLE t1 AS SELECT
|
||||
COLUMN_LIST(COLUMN_CREATE('a',1)),
|
||||
COLUMN_JSON(COLUMN_CREATE('b',1));
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`COLUMN_LIST(COLUMN_CREATE('a',1))` longtext CHARACTER SET utf8mb4,
|
||||
`COLUMN_JSON(COLUMN_CREATE('b',1))` longtext CHARACTER SET utf8mb4
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
SET NAMES default;
|
||||
# End of 10.0 tests
|
||||
#
|
||||
# End of tests
|
||||
#
|
||||
|
||||
@@ -1876,6 +1876,26 @@ LOAD DATA INFILE '../../std_data/loaddata/mdev-11343.txt' INTO TABLE t1 CHARACTE
|
||||
SELECT HEX(a) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-8949: COLUMN_CREATE unicode name breakage
|
||||
--echo #
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SELECT COLUMN_JSON(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1));
|
||||
SELECT COLUMN_LIST(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1));
|
||||
SELECT COLUMN_GET(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1), _utf8mb4 0xF09F988E
|
||||
as int);
|
||||
|
||||
CREATE TABLE t1 AS SELECT
|
||||
COLUMN_LIST(COLUMN_CREATE('a',1)),
|
||||
COLUMN_JSON(COLUMN_CREATE('b',1));
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
SET NAMES default;
|
||||
|
||||
--echo # End of 10.0 tests
|
||||
|
||||
--echo #
|
||||
--echo # End of tests
|
||||
--echo #
|
||||
|
||||
@@ -4184,8 +4184,7 @@ mariadb_dyncol_json_internal(DYNAMIC_COLUMN *str, DYNAMIC_STRING *json,
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((rc= mariadb_dyncol_val_str(json, &val,
|
||||
&my_charset_utf8_general_ci, '"')) < 0)
|
||||
if ((rc= mariadb_dyncol_val_str(json, &val, DYNCOL_UTF, '"')) < 0)
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6642,7 +6642,7 @@ longlong Item_func_dyncol_exists::val_int()
|
||||
null_value= 1;
|
||||
return 1;
|
||||
}
|
||||
if (my_charset_same(nm->charset(), &my_charset_utf8_general_ci))
|
||||
if (my_charset_same(nm->charset(), DYNCOL_UTF))
|
||||
{
|
||||
buf.str= (char *) nm->ptr();
|
||||
buf.length= nm->length();
|
||||
@@ -6652,11 +6652,11 @@ longlong Item_func_dyncol_exists::val_int()
|
||||
uint strlen;
|
||||
uint dummy_errors;
|
||||
buf.str= (char *)sql_alloc((strlen= nm->length() *
|
||||
my_charset_utf8_general_ci.mbmaxlen + 1));
|
||||
DYNCOL_UTF->mbmaxlen + 1));
|
||||
if (buf.str)
|
||||
{
|
||||
buf.length=
|
||||
copy_and_convert(buf.str, strlen, &my_charset_utf8_general_ci,
|
||||
copy_and_convert(buf.str, strlen, DYNCOL_UTF,
|
||||
nm->ptr(), nm->length(), nm->charset(),
|
||||
&dummy_errors);
|
||||
}
|
||||
|
||||
@@ -4444,7 +4444,7 @@ bool Item_func_dyncol_create::prepare_arguments(bool force_names_arg)
|
||||
if (res)
|
||||
{
|
||||
// guaranty UTF-8 string for names
|
||||
if (my_charset_same(res->charset(), &my_charset_utf8_general_ci))
|
||||
if (my_charset_same(res->charset(), DYNCOL_UTF))
|
||||
{
|
||||
keys_str[i].length= res->length();
|
||||
keys_str[i].str= sql_strmake(res->ptr(), res->length());
|
||||
@@ -4455,11 +4455,11 @@ bool Item_func_dyncol_create::prepare_arguments(bool force_names_arg)
|
||||
uint dummy_errors;
|
||||
char *str=
|
||||
(char *)sql_alloc((strlen= res->length() *
|
||||
my_charset_utf8_general_ci.mbmaxlen + 1));
|
||||
DYNCOL_UTF->mbmaxlen + 1));
|
||||
if (str)
|
||||
{
|
||||
keys_str[i].length=
|
||||
copy_and_convert(str, strlen, &my_charset_utf8_general_ci,
|
||||
copy_and_convert(str, strlen, DYNCOL_UTF,
|
||||
res->ptr(), res->length(), res->charset(),
|
||||
&dummy_errors);
|
||||
keys_str[i].str= str;
|
||||
@@ -4680,9 +4680,10 @@ String *Item_func_dyncol_json::val_str(String *str)
|
||||
size_t length, alloc_length;
|
||||
dynstr_reassociate(&json, &ptr, &length, &alloc_length);
|
||||
str->reassociate(ptr, (uint32) length, (uint32) alloc_length,
|
||||
&my_charset_utf8_general_ci);
|
||||
DYNCOL_UTF);
|
||||
null_value= FALSE;
|
||||
}
|
||||
str->set_charset(DYNCOL_UTF);
|
||||
return str;
|
||||
|
||||
null:
|
||||
@@ -4781,7 +4782,7 @@ bool Item_dyncol_get::get_dyn_value(DYNAMIC_COLUMN_VALUE *val, String *tmp)
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (my_charset_same(nm->charset(), &my_charset_utf8_general_ci))
|
||||
if (my_charset_same(nm->charset(), DYNCOL_UTF))
|
||||
{
|
||||
buf.str= (char *) nm->ptr();
|
||||
buf.length= nm->length();
|
||||
@@ -4791,11 +4792,11 @@ bool Item_dyncol_get::get_dyn_value(DYNAMIC_COLUMN_VALUE *val, String *tmp)
|
||||
uint strlen;
|
||||
uint dummy_errors;
|
||||
buf.str= (char *)sql_alloc((strlen= nm->length() *
|
||||
my_charset_utf8_general_ci.mbmaxlen + 1));
|
||||
DYNCOL_UTF->mbmaxlen + 1));
|
||||
if (buf.str)
|
||||
{
|
||||
buf.length=
|
||||
copy_and_convert(buf.str, strlen, &my_charset_utf8_general_ci,
|
||||
copy_and_convert(buf.str, strlen, DYNCOL_UTF,
|
||||
nm->ptr(), nm->length(), nm->charset(),
|
||||
&dummy_errors);
|
||||
}
|
||||
@@ -5229,7 +5230,6 @@ String *Item_func_dyncol_list::val_str(String *str)
|
||||
goto null;
|
||||
|
||||
str->length(0);
|
||||
str->set_charset(&my_charset_utf8_general_ci);
|
||||
for (i= 0; i < count; i++)
|
||||
{
|
||||
append_identifier(current_thd, str, names[i].str, names[i].length);
|
||||
@@ -5239,6 +5239,7 @@ String *Item_func_dyncol_list::val_str(String *str)
|
||||
null_value= FALSE;
|
||||
if (names)
|
||||
my_free(names);
|
||||
str->set_charset(DYNCOL_UTF);
|
||||
return str;
|
||||
|
||||
null:
|
||||
|
||||
@@ -1177,14 +1177,14 @@ public:
|
||||
class Item_func_dyncol_json: public Item_str_func
|
||||
{
|
||||
public:
|
||||
Item_func_dyncol_json(Item *str) :Item_str_func(str) {}
|
||||
Item_func_dyncol_json(Item *str) :Item_str_func(str)
|
||||
{collation.set(DYNCOL_UTF);}
|
||||
const char *func_name() const{ return "column_json"; }
|
||||
String *val_str(String *);
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
max_length= MAX_BLOB_WIDTH;
|
||||
maybe_null= 1;
|
||||
collation.set(&my_charset_bin);
|
||||
decimals= 0;
|
||||
}
|
||||
};
|
||||
@@ -1218,7 +1218,8 @@ public:
|
||||
class Item_func_dyncol_list: public Item_str_func
|
||||
{
|
||||
public:
|
||||
Item_func_dyncol_list(Item *str) :Item_str_func(str) {};
|
||||
Item_func_dyncol_list(Item *str) :Item_str_func(str)
|
||||
{collation.set(DYNCOL_UTF);};
|
||||
void fix_length_and_dec() { maybe_null= 1; max_length= MAX_BLOB_WIDTH; };
|
||||
const char *func_name() const{ return "column_list"; }
|
||||
String *val_str(String *);
|
||||
|
||||
Reference in New Issue
Block a user