From 07143a73935494056d187bd9da0a5097715d952c Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Tue, 2 May 2017 12:58:25 +0400 Subject: [PATCH] MDEV-12659 Add THD::make_string_literal() --- sql/sql_class.cc | 20 ++++++++++++++++++++ sql/sql_class.h | 14 ++++++++++++++ sql/sql_yacc.yy | 22 +--------------------- sql/sql_yacc_ora.yy | 22 +--------------------- 4 files changed, 36 insertions(+), 42 deletions(-) diff --git a/sql/sql_class.cc b/sql/sql_class.cc index f61e1f0885e..8793dd9b409 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -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 */ diff --git a/sql/sql_class.h b/sql/sql_class.h index cc855c723e2..c1e80761235 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -3423,6 +3423,20 @@ public: 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); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 59c045029f4..d8793c56405 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -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 diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index 77ced40ed5f..aaf3adcf974 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -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