Commit 07143a73 authored by Alexander Barkov's avatar Alexander Barkov

MDEV-12659 Add THD::make_string_literal()

parent 85b73e22
......@@ -2352,6 +2352,26 @@ bool THD::convert_string(String *s, CHARSET_INFO *from_cs, CHARSET_INFO *to_cs)
}
Item_string *THD::make_string_literal(const char *str, size_t length,
uint repertoire)
{
if (!charset_is_collation_connection &&
(repertoire != MY_REPERTOIRE_ASCII ||
!my_charset_is_ascii_based(variables.collation_connection)))
{
LEX_STRING to;
if (convert_string(&to, variables.collation_connection,
str, length, variables.character_set_client))
return NULL;
str= to.str;
length= to.length;
}
return new (mem_root) Item_string(this, str, length,
variables.collation_connection,
DERIVATION_COERCIBLE, repertoire);
}
/*
Update some cache variables when character set changes
*/
......
......@@ -3423,6 +3423,20 @@ class THD :public Statement,
bool convert_string(String *s, CHARSET_INFO *from_cs, CHARSET_INFO *to_cs);
/*
Create a string literal with optional client->connection conversion.
@param str - the string in the client character set
@param length - length of the string
@param repertoire - the repertoire of the string
*/
Item_string *make_string_literal(const char *str, size_t length,
uint repertoire);
Item_string *make_string_literal(const Lex_string_with_metadata_st &str)
{
uint repertoire= str.repertoire(variables.character_set_client);
return make_string_literal(str.str, str.length, repertoire);
}
void add_changed_table(TABLE *table);
void add_changed_table(const char *key, long key_length);
CHANGED_TABLE_LIST * changed_table_dup(const char *key, long key_length);
......
......@@ -13712,27 +13712,7 @@ load_data_set_elem:
text_literal:
TEXT_STRING
{
LEX_CSTRING tmp;
CHARSET_INFO *cs_con= thd->variables.collation_connection;
CHARSET_INFO *cs_cli= thd->variables.character_set_client;
uint repertoire= $1.repertoire(cs_cli);
if (thd->charset_is_collation_connection ||
(repertoire == MY_REPERTOIRE_ASCII &&
my_charset_is_ascii_based(cs_con)))
tmp= $1;
else
{
LEX_STRING to;
if (thd->convert_string(&to, cs_con, $1.str, $1.length, cs_cli))
MYSQL_YYABORT;
tmp.str= to.str;
tmp.length= to.length;
}
$$= new (thd->mem_root) Item_string(thd, tmp.str, tmp.length,
cs_con,
DERIVATION_COERCIBLE,
repertoire);
if ($$ == NULL)
if (!($$= thd->make_string_literal($1)))
MYSQL_YYABORT;
}
| NCHAR_STRING
......
......@@ -13836,27 +13836,7 @@ load_data_set_elem:
text_literal:
TEXT_STRING
{
LEX_CSTRING tmp;
CHARSET_INFO *cs_con= thd->variables.collation_connection;
CHARSET_INFO *cs_cli= thd->variables.character_set_client;
uint repertoire= $1.repertoire(cs_cli);
if (thd->charset_is_collation_connection ||
(repertoire == MY_REPERTOIRE_ASCII &&
my_charset_is_ascii_based(cs_con)))
tmp= $1;
else
{
LEX_STRING to;
if (thd->convert_string(&to, cs_con, $1.str, $1.length, cs_cli))
MYSQL_YYABORT;
tmp.str= to.str;
tmp.length= to.length;
}
$$= new (thd->mem_root) Item_string(thd, tmp.str, tmp.length,
cs_con,
DERIVATION_COERCIBLE,
repertoire);
if ($$ == NULL)
if (!($$= thd->make_string_literal($1)))
MYSQL_YYABORT;
}
| NCHAR_STRING
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment