diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index 75cf3836a..01c851beb 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -8,6 +8,29 @@ extern Query_Processor *GloQPro; extern MySQL_Threads_Handler *GloMTH; +const CHARSET_INFO * proxysql_find_charset_nr(unsigned int nr) { + const CHARSET_INFO * c = compiled_charsets; + do { + if (c->nr == nr) { + return c; + } + ++c; + } while (c[0].nr != 0); + return NULL; +} + +CHARSET_INFO * proxysql_find_charset_name(const char *name) { + CHARSET_INFO *c = (CHARSET_INFO *)compiled_charsets; + do { + if (!strcasecmp(c->csname, name)) { + return c; + } + ++c; + } while (c[0].nr != 0); + return NULL; +} + + #ifdef __cplusplus extern "C" { @@ -395,8 +418,12 @@ char * MySQL_Threads_Handler::get_variable(char *name) { // this is the public f } } if (!strcasecmp(name,"default_charset")) { - sprintf(intbuf,"%d",variables.default_charset); - return strdup(intbuf); + const CHARSET_INFO *c = proxysql_find_charset_nr(variables.default_charset); + if (!c) { + proxy_error("Not existing charset number %u\n"); + assert(c); + } + return strdup(c->csname); } if (!strcasecmp(name,"connect_retries_on_failure")) { sprintf(intbuf,"%d",variables.connect_retries_on_failure); @@ -775,10 +802,14 @@ bool MySQL_Threads_Handler::set_variable(char *name, char *value) { // this is t } } if (!strcasecmp(name,"default_charset")) { - int intv=atoi(value); - if (intv > 0 && intv < 256) { - variables.default_charset=intv; - return true; + if (vallen) { + CHARSET_INFO * c=proxysql_find_charset_name(value); + if (c) { + variables.default_charset=c->nr; + return true; + } else { + return false; + } } else { return false; }