mirror of
https://github.com/MariaDB/server.git
synced 2025-07-07 06:01:31 +03:00
bug #20318 (ctype_ucs2_def test fails with embedded)
there was two problems about charsets in embedded server 1. mysys/charset.c - defined there default_charset_info variable is modified by both server and client code (particularly when --default-charset option is handled) In embedded server we get two codelines modifying one variable. I created separate default_client_charset_info for client code 2. mysql->charset and mysql->options.charset initialization isn't properly done for embedded server - necessary calls added include/sql_common.h: client charset info default declared libmysqld/lib_sql.cc: thd_init_client_charset calls added libmysqld/libmysqld.c: check_embedded_connection moved to client.c to avoid code duplication sql-common/client.c: charset initialization moved to mysql_init_character_set to be used in embedded server sql/sql_parse.cc: thread client charset initialization moved to thd_init_client_charset to avoid code duplication
This commit is contained in:
@ -85,49 +85,7 @@ static void end_server(MYSQL *mysql)
|
||||
}
|
||||
|
||||
|
||||
static int mysql_init_charset(MYSQL *mysql)
|
||||
{
|
||||
char charset_name_buff[16], *charset_name;
|
||||
|
||||
if ((charset_name=mysql->options.charset_name))
|
||||
{
|
||||
const char *save=charsets_dir;
|
||||
if (mysql->options.charset_dir)
|
||||
charsets_dir=mysql->options.charset_dir;
|
||||
mysql->charset=get_charset_by_name(mysql->options.charset_name,
|
||||
MYF(MY_WME));
|
||||
charsets_dir=save;
|
||||
}
|
||||
else if (mysql->server_language)
|
||||
{
|
||||
charset_name=charset_name_buff;
|
||||
sprintf(charset_name,"%d",mysql->server_language); /* In case of errors */
|
||||
mysql->charset=get_charset((uint8) mysql->server_language, MYF(MY_WME));
|
||||
}
|
||||
else
|
||||
mysql->charset=default_charset_info;
|
||||
|
||||
if (!mysql->charset)
|
||||
{
|
||||
mysql->net.last_errno=CR_CANT_READ_CHARSET;
|
||||
strmov(mysql->net.sqlstate, "HY0000");
|
||||
if (mysql->options.charset_dir)
|
||||
sprintf(mysql->net.last_error,ER(mysql->net.last_errno),
|
||||
charset_name ? charset_name : "unknown",
|
||||
mysql->options.charset_dir);
|
||||
else
|
||||
{
|
||||
char cs_dir_name[FN_REFLEN];
|
||||
get_charsets_dir(cs_dir_name);
|
||||
sprintf(mysql->net.last_error,ER(mysql->net.last_errno),
|
||||
charset_name ? charset_name : "unknown",
|
||||
cs_dir_name);
|
||||
}
|
||||
return mysql->net.last_errno;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mysql_init_character_set(MYSQL *mysql);
|
||||
|
||||
MYSQL * STDCALL
|
||||
mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
|
||||
@ -203,10 +161,10 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
|
||||
|
||||
init_embedded_mysql(mysql, client_flag, db_name);
|
||||
|
||||
if (check_embedded_connection(mysql))
|
||||
if (mysql_init_character_set(mysql))
|
||||
goto error;
|
||||
|
||||
if (mysql_init_charset(mysql))
|
||||
if (check_embedded_connection(mysql))
|
||||
goto error;
|
||||
|
||||
/* Send client information for access check */
|
||||
|
Reference in New Issue
Block a user