From 056366ea6b8c8b848c74577e12f25b568769cb00 Mon Sep 17 00:00:00 2001 From: val Date: Fri, 10 Apr 2020 06:19:31 +0000 Subject: [PATCH] do not set variables on connect --- lib/MySQL_Thread.cpp | 30 ------------------------------ lib/MySQL_Variables.cpp | 5 ++++- lib/mysql_connection.cpp | 20 +++++++++++++++----- 3 files changed, 19 insertions(+), 36 deletions(-) diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index 750ba8002..3610075ee 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -3331,36 +3331,6 @@ MySQL_Session * MySQL_Thread::create_new_session_and_client_data_stream(int _fd) } sess->client_myds->myconn->options.session_track_gtids=strdup(mysql_thread___default_session_track_gtids); - for (int i=0; inr; - mysql_variables.client_set_value(sess, i, ss.str()); - } else if (i == SQL_COLLATION_CONNECTION) { - const MARIADB_CHARSET_INFO *ci = NULL; - ci = proxysql_find_charset_collate(mysql_thread___default_variables[i]); - if (!ci) { - proxy_error("Cannot find character set for name [%s]. Configuration error. Check [%s] global variable. Using character set 33.\n", - mysql_thread___default_variables[SQL_COLLATION_CONNECTION], mysql_tracked_variables[SQL_COLLATION_CONNECTION].internal_variable_name); - assert(0); - } - std::stringstream ss; - ss << ci->nr; - mysql_variables.client_set_value(sess, i, ss.str()); - } else { - mysql_variables.client_set_value(sess, i, mysql_thread___default_variables[i]); - } - } - return sess; } diff --git a/lib/MySQL_Variables.cpp b/lib/MySQL_Variables.cpp index 3955b8176..0cd402ea8 100644 --- a/lib/MySQL_Variables.cpp +++ b/lib/MySQL_Variables.cpp @@ -343,6 +343,9 @@ bool update_server_variable(MySQL_Session* session, int idx, int &_rc) { bool verify_set_names(MySQL_Session* session) { uint32_t client_charset_hash = mysql_variables.client_get_hash(session, SQL_CHARACTER_SET_CLIENT); + if (client_charset_hash == 0) + return false; + uint32_t results_charset_hash = mysql_variables.client_get_hash(session, SQL_CHARACTER_SET_RESULTS); if (client_charset_hash != results_charset_hash) return false; @@ -391,7 +394,7 @@ bool verify_set_names(MySQL_Session* session) { } inline bool verify_server_variable(MySQL_Session* session, int idx, uint32_t client_hash, uint32_t server_hash) { - if (client_hash != server_hash) { + if (client_hash && client_hash != server_hash) { // Edge case for set charset command, because we do not know database character set // for now we are setting connection and collation to empty if (idx == SQL_CHARACTER_SET_CONNECTION || idx == SQL_COLLATION_CONNECTION ) { diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 8ca3c6b5f..bdb917dd6 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -48,8 +48,9 @@ void Variable::fill_server_internal_session(json &j, int conn_num, int idx) { j["backends"][conn_num]["conn"][mysql_tracked_variables[idx].internal_variable_name] = std::string((ci && ci->name)?ci->name:""); } else if (idx == SQL_LOG_BIN) { if (!value) - value = mysql_tracked_variables[idx].default_value; - j["backends"][conn_num]["conn"][mysql_tracked_variables[idx].internal_variable_name] = std::string(!strcmp("1",value)?"ON":"OFF"); + j["backends"][conn_num]["conn"][mysql_tracked_variables[idx].internal_variable_name] = mysql_tracked_variables[idx].default_value; + else + j["backends"][conn_num]["conn"][mysql_tracked_variables[idx].internal_variable_name] = std::string(!strcmp("1",value)?"ON":"OFF"); } else { j["backends"][conn_num]["conn"][mysql_tracked_variables[idx].internal_variable_name] = std::string(value?value:""); } @@ -58,7 +59,10 @@ void Variable::fill_server_internal_session(json &j, int conn_num, int idx) { void Variable::fill_client_internal_session(json &j, int idx) { if (idx == SQL_CHARACTER_SET_RESULTS || idx == SQL_CHARACTER_SET_CLIENT || idx == SQL_CHARACTER_SET_DATABASE) { const MARIADB_CHARSET_INFO *ci = NULL; - ci = proxysql_find_charset_nr(atoi(value)); + if (!value) + ci = proxysql_find_charset_name(mysql_tracked_variables[idx].default_value); + else + ci = proxysql_find_charset_nr(atoi(value)); if (!ci) { if (idx == SQL_CHARACTER_SET_RESULTS && (!strcasecmp("NULL", value) || !strcasecmp("binary", value))) { j["conn"][mysql_tracked_variables[idx].internal_variable_name] = (ci && ci->csname)?ci->csname:""; @@ -77,10 +81,16 @@ void Variable::fill_client_internal_session(json &j, int idx) { j["conn"][mysql_tracked_variables[idx].internal_variable_name] = (ci && ci->csname)?ci->csname:""; } else if (idx == SQL_COLLATION_CONNECTION) { const MARIADB_CHARSET_INFO *ci = NULL; - ci = proxysql_find_charset_nr(atoi(value)); + if (!value) + ci = proxysql_find_charset_collate(mysql_tracked_variables[idx].default_value); + else + ci = proxysql_find_charset_nr(atoi(value)); j["conn"][mysql_tracked_variables[idx].internal_variable_name] = (ci && ci->name)?ci->name:""; } else if (idx == SQL_LOG_BIN) { - j["conn"][mysql_tracked_variables[idx].internal_variable_name] = !strcmp("1", value)?"ON":"OFF"; + if (!value) + j["conn"][mysql_tracked_variables[idx].internal_variable_name] = mysql_tracked_variables[idx].default_value; + else + j["conn"][mysql_tracked_variables[idx].internal_variable_name] = !strcmp("1", value)?"ON":"OFF"; } else { j["conn"][mysql_tracked_variables[idx].internal_variable_name] = value?value:""; }