From 1ecb00f19fd55e6a97d5e3ea3b18039fa38d4af2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Thu, 14 Jan 2021 15:25:52 +0100 Subject: [PATCH] Do not search charset in mysql_real_connect if already set In mysql_init() charset is set to NULL . In mysql_read_connect() charset is not changed if already set This allows proxysql to change it outside the library --- deps/Makefile | 1 + .../mariadb_lib.c.collation.patch | 33 +++++++++++++++++++ lib/mysql_connection.cpp | 3 +- 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 deps/mariadb-client-library/mariadb_lib.c.collation.patch diff --git a/deps/Makefile b/deps/Makefile index 1ee2ca9a9..84a25efb9 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -158,6 +158,7 @@ mariadb-client-library/mariadb_client/libmariadb/libmariadbclient.a: libssl/open # cd mariadb-client-library/mariadb_client && cmake . -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl # this is needed on MacOSX cd mariadb-client-library/mariadb_client && patch libmariadb/mariadb_stmt.c < ../mariadb_stmt.c.patch cd mariadb-client-library/mariadb_client && patch libmariadb/mariadb_lib.c < ../mariadb_lib.c.patch + cd mariadb-client-library/mariadb_client && patch libmariadb/mariadb_lib.c < ../mariadb_lib.c.collation.patch # make sure this path is applied after mariadb_lib.c.patch # cd mariadb-client-library/mariadb_client && patch libmariadb/net.c < ../net.c.patch cd mariadb-client-library/mariadb_client && patch libmariadb/mariadb_async.c < ../mariadb_async.c.patch cd mariadb-client-library/mariadb_client && patch libmariadb/ma_password.c < ../ma_password.c.patch diff --git a/deps/mariadb-client-library/mariadb_lib.c.collation.patch b/deps/mariadb-client-library/mariadb_lib.c.collation.patch new file mode 100644 index 000000000..ecb41ff89 --- /dev/null +++ b/deps/mariadb-client-library/mariadb_lib.c.collation.patch @@ -0,0 +1,33 @@ +@@ -1017,7 +1017,10 @@ mysql_init(MYSQL *mysql) + goto error; + mysql->options.report_data_truncation= 1; + mysql->options.connect_timeout=CONNECT_TIMEOUT; +- mysql->charset= mysql_find_charset_name(MARIADB_DEFAULT_CHARSET); ++ // in proxysql we set mysql->charset to NULL during mysql_init() ++ // proxysql will explicitly set it a value if needed ++ mysql->charset = NULL; ++ //mysql->charset= mysql_find_charset_name(MARIADB_DEFAULT_CHARSET); + mysql->methods= &MARIADB_DEFAULT_METHODS; + strcpy(mysql->net.sqlstate, "00000"); + mysql->net.last_error[0]= mysql->net.last_errno= 0; +@@ -1497,11 +1500,15 @@ MYSQL *mthd_my_real_connect(MYSQL *mysql + } + } + +- /* Set character set */ +- if (mysql->options.charset_name) +- mysql->charset= mysql_find_charset_name(mysql->options.charset_name); +- else +- mysql->charset=mysql_find_charset_name(MARIADB_DEFAULT_CHARSET); ++ if (!mysql->charset) { // in proxysql we do not set charset during mysql_init ++ /* Set character set */ ++ if (mysql->options.charset_name) ++ mysql->charset= mysql_find_charset_name(mysql->options.charset_name); ++ else ++ mysql->charset=mysql_find_charset_name(MARIADB_DEFAULT_CHARSET); ++ } else { ++ // proxysql has explicitly set charset ++ } + + if (!mysql->charset) + { diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index a7446a5c0..0477f2c1a 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -696,7 +696,8 @@ void MySQL_Connection::connect_start() { mysql_variables.server_set_value(myds->sess, SQL_CHARACTER_SET_CONNECTION, ss.str().c_str()); mysql_variables.server_set_value(myds->sess, SQL_COLLATION_CONNECTION, ss.str().c_str()); } - mysql_options(mysql, MYSQL_SET_CHARSET_NAME, c->csname); + //mysql_options(mysql, MYSQL_SET_CHARSET_NAME, c->csname); + mysql->charset = c; unsigned long client_flags = 0; //if (mysql_thread___client_found_rows) // client_flags += CLIENT_FOUND_ROWS;