From 91f518d61ae2680e55708ddea3b7f7c4d1e53d12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sat, 17 Aug 2019 20:37:53 +1000 Subject: [PATCH 01/14] Drafting tracking of various variables: - character_set_results - isolation level - session_track_gtids --- include/MySQL_Thread.h | 6 +++++ include/mysql_connection.h | 9 +++++++ include/proxysql_structs.h | 6 +++++ lib/MySQL_Thread.cpp | 54 ++++++++++++++++++++++++++++++++++++++ lib/mysql_connection.cpp | 27 +++++++++++++++++++ 5 files changed, 102 insertions(+) diff --git a/include/MySQL_Thread.h b/include/MySQL_Thread.h index 9a37ff755..83e9e52ec 100644 --- a/include/MySQL_Thread.h +++ b/include/MySQL_Thread.h @@ -19,6 +19,9 @@ #define MYSQL_DEFAULT_SQL_MODE "" #define MYSQL_DEFAULT_TIME_ZONE "SYSTEM" +#define MYSQL_DEFAULT_ISOLATION_LEVEL "" +#define MYSQL_DEFAULT_CHARACTER_SET_RESULTS "" +#define MYSQL_DEFAULT_SESSION_TRACK_GTIDS "" static unsigned int near_pow_2 (unsigned int n) { unsigned int i = 1; @@ -441,6 +444,9 @@ class MySQL_Threads_Handler char *add_ldap_user_comment; char *default_sql_mode; char *default_time_zone; + char *default_isolation_level; + char *default_character_set_results; + char *default_session_track_gtids; #ifdef DEBUG bool session_debug; #endif /* DEBUG */ diff --git a/include/mysql_connection.h b/include/mysql_connection.h index 336fc6774..737be497a 100644 --- a/include/mysql_connection.h +++ b/include/mysql_connection.h @@ -44,12 +44,21 @@ class MySQL_Connection { char *time_zone; uint32_t sql_mode_int; uint32_t time_zone_int; + uint32_t character_set_results_int; + uint32_t session_track_gtids_int; + uint32_t isolation_level_int; uint32_t max_allowed_pkt; uint32_t server_capabilities; uint32_t client_flag; unsigned int compression_min_length; char *init_connect; bool init_connect_sent; + char * character_set_results; + char * session_track_gtids; + char * isolation_level; + bool character_set_results_sent; + bool session_track_gtids_sent; + bool isolation_level_sent; bool sql_mode_sent; char *ldap_user_variable; char *ldap_user_variable_value; diff --git a/include/proxysql_structs.h b/include/proxysql_structs.h index b61da5c1b..10e59034d 100644 --- a/include/proxysql_structs.h +++ b/include/proxysql_structs.h @@ -612,6 +612,9 @@ __thread char *mysql_thread___init_connect; __thread char *mysql_thread___ldap_user_variable; __thread char *mysql_thread___default_sql_mode; __thread char *mysql_thread___default_time_zone; +__thread char *mysql_thread___default_isolation_level; +__thread char *mysql_thread___default_character_set_results; +__thread char *mysql_thread___default_session_track_gtids; __thread int mysql_thread___max_allowed_packet; __thread int mysql_thread___throttle_connections_per_sec_to_hostgroup; __thread int mysql_thread___max_transaction_time; @@ -746,6 +749,9 @@ extern __thread char *mysql_thread___init_connect; extern __thread char *mysql_thread___ldap_user_variable; extern __thread char *mysql_thread___default_sql_mode; extern __thread char *mysql_thread___default_time_zone; +extern __thread char *mysql_thread___default_isolation_level; +extern __thread char *mysql_thread___default_character_set_results; +extern __thread char *mysql_thread___default_session_track_gtids; extern __thread int mysql_thread___max_allowed_packet; extern __thread int mysql_thread___throttle_connections_per_sec_to_hostgroup; extern __thread int mysql_thread___max_transaction_time; diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index 208b40b62..922d78dc9 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -331,6 +331,9 @@ static char * mysql_thread_variables_names[]= { (char *)"add_ldap_user_comment", (char *)"default_sql_mode", (char *)"default_time_zone", + (char *)"default_isolation_level", + (char *)"default_character_set_results", + (char *)"default_session_track_gtids", (char *)"connpoll_reset_queue_length", (char *)"min_num_servers_lantency_awareness", (char *)"stats_time_backend_query", @@ -428,6 +431,9 @@ MySQL_Threads_Handler::MySQL_Threads_Handler() { variables.add_ldap_user_comment=NULL; variables.default_sql_mode=strdup((char *)MYSQL_DEFAULT_SQL_MODE); variables.default_time_zone=strdup((char *)MYSQL_DEFAULT_TIME_ZONE); + variables.default_isolation_level=strdup((char *)MYSQL_DEFAULT_ISOLATION_LEVEL); + variables.default_character_set_results=strdup((char *)MYSQL_DEFAULT_CHARACTER_SET_RESULTS); + variables.default_session_track_gtids=strdup((char *)MYSQL_DEFAULT_SESSION_TRACK_GTIDS); variables.ping_interval_server_msec=10000; variables.ping_timeout_server=200; variables.default_schema=strdup((char *)"information_schema"); @@ -630,6 +636,24 @@ char * MySQL_Threads_Handler::get_variable_string(char *name) { } return strdup(variables.default_time_zone); } + if (!strcmp(name,"default_isolation_level")) { + if (variables.default_isolation_level==NULL) { + variables.default_isolation_level=strdup((char *)MYSQL_DEFAULT_ISOLATION_LEVEL); + } + return strdup(variables.default_isolation_level); + } + if (!strcmp(name,"default_character_set_results")) { + if (variables.default_character_set_results==NULL) { + variables.default_character_set_results=strdup((char *)MYSQL_DEFAULT_CHARACTER_SET_RESULTS); + } + return strdup(variables.default_character_set_results); + } + if (!strcmp(name,"default_session_track_gtids")) { + if (variables.default_session_track_gtids==NULL) { + variables.default_session_track_gtids=strdup((char *)MYSQL_DEFAULT_SESSION_TRACK_GTIDS); + } + return strdup(variables.default_session_track_gtids); + } if (!strcmp(name,"server_version")) return strdup(variables.server_version); if (!strcmp(name,"eventslog_filename")) return strdup(variables.eventslog_filename); if (!strcmp(name,"auditlog_filename")) return strdup(variables.auditlog_filename); @@ -867,6 +891,24 @@ char * MySQL_Threads_Handler::get_variable(char *name) { // this is the public f } return strdup(variables.default_time_zone); } + if (!strcasecmp(name,"default_isolation_level")) { + if (variables.default_isolation_level==NULL) { + variables.default_isolation_level=strdup((char *)MYSQL_DEFAULT_ISOLATION_LEVEL); + } + return strdup(variables.default_isolation_level); + } + if (!strcasecmp(name,"default_character_set_results")) { + if (variables.default_character_set_results==NULL) { + variables.default_character_set_results=strdup((char *)MYSQL_DEFAULT_CHARACTER_SET_RESULTS); + } + return strdup(variables.default_character_set_results); + } + if (!strcasecmp(name,"default_session_track_gtids")) { + if (variables.default_session_track_gtids==NULL) { + variables.default_session_track_gtids=strdup((char *)MYSQL_DEFAULT_SESSION_TRACK_GTIDS); + } + return strdup(variables.default_session_track_gtids); + } if (!strcasecmp(name,"server_version")) return strdup(variables.server_version); if (!strcasecmp(name,"auditlog_filename")) return strdup(variables.auditlog_filename); if (!strcasecmp(name,"eventslog_filename")) return strdup(variables.eventslog_filename); @@ -2714,6 +2756,9 @@ MySQL_Threads_Handler::~MySQL_Threads_Handler() { if (variables.add_ldap_user_comment) free(variables.add_ldap_user_comment); if (variables.default_sql_mode) free(variables.default_sql_mode); if (variables.default_time_zone) free(variables.default_time_zone); + if (variables.default_isolation_level) free(variables.default_isolation_level); + if (variables.default_character_set_results) free(variables.default_character_set_results); + if (variables.default_session_track_gtids) free(variables.default_session_track_gtids); if (variables.eventslog_filename) free(variables.eventslog_filename); if (variables.auditlog_filename) free(variables.auditlog_filename); if (variables.ssl_p2s_ca) free(variables.ssl_p2s_ca); @@ -2834,6 +2879,9 @@ MySQL_Thread::~MySQL_Thread() { if (mysql_thread___add_ldap_user_comment) { free(mysql_thread___add_ldap_user_comment); mysql_thread___add_ldap_user_comment=NULL; } if (mysql_thread___default_sql_mode) { free(mysql_thread___default_sql_mode); mysql_thread___default_sql_mode=NULL; } if (mysql_thread___default_time_zone) { free(mysql_thread___default_time_zone); mysql_thread___default_time_zone=NULL; } + if (mysql_thread___default_isolation_level) { free(mysql_thread___default_isolation_level); mysql_thread___default_isolation_level=NULL; } + if (mysql_thread___default_character_set_results) { free(mysql_thread___default_character_set_results); mysql_thread___default_character_set_results=NULL; } + if (mysql_thread___default_session_track_gtids) { free(mysql_thread___default_session_track_gtids); mysql_thread___default_session_track_gtids=NULL; } if (mysql_thread___eventslog_filename) { free(mysql_thread___eventslog_filename); mysql_thread___eventslog_filename=NULL; } if (mysql_thread___auditlog_filename) { free(mysql_thread___auditlog_filename); mysql_thread___auditlog_filename=NULL; } if (mysql_thread___ssl_p2s_ca) { free(mysql_thread___ssl_p2s_ca); mysql_thread___ssl_p2s_ca=NULL; } @@ -3946,6 +3994,12 @@ void MySQL_Thread::refresh_variables() { mysql_thread___default_sql_mode=GloMTH->get_variable_string((char *)"default_sql_mode"); if (mysql_thread___default_time_zone) free(mysql_thread___default_time_zone); mysql_thread___default_time_zone=GloMTH->get_variable_string((char *)"default_time_zone"); + if (mysql_thread___default_isolation_level) free(mysql_thread___default_isolation_level); + mysql_thread___default_isolation_level=GloMTH->get_variable_string((char *)"default_isolation_level"); + if (mysql_thread___default_character_set_results) free(mysql_thread___default_character_set_results); + mysql_thread___default_character_set_results=GloMTH->get_variable_string((char *)"default_character_set_results"); + if (mysql_thread___default_session_track_gtids) free(mysql_thread___default_session_track_gtids); + mysql_thread___default_session_track_gtids=GloMTH->get_variable_string((char *)"default_session_track_gtids"); if (mysql_thread___server_version) free(mysql_thread___server_version); mysql_thread___server_version=GloMTH->get_variable_string((char *)"server_version"); if (mysql_thread___eventslog_filename) free(mysql_thread___eventslog_filename); diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 61cc16f94..36b50d413 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -206,6 +206,12 @@ MySQL_Connection::MySQL_Connection() { options.no_backslash_escapes=false; options.init_connect=NULL; options.init_connect_sent=false; + options.character_set_results = NULL; + options.session_track_gtids = NULL; + options.isolation_level = NULL; + options.character_set_results_sent = false; + options.session_track_gtids_sent = false; + options.isolation_level_sent = false; options.sql_mode_sent=false; options.ldap_user_variable=NULL; options.ldap_user_variable_value=NULL; @@ -244,6 +250,9 @@ MySQL_Connection::~MySQL_Connection() { proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Destroying MySQL_Connection %p\n", this); if (options.server_version) free(options.server_version); if (options.init_connect) free(options.init_connect); + if (options.character_set_results) free(options.character_set_results); + if (options.session_track_gtids) free(options.session_track_gtids); + if (options.isolation_level) free(options.isolation_level); if (options.ldap_user_variable) free(options.ldap_user_variable); if (options.ldap_user_variable_value) free(options.ldap_user_variable_value); if (userinfo) { @@ -1997,6 +2006,24 @@ void MySQL_Connection::reset() { delete local_stmts; local_stmts=new MySQL_STMTs_local_v14(false); creation_time = monotonic_time(); + options.isolation_level_int = 0; + if (options.isolation_level) { + free (options.isolation_level); + options.isolation_level = NULL; + options.isolation_level_sent = false; + } + options.character_set_results_int = 0; + if (options.character_set_results) { + free (options.character_set_results); + options.character_set_results = NULL; + options.character_set_results_sent = false; + } + options.session_track_gtids_int = 0; + if (options.session_track_gtids) { + free (options.session_track_gtids); + options.session_track_gtids = NULL; + options.session_track_gtids_sent = false; + } if (options.init_connect) { free(options.init_connect); options.init_connect = NULL; From a1f39bf784dbbb6facd8abef44aa7626bdf41585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sat, 17 Aug 2019 22:56:43 +1000 Subject: [PATCH 02/14] 2nd drafting tracking of various variables --- include/MySQL_Session.h | 3 + include/proxysql_structs.h | 3 + lib/MySQL_Session.cpp | 128 +++++++++++++++++++++++++++++++++++++ lib/MySQL_Thread.cpp | 61 ++++++++++++++++++ 4 files changed, 195 insertions(+) diff --git a/include/MySQL_Session.h b/include/MySQL_Session.h index 4d3b4e146..073a60fbe 100644 --- a/include/MySQL_Session.h +++ b/include/MySQL_Session.h @@ -114,6 +114,9 @@ class MySQL_Session bool handler_again___verify_backend_sql_log_bin(); bool handler_again___verify_backend_sql_mode(); bool handler_again___verify_backend_time_zone(); + bool handler_again___verify_backend_isolation_level(); + bool handler_again___verify_backend_character_set_results(); + bool handler_again___verify_backend_session_track_gtids(); bool handler_again___status_SETTING_INIT_CONNECT(int *); bool handler_again___status_SETTING_LDAP_USER_VARIABLE(int *); bool handler_again___status_SETTING_SQL_LOG_BIN(int *); diff --git a/include/proxysql_structs.h b/include/proxysql_structs.h index 10e59034d..8c77bfa96 100644 --- a/include/proxysql_structs.h +++ b/include/proxysql_structs.h @@ -152,6 +152,9 @@ enum session_status { SETTING_SQL_LOG_BIN, SETTING_SQL_MODE, SETTING_TIME_ZONE, + SETTING_ISOLATION_LEVEL, + SETTING_CHARACTER_SET_RESULTS, + SETTING_SESSION_TRACK_GTIDS, FAST_FORWARD, PROCESSING_STMT_PREPARE, PROCESSING_STMT_EXECUTE, diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 790c0cf3d..c365d73b4 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -1649,6 +1649,134 @@ bool MySQL_Session::handler_again___verify_backend_time_zone() { return false; } +bool MySQL_Session::handler_again___verify_backend_isolation_level() { + if (mybe->server_myds->myconn->options.isolation_level_int==0) { + // it is the first time we use this backend. Set isolation_level to default + if (mybe->server_myds->myconn->options.isolation_level) { + free(mybe->server_myds->myconn->options.isolation_level); + mybe->server_myds->myconn->options.isolation_level=NULL; + } + mybe->server_myds->myconn->options.isolation_level=strdup(mysql_thread___default_isolation_level); + uint32_t isolation_level_int=SpookyHash::Hash32(mybe->server_myds->myconn->options.isolation_level,strlen(mybe->server_myds->myconn->options.isolation_level),10); + mybe->server_myds->myconn->options.isolation_level_int=isolation_level_int; + } + if (client_myds->myconn->options.isolation_level_int) { + if (client_myds->myconn->options.isolation_level_int != mybe->server_myds->myconn->options.isolation_level_int) { + { + mybe->server_myds->myconn->options.isolation_level_int = client_myds->myconn->options.isolation_level_int; + if (mybe->server_myds->myconn->options.isolation_level) { + free(mybe->server_myds->myconn->options.isolation_level); + mybe->server_myds->myconn->options.isolation_level=NULL; + if (client_myds->myconn->options.isolation_level) { + mybe->server_myds->myconn->options.isolation_level=strdup(client_myds->myconn->options.isolation_level); + } + } + } + switch(status) { // this switch can be replaced with a simple previous_status.push(status), but it is here for readibility + case PROCESSING_QUERY: + previous_status.push(PROCESSING_QUERY); + break; + case PROCESSING_STMT_PREPARE: + previous_status.push(PROCESSING_STMT_PREPARE); + break; + case PROCESSING_STMT_EXECUTE: + previous_status.push(PROCESSING_STMT_EXECUTE); + break; + default: + assert(0); + break; + } + NEXT_IMMEDIATE_NEW(SETTING_ISOLATION_LEVEL); + } + } + return false; +} + +bool MySQL_Session::handler_again___verify_backend_character_set_results() { + if (mybe->server_myds->myconn->options.character_set_results_int==0) { + // it is the first time we use this backend. Set character_set_results to default + if (mybe->server_myds->myconn->options.character_set_results) { + free(mybe->server_myds->myconn->options.character_set_results); + mybe->server_myds->myconn->options.character_set_results=NULL; + } + mybe->server_myds->myconn->options.character_set_results=strdup(mysql_thread___default_character_set_results); + uint32_t character_set_results_int=SpookyHash::Hash32(mybe->server_myds->myconn->options.character_set_results,strlen(mybe->server_myds->myconn->options.character_set_results),10); + mybe->server_myds->myconn->options.character_set_results_int=character_set_results_int; + } + if (client_myds->myconn->options.character_set_results_int) { + if (client_myds->myconn->options.character_set_results_int != mybe->server_myds->myconn->options.character_set_results_int) { + { + mybe->server_myds->myconn->options.character_set_results_int = client_myds->myconn->options.character_set_results_int; + if (mybe->server_myds->myconn->options.character_set_results) { + free(mybe->server_myds->myconn->options.character_set_results); + mybe->server_myds->myconn->options.character_set_results=NULL; + if (client_myds->myconn->options.character_set_results) { + mybe->server_myds->myconn->options.character_set_results=strdup(client_myds->myconn->options.character_set_results); + } + } + } + switch(status) { // this switch can be replaced with a simple previous_status.push(status), but it is here for readibility + case PROCESSING_QUERY: + previous_status.push(PROCESSING_QUERY); + break; + case PROCESSING_STMT_PREPARE: + previous_status.push(PROCESSING_STMT_PREPARE); + break; + case PROCESSING_STMT_EXECUTE: + previous_status.push(PROCESSING_STMT_EXECUTE); + break; + default: + assert(0); + break; + } + NEXT_IMMEDIATE_NEW(SETTING_CHARACTER_SET_RESULTS); + } + } + return false; +} + +bool MySQL_Session::handler_again___verify_backend_session_track_gtids() { + if (mybe->server_myds->myconn->options.session_track_gtids_int==0) { + // it is the first time we use this backend. Set session_track_gtids to default + if (mybe->server_myds->myconn->options.session_track_gtids) { + free(mybe->server_myds->myconn->options.session_track_gtids); + mybe->server_myds->myconn->options.session_track_gtids=NULL; + } + mybe->server_myds->myconn->options.session_track_gtids=strdup(mysql_thread___default_session_track_gtids); + uint32_t session_track_gtids_int=SpookyHash::Hash32(mybe->server_myds->myconn->options.session_track_gtids,strlen(mybe->server_myds->myconn->options.session_track_gtids),10); + mybe->server_myds->myconn->options.session_track_gtids_int=session_track_gtids_int; + } + if (client_myds->myconn->options.session_track_gtids_int) { + if (client_myds->myconn->options.session_track_gtids_int != mybe->server_myds->myconn->options.session_track_gtids_int) { + { + mybe->server_myds->myconn->options.session_track_gtids_int = client_myds->myconn->options.session_track_gtids_int; + if (mybe->server_myds->myconn->options.session_track_gtids) { + free(mybe->server_myds->myconn->options.session_track_gtids); + mybe->server_myds->myconn->options.session_track_gtids=NULL; + if (client_myds->myconn->options.session_track_gtids) { + mybe->server_myds->myconn->options.session_track_gtids=strdup(client_myds->myconn->options.session_track_gtids); + } + } + } + switch(status) { // this switch can be replaced with a simple previous_status.push(status), but it is here for readibility + case PROCESSING_QUERY: + previous_status.push(PROCESSING_QUERY); + break; + case PROCESSING_STMT_PREPARE: + previous_status.push(PROCESSING_STMT_PREPARE); + break; + case PROCESSING_STMT_EXECUTE: + previous_status.push(PROCESSING_STMT_EXECUTE); + break; + default: + assert(0); + break; + } + NEXT_IMMEDIATE_NEW(SETTING_SESSION_TRACK_GTIDS); + } + } + return false; +} bool MySQL_Session::handler_again___verify_init_connect() { if (mybe->server_myds->myconn->options.init_connect_sent==false) { diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index 922d78dc9..9cd64b7c4 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -2146,6 +2146,45 @@ bool MySQL_Threads_Handler::set_variable(char *name, char *value) { // this is t return true; } + if (!strcasecmp(name,"default_isolation_level")) { + if (variables.default_isolation_level) free(variables.default_isolation_level); + variables.default_isolation_level=NULL; + if (vallen) { + if (strcmp(value,"(null)")) + variables.default_isolation_level=strdup(value); + } + if (variables.default_isolation_level==NULL) { + variables.default_isolation_level=strdup((char *)MYSQL_DEFAULT_ISOLATION_LEVEL); // default + } + return true; + } + + if (!strcasecmp(name,"default_character_set_results")) { + if (variables.default_character_set_results) free(variables.default_character_set_results); + variables.default_character_set_results=NULL; + if (vallen) { + if (strcmp(value,"(null)")) + variables.default_character_set_results=strdup(value); + } + if (variables.default_character_set_results==NULL) { + variables.default_character_set_results=strdup((char *)MYSQL_DEFAULT_CHARACTER_SET_RESULTS); // default + } + return true; + } + + if (!strcasecmp(name,"default_session_track_gtids")) { + if (variables.default_session_track_gtids) free(variables.default_session_track_gtids); + variables.default_session_track_gtids=NULL; + if (vallen) { + if (strcmp(value,"(null)")) + variables.default_session_track_gtids=strdup(value); + } + if (variables.default_session_track_gtids==NULL) { + variables.default_session_track_gtids=strdup((char *)MYSQL_DEFAULT_SESSION_TRACK_GTIDS); // default + } + return true; + } + if (!strcasecmp(name,"keep_multiplexing_variables")) { if (vallen) { free(variables.keep_multiplexing_variables); @@ -2935,6 +2974,28 @@ MySQL_Session * MySQL_Thread::create_new_session_and_client_data_stream(int _fd) free(sess->client_myds->myconn->options.time_zone); } sess->client_myds->myconn->options.time_zone=strdup(mysql_thread___default_time_zone); + + uint32_t isolation_level_int=SpookyHash::Hash32(mysql_thread___default_isolation_level,strlen(mysql_thread___default_isolation_level),10); + sess->client_myds->myconn->options.isolation_level_int = isolation_level_int; + if (sess->client_myds->myconn->options.isolation_level) { + free(sess->client_myds->myconn->options.isolation_level); + } + sess->client_myds->myconn->options.isolation_level=strdup(mysql_thread___default_isolation_level); + + uint32_t character_set_results_int=SpookyHash::Hash32(mysql_thread___default_character_set_results,strlen(mysql_thread___default_character_set_results),10); + sess->client_myds->myconn->options.character_set_results_int = character_set_results_int; + if (sess->client_myds->myconn->options.character_set_results) { + free(sess->client_myds->myconn->options.character_set_results); + } + sess->client_myds->myconn->options.character_set_results=strdup(mysql_thread___default_character_set_results); + + uint32_t session_track_gtids_int=SpookyHash::Hash32(mysql_thread___default_session_track_gtids,strlen(mysql_thread___default_session_track_gtids),10); + sess->client_myds->myconn->options.session_track_gtids_int = session_track_gtids_int; + if (sess->client_myds->myconn->options.session_track_gtids) { + free(sess->client_myds->myconn->options.session_track_gtids); + } + sess->client_myds->myconn->options.session_track_gtids=strdup(mysql_thread___default_session_track_gtids); + return sess; } From 57e04c63e9ee797fc4c270f98d14505f090f40c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sun, 18 Aug 2019 19:38:37 +1000 Subject: [PATCH 03/14] Adding generic functions for tracking variables Mostly code cleanup --- include/MySQL_Session.h | 2 + lib/MySQL_Session.cpp | 287 ++++++++++++++-------------------------- 2 files changed, 101 insertions(+), 188 deletions(-) diff --git a/include/MySQL_Session.h b/include/MySQL_Session.h index 073a60fbe..5c1d5e1b3 100644 --- a/include/MySQL_Session.h +++ b/include/MySQL_Session.h @@ -117,11 +117,13 @@ class MySQL_Session bool handler_again___verify_backend_isolation_level(); bool handler_again___verify_backend_character_set_results(); bool handler_again___verify_backend_session_track_gtids(); + bool handler_again___verify_backend__generic_variable(uint32_t *be_int, char **be_var, char *def, uint32_t *fe_int, char *fe_var, enum session_status next_sess_status); bool handler_again___status_SETTING_INIT_CONNECT(int *); bool handler_again___status_SETTING_LDAP_USER_VARIABLE(int *); bool handler_again___status_SETTING_SQL_LOG_BIN(int *); bool handler_again___status_SETTING_SQL_MODE(int *); bool handler_again___status_SETTING_TIME_ZONE(int *); + bool handler_again___status_SETTING_GENERIC_VARIABLE(int *, char *, char *); bool handler_again___status_CHANGING_SCHEMA(int *); bool handler_again___status_CONNECTING_SERVER(int *); bool handler_again___status_CHANGING_USER_SERVER(int *); diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index c365d73b4..abbc03e2f 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -1559,116 +1559,67 @@ bool MySQL_Session::handler_again___verify_backend_sql_log_bin() { } bool MySQL_Session::handler_again___verify_backend_sql_mode() { - if (mybe->server_myds->myconn->options.sql_mode_int==0) { - // it is the first time we use this backend. Set sql_mode to default - if (mybe->server_myds->myconn->options.sql_mode) { - free(mybe->server_myds->myconn->options.sql_mode); - mybe->server_myds->myconn->options.sql_mode=NULL; - } - mybe->server_myds->myconn->options.sql_mode=strdup(mysql_thread___default_sql_mode); - uint32_t sql_mode_int=SpookyHash::Hash32(mybe->server_myds->myconn->options.sql_mode,strlen(mybe->server_myds->myconn->options.sql_mode),10); - mybe->server_myds->myconn->options.sql_mode_int=sql_mode_int; - } - if (client_myds->myconn->options.sql_mode_int) { + bool ret = false; + ret = handler_again___verify_backend__generic_variable( + &mybe->server_myds->myconn->options.sql_mode_int, + &mybe->server_myds->myconn->options.sql_mode, + mysql_thread___default_sql_mode, + &client_myds->myconn->options.sql_mode_int, + client_myds->myconn->options.sql_mode, + SETTING_SQL_MODE + ); + return ret; +/* + // for sql_mode we also set sql_mode_sent . Doesn't seem used tho. + // snippet, for reference if ( (client_myds->myconn->options.sql_mode_int != mybe->server_myds->myconn->options.sql_mode_int) || (mybe->server_myds->myconn->options.sql_mode_sent == false) ) { mybe->server_myds->myconn->options.sql_mode_sent = true; - { - mybe->server_myds->myconn->options.sql_mode_int = client_myds->myconn->options.sql_mode_int; - if (mybe->server_myds->myconn->options.sql_mode) { - free(mybe->server_myds->myconn->options.sql_mode); - mybe->server_myds->myconn->options.sql_mode=NULL; - if (client_myds->myconn->options.sql_mode) { - mybe->server_myds->myconn->options.sql_mode=strdup(client_myds->myconn->options.sql_mode); - } - } - } - switch(status) { // this switch can be replaced with a simple previous_status.push(status), but it is here for readibility - case PROCESSING_QUERY: - previous_status.push(PROCESSING_QUERY); - break; - case PROCESSING_STMT_PREPARE: - previous_status.push(PROCESSING_STMT_PREPARE); - break; - case PROCESSING_STMT_EXECUTE: - previous_status.push(PROCESSING_STMT_EXECUTE); - break; - default: - assert(0); - break; - } - NEXT_IMMEDIATE_NEW(SETTING_SQL_MODE); - } - } - return false; +*/ + } bool MySQL_Session::handler_again___verify_backend_time_zone() { - if (mybe->server_myds->myconn->options.time_zone_int==0) { - // it is the first time we use this backend. Set time_zone to default - if (mybe->server_myds->myconn->options.time_zone) { - free(mybe->server_myds->myconn->options.time_zone); - mybe->server_myds->myconn->options.time_zone=NULL; - } - mybe->server_myds->myconn->options.time_zone=strdup(mysql_thread___default_time_zone); - uint32_t time_zone_int=SpookyHash::Hash32(mybe->server_myds->myconn->options.time_zone,strlen(mybe->server_myds->myconn->options.time_zone),10); - mybe->server_myds->myconn->options.time_zone_int=time_zone_int; - } - if (client_myds->myconn->options.time_zone_int) { - if (client_myds->myconn->options.time_zone_int != mybe->server_myds->myconn->options.time_zone_int) { - { - mybe->server_myds->myconn->options.time_zone_int = client_myds->myconn->options.time_zone_int; - if (mybe->server_myds->myconn->options.time_zone) { - free(mybe->server_myds->myconn->options.time_zone); - mybe->server_myds->myconn->options.time_zone=NULL; - if (client_myds->myconn->options.time_zone) { - mybe->server_myds->myconn->options.time_zone=strdup(client_myds->myconn->options.time_zone); - } - } - } - switch(status) { // this switch can be replaced with a simple previous_status.push(status), but it is here for readibility - case PROCESSING_QUERY: - previous_status.push(PROCESSING_QUERY); - break; - case PROCESSING_STMT_PREPARE: - previous_status.push(PROCESSING_STMT_PREPARE); - break; - case PROCESSING_STMT_EXECUTE: - previous_status.push(PROCESSING_STMT_EXECUTE); - break; - default: - assert(0); - break; - } - NEXT_IMMEDIATE_NEW(SETTING_TIME_ZONE); - } - } - return false; + bool ret = false; + ret = handler_again___verify_backend__generic_variable( + &mybe->server_myds->myconn->options.time_zone_int, + &mybe->server_myds->myconn->options.time_zone, + mysql_thread___default_time_zone, + &client_myds->myconn->options.time_zone_int, + client_myds->myconn->options.time_zone, + SETTING_TIME_ZONE + ); + return ret; } -bool MySQL_Session::handler_again___verify_backend_isolation_level() { - if (mybe->server_myds->myconn->options.isolation_level_int==0) { +bool MySQL_Session::handler_again___verify_backend__generic_variable(uint32_t *be_int, char **be_var, char *def, uint32_t *fe_int, char *fe_var, enum session_status next_sess_status) { + // be_int = backend int (hash) + // be_var = backend value + // def = default + // fe_int = frontend int (has) + // fe_var = frontend value + if (*be_int == 0) { // it is the first time we use this backend. Set isolation_level to default - if (mybe->server_myds->myconn->options.isolation_level) { - free(mybe->server_myds->myconn->options.isolation_level); - mybe->server_myds->myconn->options.isolation_level=NULL; + if (*be_var) { + free(*be_var); + *be_var = NULL; } - mybe->server_myds->myconn->options.isolation_level=strdup(mysql_thread___default_isolation_level); - uint32_t isolation_level_int=SpookyHash::Hash32(mybe->server_myds->myconn->options.isolation_level,strlen(mybe->server_myds->myconn->options.isolation_level),10); - mybe->server_myds->myconn->options.isolation_level_int=isolation_level_int; + *be_var = strdup(def); + uint32_t tmp_int = SpookyHash::Hash32(*be_var, strlen(*be_var), 10); + *be_int = tmp_int; } - if (client_myds->myconn->options.isolation_level_int) { - if (client_myds->myconn->options.isolation_level_int != mybe->server_myds->myconn->options.isolation_level_int) { + if (*fe_int) { + if (*fe_int != *be_int) { { - mybe->server_myds->myconn->options.isolation_level_int = client_myds->myconn->options.isolation_level_int; - if (mybe->server_myds->myconn->options.isolation_level) { - free(mybe->server_myds->myconn->options.isolation_level); - mybe->server_myds->myconn->options.isolation_level=NULL; - if (client_myds->myconn->options.isolation_level) { - mybe->server_myds->myconn->options.isolation_level=strdup(client_myds->myconn->options.isolation_level); + *be_int = *fe_int; + if (*be_var) { + free(*be_var); + *be_var = NULL; + if (fe_var) { + *be_var = strdup(fe_var); } } } @@ -1686,96 +1637,49 @@ bool MySQL_Session::handler_again___verify_backend_isolation_level() { assert(0); break; } - NEXT_IMMEDIATE_NEW(SETTING_ISOLATION_LEVEL); + NEXT_IMMEDIATE_NEW(next_sess_status); } } return false; } +bool MySQL_Session::handler_again___verify_backend_isolation_level() { + bool ret = false; + ret = handler_again___verify_backend__generic_variable( + &mybe->server_myds->myconn->options.isolation_level_int, + &mybe->server_myds->myconn->options.isolation_level, + mysql_thread___default_isolation_level, + &client_myds->myconn->options.isolation_level_int, + client_myds->myconn->options.isolation_level, + SETTING_ISOLATION_LEVEL + ); + return ret; +} + bool MySQL_Session::handler_again___verify_backend_character_set_results() { - if (mybe->server_myds->myconn->options.character_set_results_int==0) { - // it is the first time we use this backend. Set character_set_results to default - if (mybe->server_myds->myconn->options.character_set_results) { - free(mybe->server_myds->myconn->options.character_set_results); - mybe->server_myds->myconn->options.character_set_results=NULL; - } - mybe->server_myds->myconn->options.character_set_results=strdup(mysql_thread___default_character_set_results); - uint32_t character_set_results_int=SpookyHash::Hash32(mybe->server_myds->myconn->options.character_set_results,strlen(mybe->server_myds->myconn->options.character_set_results),10); - mybe->server_myds->myconn->options.character_set_results_int=character_set_results_int; - } - if (client_myds->myconn->options.character_set_results_int) { - if (client_myds->myconn->options.character_set_results_int != mybe->server_myds->myconn->options.character_set_results_int) { - { - mybe->server_myds->myconn->options.character_set_results_int = client_myds->myconn->options.character_set_results_int; - if (mybe->server_myds->myconn->options.character_set_results) { - free(mybe->server_myds->myconn->options.character_set_results); - mybe->server_myds->myconn->options.character_set_results=NULL; - if (client_myds->myconn->options.character_set_results) { - mybe->server_myds->myconn->options.character_set_results=strdup(client_myds->myconn->options.character_set_results); - } - } - } - switch(status) { // this switch can be replaced with a simple previous_status.push(status), but it is here for readibility - case PROCESSING_QUERY: - previous_status.push(PROCESSING_QUERY); - break; - case PROCESSING_STMT_PREPARE: - previous_status.push(PROCESSING_STMT_PREPARE); - break; - case PROCESSING_STMT_EXECUTE: - previous_status.push(PROCESSING_STMT_EXECUTE); - break; - default: - assert(0); - break; - } - NEXT_IMMEDIATE_NEW(SETTING_CHARACTER_SET_RESULTS); - } - } - return false; + bool ret = false; + ret = handler_again___verify_backend__generic_variable( + &mybe->server_myds->myconn->options.character_set_results_int, + &mybe->server_myds->myconn->options.character_set_results, + mysql_thread___default_character_set_results, + &client_myds->myconn->options.character_set_results_int, + client_myds->myconn->options.character_set_results, + SETTING_CHARACTER_SET_RESULTS + ); + return ret; } bool MySQL_Session::handler_again___verify_backend_session_track_gtids() { - if (mybe->server_myds->myconn->options.session_track_gtids_int==0) { - // it is the first time we use this backend. Set session_track_gtids to default - if (mybe->server_myds->myconn->options.session_track_gtids) { - free(mybe->server_myds->myconn->options.session_track_gtids); - mybe->server_myds->myconn->options.session_track_gtids=NULL; - } - mybe->server_myds->myconn->options.session_track_gtids=strdup(mysql_thread___default_session_track_gtids); - uint32_t session_track_gtids_int=SpookyHash::Hash32(mybe->server_myds->myconn->options.session_track_gtids,strlen(mybe->server_myds->myconn->options.session_track_gtids),10); - mybe->server_myds->myconn->options.session_track_gtids_int=session_track_gtids_int; - } - if (client_myds->myconn->options.session_track_gtids_int) { - if (client_myds->myconn->options.session_track_gtids_int != mybe->server_myds->myconn->options.session_track_gtids_int) { - { - mybe->server_myds->myconn->options.session_track_gtids_int = client_myds->myconn->options.session_track_gtids_int; - if (mybe->server_myds->myconn->options.session_track_gtids) { - free(mybe->server_myds->myconn->options.session_track_gtids); - mybe->server_myds->myconn->options.session_track_gtids=NULL; - if (client_myds->myconn->options.session_track_gtids) { - mybe->server_myds->myconn->options.session_track_gtids=strdup(client_myds->myconn->options.session_track_gtids); - } - } - } - switch(status) { // this switch can be replaced with a simple previous_status.push(status), but it is here for readibility - case PROCESSING_QUERY: - previous_status.push(PROCESSING_QUERY); - break; - case PROCESSING_STMT_PREPARE: - previous_status.push(PROCESSING_STMT_PREPARE); - break; - case PROCESSING_STMT_EXECUTE: - previous_status.push(PROCESSING_STMT_EXECUTE); - break; - default: - assert(0); - break; - } - NEXT_IMMEDIATE_NEW(SETTING_SESSION_TRACK_GTIDS); - } - } - return false; + bool ret = false; + ret = handler_again___verify_backend__generic_variable( + &mybe->server_myds->myconn->options.session_track_gtids_int, + &mybe->server_myds->myconn->options.session_track_gtids, + mysql_thread___default_session_track_gtids, + &client_myds->myconn->options.session_track_gtids_int, + client_myds->myconn->options.session_track_gtids, + SETTING_SESSION_TRACK_GTIDS + ); + return ret; } bool MySQL_Session::handler_again___verify_init_connect() { @@ -2293,8 +2197,8 @@ bool MySQL_Session::handler_again___status_SETTING_SQL_MODE(int *_rc) { return ret; } -bool MySQL_Session::handler_again___status_SETTING_TIME_ZONE(int *_rc) { - bool ret=false; +bool MySQL_Session::handler_again___status_SETTING_GENERIC_VARIABLE(int *_rc, char *var_name, char *var_value) { + bool ret = false; assert(mybe->server_myds->myconn); MySQL_Data_Stream *myds=mybe->server_myds; MySQL_Connection *myconn=myds->myconn; @@ -2307,13 +2211,13 @@ bool MySQL_Session::handler_again___status_SETTING_TIME_ZONE(int *_rc) { unsigned long query_length=0; if (myconn->async_state_machine==ASYNC_IDLE) { char *q = NULL; - if (myconn->options.time_zone[0]=='@') { - q=(char *)"SET TIME_ZONE=%s"; + if (var_value[0]=='@') { + q=(char *)"SET %s=%s"; } else { - q=(char *)"SET TIME_ZONE='%s'"; + q=(char *)"SET %s='%s'"; } - query=(char *)malloc(strlen(q)+strlen(myconn->options.time_zone)); - sprintf(query,q,myconn->options.time_zone); + query=(char *)malloc(strlen(q)+strlen(var_value)); + sprintf(query,q,var_name, var_value); query_length=strlen(query); } int rc=myconn->async_send_simple_command(myds->revents,query,query_length); @@ -2333,10 +2237,10 @@ bool MySQL_Session::handler_again___status_SETTING_TIME_ZONE(int *_rc) { if (myerr >= 2000) { bool retry_conn=false; // client error, serious - proxy_error("Detected a broken connection while setting TIME_ZONE on %s , %d : %d, %s\n", myconn->parent->address, myconn->parent->port, myerr, mysql_error(myconn->mysql)); - //if ((myds->myconn->reusable==true) && ((myds->myprot.prot_status & SERVER_STATUS_IN_TRANS)==0)) { - if ((myds->myconn->reusable==true) && myds->myconn->IsActiveTransaction()==false && myds->myconn->MultiplexDisabled()==false) { - retry_conn=true; + proxy_error("Detected a broken connection while setting %s on %s , %d : %d, %s\n", var_name, myconn->parent->address, myconn->parent->port, myerr, mysql_error(myconn->mysql)); + //if ((myds->myconn->reusable==true) && ((myds->myprot.prot_status & SERVER_STATUS_IN_TRANS)==0)) { + if ((myds->myconn->reusable==true) && myds->myconn->IsActiveTransaction()==false && myds->myconn->MultiplexDisabled()==false) { + retry_conn=true; } myds->destroy_MySQL_Connection_From_Pool(false); myds->fd=0; @@ -2347,7 +2251,7 @@ bool MySQL_Session::handler_again___status_SETTING_TIME_ZONE(int *_rc) { *_rc=-1; // an error happened, we should destroy the Session return ret; } else { - proxy_warning("Error while setting TIME_ZONE: %d, %s\n", myerr, mysql_error(myconn->mysql)); + proxy_warning("Error while setting %s: %d, %s\n", var_name, myerr, mysql_error(myconn->mysql)); // we won't go back to PROCESSING_QUERY st=previous_status.top(); previous_status.pop(); @@ -2365,6 +2269,13 @@ bool MySQL_Session::handler_again___status_SETTING_TIME_ZONE(int *_rc) { return ret; } +bool MySQL_Session::handler_again___status_SETTING_TIME_ZONE(int *_rc) { + bool ret=false; + assert(mybe->server_myds->myconn); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, "TIME_ZONE", mybe->server_myds->myconn->options.time_zone); + return ret; +} + bool MySQL_Session::handler_again___status_CHANGING_SCHEMA(int *_rc) { bool ret=false; From 46606ccd01574d3a315c44411b6ffcd42d0854df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Mon, 19 Aug 2019 21:58:19 +1000 Subject: [PATCH 04/14] More on adding functions for tracking variables --- include/MySQL_Session.h | 3 + lib/MySQL_Session.cpp | 148 ++++++++++++++++++++++++- test/set_parser_test/setparsertest.cpp | 26 +++++ 3 files changed, 174 insertions(+), 3 deletions(-) diff --git a/include/MySQL_Session.h b/include/MySQL_Session.h index 5c1d5e1b3..ec478913b 100644 --- a/include/MySQL_Session.h +++ b/include/MySQL_Session.h @@ -123,6 +123,9 @@ class MySQL_Session bool handler_again___status_SETTING_SQL_LOG_BIN(int *); bool handler_again___status_SETTING_SQL_MODE(int *); bool handler_again___status_SETTING_TIME_ZONE(int *); + bool handler_again___status_SETTING_ISOLATION_LEVEL(int *); + bool handler_again___status_SETTING_CHARACTER_SET_RESULTS(int *); + bool handler_again___status_SETTING_SESSION_TRACK_GTIDS(int *); bool handler_again___status_SETTING_GENERIC_VARIABLE(int *, char *, char *); bool handler_again___status_CHANGING_SCHEMA(int *); bool handler_again___status_CONNECTING_SERVER(int *); diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index abbc03e2f..c9f4845ac 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -22,6 +22,20 @@ #define EXPMARIA + +static inline char is_normal_char(char c) { + if(c >= 'a' && c <= 'z') + return 1; + if(c >= 'A' && c <= 'Z') + return 1; + if(c >= '0' && c <= '9') + return 1; + if(c == '$' || c == '_') + return 1; + return 0; +} + + extern const MARIADB_CHARSET_INFO * proxysql_find_charset_name(const char * const name); extern MARIADB_CHARSET_INFO * proxysql_find_charset_collate_names(const char *csname, const char *collatename); @@ -2099,6 +2113,17 @@ bool MySQL_Session::handler_again___status_SETTING_SQL_LOG_BIN(int *_rc) { return ret; } +bool MySQL_Session::handler_again___status_SETTING_SQL_MODE(int *_rc) { + bool ret=false; + assert(mybe->server_myds->myconn); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, "SQL_MODE", mybe->server_myds->myconn->options.sql_mode); + return ret; +} + +/* FIXME: this old code hardcoded the handling of issue 1738 +// this seems unnecessary/redundant +// leaving the code for further reference, to be removed later +// FIXME bool MySQL_Session::handler_again___status_SETTING_SQL_MODE(int *_rc) { bool ret=false; assert(mybe->server_myds->myconn); @@ -2196,6 +2221,7 @@ bool MySQL_Session::handler_again___status_SETTING_SQL_MODE(int *_rc) { } return ret; } +*/ bool MySQL_Session::handler_again___status_SETTING_GENERIC_VARIABLE(int *_rc, char *var_name, char *var_value) { bool ret = false; @@ -2211,11 +2237,15 @@ bool MySQL_Session::handler_again___status_SETTING_GENERIC_VARIABLE(int *_rc, ch unsigned long query_length=0; if (myconn->async_state_machine==ASYNC_IDLE) { char *q = NULL; + q=(char *)"SET %s='%s'"; // default if (var_value[0]=='@') { + q=(char *)"SET %s=%s";} + if (strncasecmp(var_value,(char *)"CONCAT",6)==0) + q=(char *)"SET %s=%s"; + if (strncasecmp(var_value,(char *)"IFNULL",6)==0) + q=(char *)"SET %s=%s"; + if (strncasecmp(var_value,(char *)"REPLACE",7)==0) q=(char *)"SET %s=%s"; - } else { - q=(char *)"SET %s='%s'"; - } query=(char *)malloc(strlen(q)+strlen(var_value)); sprintf(query,q,var_name, var_value); query_length=strlen(query); @@ -2276,6 +2306,27 @@ bool MySQL_Session::handler_again___status_SETTING_TIME_ZONE(int *_rc) { return ret; } +bool MySQL_Session::handler_again___status_SETTING_ISOLATION_LEVEL(int *_rc) { + bool ret=false; + assert(mybe->server_myds->myconn); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, "ISOLATION LEVEL", mybe->server_myds->myconn->options.isolation_level); + return ret; +} + +bool MySQL_Session::handler_again___status_SETTING_CHARACTER_SET_RESULTS(int *_rc) { + bool ret=false; + assert(mybe->server_myds->myconn); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, "CHARACTER_SET_RESULTS", mybe->server_myds->myconn->options.character_set_results); + return ret; +} + +bool MySQL_Session::handler_again___status_SETTING_SESSION_TRACK_GTIDS(int *_rc) { + bool ret=false; + assert(mybe->server_myds->myconn); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, "SESSION_TRACK_GTIDS", mybe->server_myds->myconn->options.session_track_gtids); + return ret; +} + bool MySQL_Session::handler_again___status_CHANGING_SCHEMA(int *_rc) { bool ret=false; @@ -3503,6 +3554,15 @@ handler_again: if (handler_again___verify_backend_time_zone()) { goto handler_again; } + if (handler_again___verify_backend_isolation_level()) { + goto handler_again; + } + if (handler_again___verify_backend_character_set_results()) { + goto handler_again; + } + if (handler_again___verify_backend_session_track_gtids()) { + goto handler_again; + } } if (status==PROCESSING_STMT_EXECUTE) { CurrentQuery.mysql_stmt=myconn->local_stmts->find_backend_stmt_by_global_id(CurrentQuery.stmt_global_id); @@ -4036,6 +4096,42 @@ handler_again: } break; + case SETTING_ISOLATION_LEVEL: + { + int rc=0; + if (handler_again___status_SETTING_ISOLATION_LEVEL(&rc)) + goto handler_again; // we changed status + if (rc==-1) { // we have an error we can't handle + handler_ret = -1; + return handler_ret; + } + } + break; + + case SETTING_CHARACTER_SET_RESULTS: + { + int rc=0; + if (handler_again___status_SETTING_CHARACTER_SET_RESULTS(&rc)) + goto handler_again; // we changed status + if (rc==-1) { // we have an error we can't handle + handler_ret = -1; + return handler_ret; + } + } + break; + + case SETTING_SESSION_TRACK_GTIDS: + { + int rc=0; + if (handler_again___status_SETTING_SESSION_TRACK_GTIDS(&rc)) + goto handler_again; // we changed status + if (rc==-1) { // we have an error we can't handle + handler_ret = -1; + return handler_ret; + } + } + break; + case SETTING_INIT_CONNECT: { int rc=0; @@ -4998,6 +5094,52 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C proxy_debug(PROXY_DEBUG_MYSQL_COM, 8, "Changing connection Time zone to %s\n", value1.c_str()); client_myds->myconn->options.time_zone=strdup(value1.c_str()); } + } else if (var == "session_track_gtids") { + std::string value1 = *values; + if ((strcasecmp(value1.c_str(),"OWN_GTID")==0) || (strcasecmp(value1.c_str(),"OFF")==0)) { + proxy_debug(PROXY_DEBUG_MYSQL_COM, 7, "Processing SET session_track_gtids value %s\n", value1.c_str()); + uint32_t session_track_gtids_int=SpookyHash::Hash32(value1.c_str(),value1.length(),10); + if (client_myds->myconn->options.session_track_gtids_int != session_track_gtids_int) { + client_myds->myconn->options.session_track_gtids_int = session_track_gtids_int; + if (client_myds->myconn->options.session_track_gtids) { + free(client_myds->myconn->options.session_track_gtids); + } + proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection session_track_gtids to %s\n", value1.c_str()); + client_myds->myconn->options.session_track_gtids=strdup(value1.c_str()); + } + } else { +#ifdef DEBUG + string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); +#endif + } + } else if (var == "character_set_results") { + std::string value1 = *values; + int vl = strlen(value1.c_str()); + const char *v = value1.c_str(); + bool only_nomal_chars = true; + for (int i=0; imyconn->options.character_set_results_int != character_set_results_int) { + client_myds->myconn->options.character_set_results_int = character_set_results_int; + if (client_myds->myconn->options.character_set_results) { + free(client_myds->myconn->options.character_set_results); + } + proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection character_set_results to %s\n", value1.c_str()); + client_myds->myconn->options.character_set_results=strdup(value1.c_str()); + } + } else { +#ifdef DEBUG + string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); +#endif + } } else if (var == "names") { std::string value1 = *values++; std::size_t found_at = value1.find("@"); diff --git a/test/set_parser_test/setparsertest.cpp b/test/set_parser_test/setparsertest.cpp index 499cffa81..3bab24b55 100644 --- a/test/set_parser_test/setparsertest.cpp +++ b/test/set_parser_test/setparsertest.cpp @@ -130,6 +130,32 @@ TEST(TestParse, SET_TIME_ZONE) { TestParse(time_zone, arraysize(time_zone), "time_zone"); } +static Test session_track_gtids[] = { + { "SET @@session_track_gtids = OFF", { Expected("session_track_gtids", {"OFF"}) } }, + { "SET @@session_track_gtids = OWN_GTID", { Expected("session_track_gtids", {"OWN_GTID"}) } }, + { "SET @@SESSION.session_track_gtids = OWN_GTID", { Expected("session_track_gtids", {"OWN_GTID"}) } }, + { "SET SESSION session_track_gtids = OWN_GTID", { Expected("session_track_gtids", {"OWN_GTID"}) } }, + { "SET @@session_track_gtids = ALL_GTIDS", { Expected("session_track_gtids", {"ALL_GTIDS"}) } }, + { "SET @@SESSION.session_track_gtids = ALL_GTIDS", { Expected("session_track_gtids", {"ALL_GTIDS"}) } }, + { "SET SESSION session_track_gtids = ALL_GTIDS", { Expected("session_track_gtids", {"ALL_GTIDS"}) } }, +}; + +TEST(TestParse, SET_SESSION_TRACK_GTIDS) { + TestParse(session_track_gtids, arraysize(session_track_gtids), "session_track_gtids"); +} + +static Test character_set_results[] = { + { "SET @@character_set_results = utf8", { Expected("character_set_results", {"utf8"}) } }, + { "SET @@character_set_results = NULL", { Expected("character_set_results", {"NULL"}) } }, + { "SET character_set_results = NULL", { Expected("character_set_results", {"NULL"}) } }, + { "SET @@session.character_set_results = NULL", { Expected("character_set_results", {"NULL"}) } }, + { "SET session character_set_results = NULL", { Expected("character_set_results", {"NULL"}) } }, +}; + +TEST(TestParse, SET_CHARACTER_SET_RESULTS) { + TestParse(character_set_results, arraysize(character_set_results), "character_set_results"); +} + static Test names[] = { { "SET NAMES utf8", { Expected("names", {"utf8"}) } }, { "SET NAMES 'utf8'", { Expected("names", {"utf8"}) } }, From ddf4a231a3267035090cf31b7594584b6d433e9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Tue, 20 Aug 2019 23:46:43 +1000 Subject: [PATCH 05/14] More on adding functions for tracking variables --- include/MySQL_Session.h | 10 ++ include/MySQL_Thread.h | 10 ++ include/mysql_connection.h | 21 +++- include/proxysql_structs.h | 15 +++ lib/MySQL_Session.cpp | 125 +++++++++++++++++++++++- lib/MySQL_Thread.cpp | 190 +++++++++++++++++++++++++++++++++++++ lib/mysql_connection.cpp | 49 +++++++++- 7 files changed, 410 insertions(+), 10 deletions(-) diff --git a/include/MySQL_Session.h b/include/MySQL_Session.h index ec478913b..846916699 100644 --- a/include/MySQL_Session.h +++ b/include/MySQL_Session.h @@ -117,6 +117,11 @@ class MySQL_Session bool handler_again___verify_backend_isolation_level(); bool handler_again___verify_backend_character_set_results(); bool handler_again___verify_backend_session_track_gtids(); + bool handler_again___verify_backend_sql_auto_is_null(); + bool handler_again___verify_backend_sql_select_limit(); + bool handler_again___verify_backend_sql_safe_updates(); + bool handler_again___verify_backend_collation_connection(); + bool handler_again___verify_backend_net_write_timeout(); bool handler_again___verify_backend__generic_variable(uint32_t *be_int, char **be_var, char *def, uint32_t *fe_int, char *fe_var, enum session_status next_sess_status); bool handler_again___status_SETTING_INIT_CONNECT(int *); bool handler_again___status_SETTING_LDAP_USER_VARIABLE(int *); @@ -126,6 +131,11 @@ class MySQL_Session bool handler_again___status_SETTING_ISOLATION_LEVEL(int *); bool handler_again___status_SETTING_CHARACTER_SET_RESULTS(int *); bool handler_again___status_SETTING_SESSION_TRACK_GTIDS(int *); + bool handler_again___status_SETTING_SQL_AUTO_IS_NULL(int *); + bool handler_again___status_SETTING_SQL_SELECT_LIMIT(int *); + bool handler_again___status_SETTING_SQL_SAFE_UPDATES(int *); + bool handler_again___status_SETTING_COLLATION_CONNECTION(int *); + bool handler_again___status_SETTING_NET_WRITE_TIMEOUT(int *); bool handler_again___status_SETTING_GENERIC_VARIABLE(int *, char *, char *); bool handler_again___status_CHANGING_SCHEMA(int *); bool handler_again___status_CONNECTING_SERVER(int *); diff --git a/include/MySQL_Thread.h b/include/MySQL_Thread.h index 83e9e52ec..78e30bbf9 100644 --- a/include/MySQL_Thread.h +++ b/include/MySQL_Thread.h @@ -22,6 +22,11 @@ #define MYSQL_DEFAULT_ISOLATION_LEVEL "" #define MYSQL_DEFAULT_CHARACTER_SET_RESULTS "" #define MYSQL_DEFAULT_SESSION_TRACK_GTIDS "" +#define MYSQL_DEFAULT_SQL_AUTO_IS_NULL "" +#define MYSQL_DEFAULT_SQL_SELECT_LIMIT "" +#define MYSQL_DEFAULT_SQL_SAFE_UPDATES "" +#define MYSQL_DEFAULT_COLLATION_CONNECTION "" +#define MYSQL_DEFAULT_NET_WRITE_TIMEOUT "" static unsigned int near_pow_2 (unsigned int n) { unsigned int i = 1; @@ -447,6 +452,11 @@ class MySQL_Threads_Handler char *default_isolation_level; char *default_character_set_results; char *default_session_track_gtids; + char *default_sql_auto_is_null; + char *default_sql_select_limit; + char *default_sql_safe_updates; + char *default_collation_connection; + char *default_net_write_timeout; #ifdef DEBUG bool session_debug; #endif /* DEBUG */ diff --git a/include/mysql_connection.h b/include/mysql_connection.h index 737be497a..07e77c614 100644 --- a/include/mysql_connection.h +++ b/include/mysql_connection.h @@ -45,8 +45,13 @@ class MySQL_Connection { uint32_t sql_mode_int; uint32_t time_zone_int; uint32_t character_set_results_int; - uint32_t session_track_gtids_int; uint32_t isolation_level_int; + uint32_t session_track_gtids_int; + uint32_t sql_auto_is_null_int; + uint32_t sql_select_limit_int; + uint32_t sql_safe_updates_int; + uint32_t collation_connection_int; + uint32_t net_write_timeout_int; uint32_t max_allowed_pkt; uint32_t server_capabilities; uint32_t client_flag; @@ -54,11 +59,21 @@ class MySQL_Connection { char *init_connect; bool init_connect_sent; char * character_set_results; - char * session_track_gtids; char * isolation_level; + char * session_track_gtids; + char * sql_auto_is_null; + char * sql_select_limit; + char * sql_safe_updates; + char * collation_connection; + char * net_write_timeout; + bool isolation_level_sent; bool character_set_results_sent; bool session_track_gtids_sent; - bool isolation_level_sent; + bool sql_auto_is_null_sent; + bool sql_select_limit_sent; + bool sql_safe_updates_sent; + bool collation_connection_sent; + bool net_write_timeout_sent; bool sql_mode_sent; char *ldap_user_variable; char *ldap_user_variable_value; diff --git a/include/proxysql_structs.h b/include/proxysql_structs.h index 8c77bfa96..e3fed15e3 100644 --- a/include/proxysql_structs.h +++ b/include/proxysql_structs.h @@ -155,6 +155,11 @@ enum session_status { SETTING_ISOLATION_LEVEL, SETTING_CHARACTER_SET_RESULTS, SETTING_SESSION_TRACK_GTIDS, + SETTING_SQL_AUTO_IS_NULL, + SETTING_SQL_SELECT_LIMIT, + SETTING_SQL_SAFE_UPDATES, + SETTING_COLLATION_CONNECTION, + SETTING_NET_WRITE_TIMEOUT, FAST_FORWARD, PROCESSING_STMT_PREPARE, PROCESSING_STMT_EXECUTE, @@ -618,6 +623,11 @@ __thread char *mysql_thread___default_time_zone; __thread char *mysql_thread___default_isolation_level; __thread char *mysql_thread___default_character_set_results; __thread char *mysql_thread___default_session_track_gtids; +__thread char *mysql_thread___default_sql_auto_is_null; +__thread char *mysql_thread___default_sql_select_limit; +__thread char *mysql_thread___default_sql_safe_updates; +__thread char *mysql_thread___default_collation_connection; +__thread char *mysql_thread___default_net_write_timeout; __thread int mysql_thread___max_allowed_packet; __thread int mysql_thread___throttle_connections_per_sec_to_hostgroup; __thread int mysql_thread___max_transaction_time; @@ -755,6 +765,11 @@ extern __thread char *mysql_thread___default_time_zone; extern __thread char *mysql_thread___default_isolation_level; extern __thread char *mysql_thread___default_character_set_results; extern __thread char *mysql_thread___default_session_track_gtids; +extern __thread char *mysql_thread___default_sql_auto_is_null; +extern __thread char *mysql_thread___default_sql_select_limit; +extern __thread char *mysql_thread___default_sql_safe_updates; +extern __thread char *mysql_thread___default_collation_connection; +extern __thread char *mysql_thread___default_net_write_timeout; extern __thread int mysql_thread___max_allowed_packet; extern __thread int mysql_thread___throttle_connections_per_sec_to_hostgroup; extern __thread int mysql_thread___max_transaction_time; diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index c9f4845ac..486b44736 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -1696,6 +1696,71 @@ bool MySQL_Session::handler_again___verify_backend_session_track_gtids() { return ret; } +bool MySQL_Session::handler_again___verify_backend_sql_auto_is_null() { + bool ret = false; + ret = handler_again___verify_backend__generic_variable( + &mybe->server_myds->myconn->options.sql_auto_is_null_int, + &mybe->server_myds->myconn->options.sql_auto_is_null, + mysql_thread___default_sql_auto_is_null, + &client_myds->myconn->options.sql_auto_is_null_int, + client_myds->myconn->options.sql_auto_is_null, + SETTING_SQL_AUTO_IS_NULL + ); + return ret; +} + +bool MySQL_Session::handler_again___verify_backend_sql_select_limit() { + bool ret = false; + ret = handler_again___verify_backend__generic_variable( + &mybe->server_myds->myconn->options.sql_select_limit_int, + &mybe->server_myds->myconn->options.sql_select_limit, + mysql_thread___default_sql_select_limit, + &client_myds->myconn->options.sql_select_limit_int, + client_myds->myconn->options.sql_select_limit, + SETTING_SQL_SELECT_LIMIT + ); + return ret; +} + +bool MySQL_Session::handler_again___verify_backend_sql_safe_updates() { + bool ret = false; + ret = handler_again___verify_backend__generic_variable( + &mybe->server_myds->myconn->options.sql_safe_updates_int, + &mybe->server_myds->myconn->options.sql_safe_updates, + mysql_thread___default_sql_safe_updates, + &client_myds->myconn->options.sql_safe_updates_int, + client_myds->myconn->options.sql_safe_updates, + SETTING_SQL_SAFE_UPDATES + ); + return ret; +} + +bool MySQL_Session::handler_again___verify_backend_collation_connection() { + bool ret = false; + ret = handler_again___verify_backend__generic_variable( + &mybe->server_myds->myconn->options.collation_connection_int, + &mybe->server_myds->myconn->options.collation_connection, + mysql_thread___default_collation_connection, + &client_myds->myconn->options.collation_connection_int, + client_myds->myconn->options.collation_connection, + SETTING_COLLATION_CONNECTION + ); + return ret; +} + +bool MySQL_Session::handler_again___verify_backend_net_write_timeout() { + bool ret = false; + ret = handler_again___verify_backend__generic_variable( + &mybe->server_myds->myconn->options.net_write_timeout_int, + &mybe->server_myds->myconn->options.net_write_timeout, + mysql_thread___default_net_write_timeout, + &client_myds->myconn->options.net_write_timeout_int, + client_myds->myconn->options.net_write_timeout, + SETTING_NET_WRITE_TIMEOUT + ); + return ret; +} + bool MySQL_Session::handler_again___verify_init_connect() { if (mybe->server_myds->myconn->options.init_connect_sent==false) { // we needs to set it to true @@ -2116,7 +2181,7 @@ bool MySQL_Session::handler_again___status_SETTING_SQL_LOG_BIN(int *_rc) { bool MySQL_Session::handler_again___status_SETTING_SQL_MODE(int *_rc) { bool ret=false; assert(mybe->server_myds->myconn); - ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, "SQL_MODE", mybe->server_myds->myconn->options.sql_mode); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"SQL_MODE", mybe->server_myds->myconn->options.sql_mode); return ret; } @@ -2302,28 +2367,63 @@ bool MySQL_Session::handler_again___status_SETTING_GENERIC_VARIABLE(int *_rc, ch bool MySQL_Session::handler_again___status_SETTING_TIME_ZONE(int *_rc) { bool ret=false; assert(mybe->server_myds->myconn); - ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, "TIME_ZONE", mybe->server_myds->myconn->options.time_zone); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"TIME_ZONE", mybe->server_myds->myconn->options.time_zone); return ret; } bool MySQL_Session::handler_again___status_SETTING_ISOLATION_LEVEL(int *_rc) { bool ret=false; assert(mybe->server_myds->myconn); - ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, "ISOLATION LEVEL", mybe->server_myds->myconn->options.isolation_level); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"ISOLATION LEVEL", mybe->server_myds->myconn->options.isolation_level); return ret; } bool MySQL_Session::handler_again___status_SETTING_CHARACTER_SET_RESULTS(int *_rc) { bool ret=false; assert(mybe->server_myds->myconn); - ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, "CHARACTER_SET_RESULTS", mybe->server_myds->myconn->options.character_set_results); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"CHARACTER_SET_RESULTS", mybe->server_myds->myconn->options.character_set_results); return ret; } bool MySQL_Session::handler_again___status_SETTING_SESSION_TRACK_GTIDS(int *_rc) { bool ret=false; assert(mybe->server_myds->myconn); - ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, "SESSION_TRACK_GTIDS", mybe->server_myds->myconn->options.session_track_gtids); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"SESSION_TRACK_GTIDS", mybe->server_myds->myconn->options.session_track_gtids); + return ret; +} + +bool MySQL_Session::handler_again___status_SETTING_SQL_AUTO_IS_NULL(int *_rc) { + bool ret=false; + assert(mybe->server_myds->myconn); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"SQL_AUTO_IS_NULL", mybe->server_myds->myconn->options.sql_auto_is_null); + return ret; +} + +bool MySQL_Session::handler_again___status_SETTING_SQL_SELECT_LIMIT(int *_rc) { + bool ret=false; + assert(mybe->server_myds->myconn); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"SQL_SELECT_LIMIT", mybe->server_myds->myconn->options.sql_select_limit); + return ret; +} + +bool MySQL_Session::handler_again___status_SETTING_SQL_SAFE_UPDATES(int *_rc) { + bool ret=false; + assert(mybe->server_myds->myconn); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"SQL_SAFE_UPDATES", mybe->server_myds->myconn->options.sql_safe_updates); + return ret; +} + +bool MySQL_Session::handler_again___status_SETTING_COLLATION_CONNECTION(int *_rc) { + bool ret=false; + assert(mybe->server_myds->myconn); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"COLLATION_CONNECTION", mybe->server_myds->myconn->options.collation_connection); + return ret; +} + +bool MySQL_Session::handler_again___status_SETTING_NET_WRITE_TIMEOUT(int *_rc) { + bool ret=false; + assert(mybe->server_myds->myconn); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"NET_WRITE_TIMEOUT", mybe->server_myds->myconn->options.net_write_timeout); return ret; } @@ -3563,6 +3663,21 @@ handler_again: if (handler_again___verify_backend_session_track_gtids()) { goto handler_again; } + if (handler_again___verify_backend_sql_auto_is_null()) { + goto handler_again; + } + if (handler_again___verify_backend_sql_select_limit()) { + goto handler_again; + } + if (handler_again___verify_backend_sql_safe_updates()) { + goto handler_again; + } + if (handler_again___verify_backend_collation_connection()) { + goto handler_again; + } + if (handler_again___verify_backend_net_write_timeout()) { + goto handler_again; + } } if (status==PROCESSING_STMT_EXECUTE) { CurrentQuery.mysql_stmt=myconn->local_stmts->find_backend_stmt_by_global_id(CurrentQuery.stmt_global_id); diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index 9cd64b7c4..b3497f622 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -334,6 +334,11 @@ static char * mysql_thread_variables_names[]= { (char *)"default_isolation_level", (char *)"default_character_set_results", (char *)"default_session_track_gtids", + (char *)"default_sql_auto_is_null", + (char *)"default_sql_select_limit", + (char *)"default_sql_safe_updates", + (char *)"default_collation_connection", + (char *)"default_net_write_timeout", (char *)"connpoll_reset_queue_length", (char *)"min_num_servers_lantency_awareness", (char *)"stats_time_backend_query", @@ -434,6 +439,11 @@ MySQL_Threads_Handler::MySQL_Threads_Handler() { variables.default_isolation_level=strdup((char *)MYSQL_DEFAULT_ISOLATION_LEVEL); variables.default_character_set_results=strdup((char *)MYSQL_DEFAULT_CHARACTER_SET_RESULTS); variables.default_session_track_gtids=strdup((char *)MYSQL_DEFAULT_SESSION_TRACK_GTIDS); + variables.default_sql_auto_is_null=strdup((char *)MYSQL_DEFAULT_SQL_AUTO_IS_NULL); + variables.default_sql_select_limit=strdup((char *)MYSQL_DEFAULT_SQL_SELECT_LIMIT); + variables.default_sql_safe_updates=strdup((char *)MYSQL_DEFAULT_SQL_SAFE_UPDATES); + variables.default_collation_connection=strdup((char *)MYSQL_DEFAULT_COLLATION_CONNECTION); + variables.default_net_write_timeout=strdup((char *)MYSQL_DEFAULT_NET_WRITE_TIMEOUT); variables.ping_interval_server_msec=10000; variables.ping_timeout_server=200; variables.default_schema=strdup((char *)"information_schema"); @@ -654,6 +664,36 @@ char * MySQL_Threads_Handler::get_variable_string(char *name) { } return strdup(variables.default_session_track_gtids); } + if (!strcmp(name,"default_sql_auto_is_null")) { + if (variables.default_sql_auto_is_null==NULL) { + variables.default_sql_auto_is_null=strdup((char *)MYSQL_DEFAULT_SQL_AUTO_IS_NULL); + } + return strdup(variables.default_sql_auto_is_null); + } + if (!strcmp(name,"default_sql_select_limit")) { + if (variables.default_sql_select_limit==NULL) { + variables.default_sql_select_limit=strdup((char *)MYSQL_DEFAULT_SQL_SELECT_LIMIT); + } + return strdup(variables.default_sql_select_limit); + } + if (!strcmp(name,"default_sql_safe_updates")) { + if (variables.default_sql_safe_updates==NULL) { + variables.default_sql_safe_updates=strdup((char *)MYSQL_DEFAULT_SQL_SAFE_UPDATES); + } + return strdup(variables.default_sql_safe_updates); + } + if (!strcmp(name,"default_collation_connection")) { + if (variables.default_collation_connection==NULL) { + variables.default_collation_connection=strdup((char *)MYSQL_DEFAULT_COLLATION_CONNECTION); + } + return strdup(variables.default_collation_connection); + } + if (!strcmp(name,"default_net_write_timeout")) { + if (variables.default_net_write_timeout==NULL) { + variables.default_net_write_timeout=strdup((char *)MYSQL_DEFAULT_NET_WRITE_TIMEOUT); + } + return strdup(variables.default_net_write_timeout); + } if (!strcmp(name,"server_version")) return strdup(variables.server_version); if (!strcmp(name,"eventslog_filename")) return strdup(variables.eventslog_filename); if (!strcmp(name,"auditlog_filename")) return strdup(variables.auditlog_filename); @@ -909,6 +949,36 @@ char * MySQL_Threads_Handler::get_variable(char *name) { // this is the public f } return strdup(variables.default_session_track_gtids); } + if (!strcasecmp(name,"default_sql_auto_is_null")) { + if (variables.default_sql_auto_is_null==NULL) { + variables.default_sql_auto_is_null=strdup((char *)MYSQL_DEFAULT_SQL_AUTO_IS_NULL); + } + return strdup(variables.default_sql_auto_is_null); + } + if (!strcasecmp(name,"default_sql_select_limit")) { + if (variables.default_sql_select_limit==NULL) { + variables.default_sql_select_limit=strdup((char *)MYSQL_DEFAULT_SQL_SELECT_LIMIT); + } + return strdup(variables.default_sql_select_limit); + } + if (!strcasecmp(name,"default_sql_safe_updates")) { + if (variables.default_sql_safe_updates==NULL) { + variables.default_sql_safe_updates=strdup((char *)MYSQL_DEFAULT_SQL_SAFE_UPDATES); + } + return strdup(variables.default_sql_safe_updates); + } + if (!strcasecmp(name,"default_collation_connection")) { + if (variables.default_collation_connection==NULL) { + variables.default_collation_connection=strdup((char *)MYSQL_DEFAULT_COLLATION_CONNECTION); + } + return strdup(variables.default_collation_connection); + } + if (!strcasecmp(name,"default_net_write_timeout")) { + if (variables.default_net_write_timeout==NULL) { + variables.default_net_write_timeout=strdup((char *)MYSQL_DEFAULT_NET_WRITE_TIMEOUT); + } + return strdup(variables.default_net_write_timeout); + } if (!strcasecmp(name,"server_version")) return strdup(variables.server_version); if (!strcasecmp(name,"auditlog_filename")) return strdup(variables.auditlog_filename); if (!strcasecmp(name,"eventslog_filename")) return strdup(variables.eventslog_filename); @@ -2185,6 +2255,71 @@ bool MySQL_Threads_Handler::set_variable(char *name, char *value) { // this is t return true; } + if (!strcasecmp(name,"default_sql_auto_is_null")) { + if (variables.default_sql_auto_is_null) free(variables.default_sql_auto_is_null); + variables.default_sql_auto_is_null=NULL; + if (vallen) { + if (strcmp(value,"(null)")) + variables.default_sql_auto_is_null=strdup(value); + } + if (variables.default_sql_auto_is_null==NULL) { + variables.default_sql_auto_is_null=strdup((char *)MYSQL_DEFAULT_SQL_AUTO_IS_NULL); // default + } + return true; + } + + if (!strcasecmp(name,"default_sql_select_limit")) { + if (variables.default_sql_select_limit) free(variables.default_sql_select_limit); + variables.default_sql_select_limit=NULL; + if (vallen) { + if (strcmp(value,"(null)")) + variables.default_sql_select_limit=strdup(value); + } + if (variables.default_sql_select_limit==NULL) { + variables.default_sql_select_limit=strdup((char *)MYSQL_DEFAULT_SQL_SELECT_LIMIT); // default + } + return true; + } + + if (!strcasecmp(name,"default_sql_safe_updates")) { + if (variables.default_sql_safe_updates) free(variables.default_sql_safe_updates); + variables.default_sql_safe_updates=NULL; + if (vallen) { + if (strcmp(value,"(null)")) + variables.default_sql_safe_updates=strdup(value); + } + if (variables.default_sql_safe_updates==NULL) { + variables.default_sql_safe_updates=strdup((char *)MYSQL_DEFAULT_SQL_SAFE_UPDATES); // default + } + return true; + } + + if (!strcasecmp(name,"default_collation_connection")) { + if (variables.default_collation_connection) free(variables.default_collation_connection); + variables.default_collation_connection=NULL; + if (vallen) { + if (strcmp(value,"(null)")) + variables.default_collation_connection=strdup(value); + } + if (variables.default_collation_connection==NULL) { + variables.default_collation_connection=strdup((char *)MYSQL_DEFAULT_COLLATION_CONNECTION); // default + } + return true; + } + + if (!strcasecmp(name,"default_net_write_timeout")) { + if (variables.default_net_write_timeout) free(variables.default_net_write_timeout); + variables.default_net_write_timeout=NULL; + if (vallen) { + if (strcmp(value,"(null)")) + variables.default_net_write_timeout=strdup(value); + } + if (variables.default_net_write_timeout==NULL) { + variables.default_net_write_timeout=strdup((char *)MYSQL_DEFAULT_NET_WRITE_TIMEOUT); // default + } + return true; + } + if (!strcasecmp(name,"keep_multiplexing_variables")) { if (vallen) { free(variables.keep_multiplexing_variables); @@ -2798,6 +2933,11 @@ MySQL_Threads_Handler::~MySQL_Threads_Handler() { if (variables.default_isolation_level) free(variables.default_isolation_level); if (variables.default_character_set_results) free(variables.default_character_set_results); if (variables.default_session_track_gtids) free(variables.default_session_track_gtids); + if (variables.default_sql_auto_is_null) free(variables.default_sql_auto_is_null); + if (variables.default_sql_select_limit) free(variables.default_sql_select_limit); + if (variables.default_sql_safe_updates) free(variables.default_sql_safe_updates); + if (variables.default_collation_connection) free(variables.default_collation_connection); + if (variables.default_net_write_timeout) free(variables.default_net_write_timeout); if (variables.eventslog_filename) free(variables.eventslog_filename); if (variables.auditlog_filename) free(variables.auditlog_filename); if (variables.ssl_p2s_ca) free(variables.ssl_p2s_ca); @@ -2921,6 +3061,11 @@ MySQL_Thread::~MySQL_Thread() { if (mysql_thread___default_isolation_level) { free(mysql_thread___default_isolation_level); mysql_thread___default_isolation_level=NULL; } if (mysql_thread___default_character_set_results) { free(mysql_thread___default_character_set_results); mysql_thread___default_character_set_results=NULL; } if (mysql_thread___default_session_track_gtids) { free(mysql_thread___default_session_track_gtids); mysql_thread___default_session_track_gtids=NULL; } + if (mysql_thread___default_sql_auto_is_null) { free(mysql_thread___default_sql_auto_is_null); mysql_thread___default_sql_auto_is_null=NULL; } + if (mysql_thread___default_sql_select_limit) { free(mysql_thread___default_sql_select_limit); mysql_thread___default_sql_select_limit=NULL; } + if (mysql_thread___default_sql_safe_updates) { free(mysql_thread___default_sql_safe_updates); mysql_thread___default_sql_safe_updates=NULL; } + if (mysql_thread___default_collation_connection) { free(mysql_thread___default_collation_connection); mysql_thread___default_collation_connection=NULL; } + if (mysql_thread___default_net_write_timeout) { free(mysql_thread___default_net_write_timeout); mysql_thread___default_net_write_timeout=NULL; } if (mysql_thread___eventslog_filename) { free(mysql_thread___eventslog_filename); mysql_thread___eventslog_filename=NULL; } if (mysql_thread___auditlog_filename) { free(mysql_thread___auditlog_filename); mysql_thread___auditlog_filename=NULL; } if (mysql_thread___ssl_p2s_ca) { free(mysql_thread___ssl_p2s_ca); mysql_thread___ssl_p2s_ca=NULL; } @@ -2996,6 +3141,41 @@ 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); + uint32_t sql_auto_is_null_int=SpookyHash::Hash32(mysql_thread___default_sql_auto_is_null,strlen(mysql_thread___default_sql_auto_is_null),10); + sess->client_myds->myconn->options.sql_auto_is_null_int = sql_auto_is_null_int; + if (sess->client_myds->myconn->options.sql_auto_is_null) { + free(sess->client_myds->myconn->options.sql_auto_is_null); + } + sess->client_myds->myconn->options.sql_auto_is_null=strdup(mysql_thread___default_sql_auto_is_null); + + uint32_t sql_select_limit_int=SpookyHash::Hash32(mysql_thread___default_sql_select_limit,strlen(mysql_thread___default_sql_select_limit),10); + sess->client_myds->myconn->options.sql_select_limit_int = sql_select_limit_int; + if (sess->client_myds->myconn->options.sql_select_limit) { + free(sess->client_myds->myconn->options.sql_select_limit); + } + sess->client_myds->myconn->options.sql_select_limit=strdup(mysql_thread___default_sql_select_limit); + + uint32_t sql_safe_updates_int=SpookyHash::Hash32(mysql_thread___default_sql_safe_updates,strlen(mysql_thread___default_sql_safe_updates),10); + sess->client_myds->myconn->options.sql_safe_updates_int = sql_safe_updates_int; + if (sess->client_myds->myconn->options.sql_safe_updates) { + free(sess->client_myds->myconn->options.sql_safe_updates); + } + sess->client_myds->myconn->options.sql_safe_updates=strdup(mysql_thread___default_sql_safe_updates); + + uint32_t collation_connection_int=SpookyHash::Hash32(mysql_thread___default_collation_connection,strlen(mysql_thread___default_collation_connection),10); + sess->client_myds->myconn->options.collation_connection_int = collation_connection_int; + if (sess->client_myds->myconn->options.collation_connection) { + free(sess->client_myds->myconn->options.collation_connection); + } + sess->client_myds->myconn->options.collation_connection=strdup(mysql_thread___default_collation_connection); + + uint32_t net_write_timeout_int=SpookyHash::Hash32(mysql_thread___default_net_write_timeout,strlen(mysql_thread___default_net_write_timeout),10); + sess->client_myds->myconn->options.net_write_timeout_int = net_write_timeout_int; + if (sess->client_myds->myconn->options.net_write_timeout) { + free(sess->client_myds->myconn->options.net_write_timeout); + } + sess->client_myds->myconn->options.net_write_timeout=strdup(mysql_thread___default_net_write_timeout); + return sess; } @@ -4061,6 +4241,16 @@ void MySQL_Thread::refresh_variables() { mysql_thread___default_character_set_results=GloMTH->get_variable_string((char *)"default_character_set_results"); if (mysql_thread___default_session_track_gtids) free(mysql_thread___default_session_track_gtids); mysql_thread___default_session_track_gtids=GloMTH->get_variable_string((char *)"default_session_track_gtids"); + if (mysql_thread___default_sql_auto_is_null) free(mysql_thread___default_sql_auto_is_null); + mysql_thread___default_sql_auto_is_null=GloMTH->get_variable_string((char *)"default_sql_auto_is_null"); + if (mysql_thread___default_sql_select_limit) free(mysql_thread___default_sql_select_limit); + mysql_thread___default_sql_select_limit=GloMTH->get_variable_string((char *)"default_sql_select_limit"); + if (mysql_thread___default_sql_safe_updates) free(mysql_thread___default_sql_safe_updates); + mysql_thread___default_sql_safe_updates=GloMTH->get_variable_string((char *)"default_sql_safe_updates"); + if (mysql_thread___default_collation_connection) free(mysql_thread___default_collation_connection); + mysql_thread___default_collation_connection=GloMTH->get_variable_string((char *)"default_collation_connection"); + if (mysql_thread___default_net_write_timeout) free(mysql_thread___default_net_write_timeout); + mysql_thread___default_net_write_timeout=GloMTH->get_variable_string((char *)"default_net_write_timeout"); if (mysql_thread___server_version) free(mysql_thread___server_version); mysql_thread___server_version=GloMTH->get_variable_string((char *)"server_version"); if (mysql_thread___eventslog_filename) free(mysql_thread___eventslog_filename); diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 36b50d413..4988ccdc7 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -207,11 +207,21 @@ MySQL_Connection::MySQL_Connection() { options.init_connect=NULL; options.init_connect_sent=false; options.character_set_results = NULL; - options.session_track_gtids = NULL; options.isolation_level = NULL; + options.session_track_gtids = NULL; + options.sql_auto_is_null = NULL; + options.sql_select_limit = NULL; + options.sql_safe_updates = NULL; + options.collation_connection = NULL; + options.net_write_timeout = NULL; + options.isolation_level_sent = false; options.character_set_results_sent = false; options.session_track_gtids_sent = false; - options.isolation_level_sent = false; + options.sql_auto_is_null_sent = false; + options.sql_select_limit_sent = false; + options.sql_safe_updates_sent = false; + options.collation_connection_sent = false; + options.net_write_timeout_sent = false; options.sql_mode_sent=false; options.ldap_user_variable=NULL; options.ldap_user_variable_value=NULL; @@ -253,6 +263,11 @@ MySQL_Connection::~MySQL_Connection() { if (options.character_set_results) free(options.character_set_results); if (options.session_track_gtids) free(options.session_track_gtids); if (options.isolation_level) free(options.isolation_level); + if (options.sql_auto_is_null) free(options.sql_auto_is_null); + if (options.sql_select_limit) free(options.sql_select_limit); + if (options.sql_safe_updates) free(options.sql_safe_updates); + if (options.collation_connection) free(options.collation_connection); + if (options.net_write_timeout) free(options.net_write_timeout); if (options.ldap_user_variable) free(options.ldap_user_variable); if (options.ldap_user_variable_value) free(options.ldap_user_variable_value); if (userinfo) { @@ -2024,6 +2039,36 @@ void MySQL_Connection::reset() { options.session_track_gtids = NULL; options.session_track_gtids_sent = false; } + options.sql_auto_is_null_int = 0; + if (options.sql_auto_is_null) { + free (options.sql_auto_is_null); + options.sql_auto_is_null = NULL; + options.sql_auto_is_null_sent = false; + } + options.sql_select_limit_int = 0; + if (options.sql_select_limit) { + free (options.sql_select_limit); + options.sql_select_limit = NULL; + options.sql_select_limit_sent = false; + } + options.sql_safe_updates_int = 0; + if (options.sql_safe_updates) { + free (options.sql_safe_updates); + options.sql_safe_updates = NULL; + options.sql_safe_updates_sent = false; + } + options.collation_connection_int = 0; + if (options.collation_connection) { + free (options.collation_connection); + options.collation_connection = NULL; + options.collation_connection_sent = false; + } + options.net_write_timeout_int = 0; + if (options.net_write_timeout) { + free (options.net_write_timeout); + options.net_write_timeout = NULL; + options.net_write_timeout_sent = false; + } if (options.init_connect) { free(options.init_connect); options.init_connect = NULL; From 673bb96cfbe74cb9761113017eff2fcf02425e38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Thu, 22 Aug 2019 00:45:27 +1000 Subject: [PATCH 06/14] Adding functions for tracking more variables Extended unit testing parser Distinguish between variables that need quote or no quote --- include/MySQL_Session.h | 4 +- include/MySQL_Thread.h | 4 +- include/mysql_connection.h | 3 + include/proxysql_structs.h | 3 + lib/MySQL_Session.cpp | 129 ++++++++++++++++++++++--- lib/MySQL_Thread.cpp | 38 ++++++++ lib/mysql_connection.cpp | 9 ++ test/set_parser_test/setparsertest.cpp | 24 +++++ 8 files changed, 197 insertions(+), 17 deletions(-) diff --git a/include/MySQL_Session.h b/include/MySQL_Session.h index 846916699..b4bc4cfe8 100644 --- a/include/MySQL_Session.h +++ b/include/MySQL_Session.h @@ -122,6 +122,7 @@ class MySQL_Session bool handler_again___verify_backend_sql_safe_updates(); bool handler_again___verify_backend_collation_connection(); bool handler_again___verify_backend_net_write_timeout(); + bool handler_again___verify_backend_max_join_size(); bool handler_again___verify_backend__generic_variable(uint32_t *be_int, char **be_var, char *def, uint32_t *fe_int, char *fe_var, enum session_status next_sess_status); bool handler_again___status_SETTING_INIT_CONNECT(int *); bool handler_again___status_SETTING_LDAP_USER_VARIABLE(int *); @@ -136,7 +137,8 @@ class MySQL_Session bool handler_again___status_SETTING_SQL_SAFE_UPDATES(int *); bool handler_again___status_SETTING_COLLATION_CONNECTION(int *); bool handler_again___status_SETTING_NET_WRITE_TIMEOUT(int *); - bool handler_again___status_SETTING_GENERIC_VARIABLE(int *, char *, char *); + bool handler_again___status_SETTING_MAX_JOIN_SIZE(int *); + bool handler_again___status_SETTING_GENERIC_VARIABLE(int *, char *, char *, bool no_quote=false); bool handler_again___status_CHANGING_SCHEMA(int *); bool handler_again___status_CONNECTING_SERVER(int *); bool handler_again___status_CHANGING_USER_SERVER(int *); diff --git a/include/MySQL_Thread.h b/include/MySQL_Thread.h index 78e30bbf9..ac3958a6f 100644 --- a/include/MySQL_Thread.h +++ b/include/MySQL_Thread.h @@ -26,7 +26,8 @@ #define MYSQL_DEFAULT_SQL_SELECT_LIMIT "" #define MYSQL_DEFAULT_SQL_SAFE_UPDATES "" #define MYSQL_DEFAULT_COLLATION_CONNECTION "" -#define MYSQL_DEFAULT_NET_WRITE_TIMEOUT "" +#define MYSQL_DEFAULT_NET_WRITE_TIMEOUT "60" +#define MYSQL_DEFAULT_MAX_JOIN_SIZE "18446744073709551615" static unsigned int near_pow_2 (unsigned int n) { unsigned int i = 1; @@ -457,6 +458,7 @@ class MySQL_Threads_Handler char *default_sql_safe_updates; char *default_collation_connection; char *default_net_write_timeout; + char *default_max_join_size; #ifdef DEBUG bool session_debug; #endif /* DEBUG */ diff --git a/include/mysql_connection.h b/include/mysql_connection.h index 07e77c614..eda57a72c 100644 --- a/include/mysql_connection.h +++ b/include/mysql_connection.h @@ -52,6 +52,7 @@ class MySQL_Connection { uint32_t sql_safe_updates_int; uint32_t collation_connection_int; uint32_t net_write_timeout_int; + uint32_t max_join_size_int; uint32_t max_allowed_pkt; uint32_t server_capabilities; uint32_t client_flag; @@ -66,6 +67,7 @@ class MySQL_Connection { char * sql_safe_updates; char * collation_connection; char * net_write_timeout; + char * max_join_size; bool isolation_level_sent; bool character_set_results_sent; bool session_track_gtids_sent; @@ -74,6 +76,7 @@ class MySQL_Connection { bool sql_safe_updates_sent; bool collation_connection_sent; bool net_write_timeout_sent; + bool max_join_size_sent; bool sql_mode_sent; char *ldap_user_variable; char *ldap_user_variable_value; diff --git a/include/proxysql_structs.h b/include/proxysql_structs.h index e3fed15e3..5f26ec595 100644 --- a/include/proxysql_structs.h +++ b/include/proxysql_structs.h @@ -160,6 +160,7 @@ enum session_status { SETTING_SQL_SAFE_UPDATES, SETTING_COLLATION_CONNECTION, SETTING_NET_WRITE_TIMEOUT, + SETTING_MAX_JOIN_SIZE, FAST_FORWARD, PROCESSING_STMT_PREPARE, PROCESSING_STMT_EXECUTE, @@ -628,6 +629,7 @@ __thread char *mysql_thread___default_sql_select_limit; __thread char *mysql_thread___default_sql_safe_updates; __thread char *mysql_thread___default_collation_connection; __thread char *mysql_thread___default_net_write_timeout; +__thread char *mysql_thread___default_max_join_size; __thread int mysql_thread___max_allowed_packet; __thread int mysql_thread___throttle_connections_per_sec_to_hostgroup; __thread int mysql_thread___max_transaction_time; @@ -770,6 +772,7 @@ extern __thread char *mysql_thread___default_sql_select_limit; extern __thread char *mysql_thread___default_sql_safe_updates; extern __thread char *mysql_thread___default_collation_connection; extern __thread char *mysql_thread___default_net_write_timeout; +extern __thread char *mysql_thread___default_max_join_size; extern __thread int mysql_thread___max_allowed_packet; extern __thread int mysql_thread___throttle_connections_per_sec_to_hostgroup; extern __thread int mysql_thread___max_transaction_time; diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 486b44736..14f568e0a 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -1761,6 +1761,19 @@ bool MySQL_Session::handler_again___verify_backend_net_write_timeout() { return ret; } +bool MySQL_Session::handler_again___verify_backend_max_join_size() { + bool ret = false; + ret = handler_again___verify_backend__generic_variable( + &mybe->server_myds->myconn->options.max_join_size_int, + &mybe->server_myds->myconn->options.max_join_size, + mysql_thread___default_max_join_size, + &client_myds->myconn->options.max_join_size_int, + client_myds->myconn->options.max_join_size, + SETTING_MAX_JOIN_SIZE + ); + return ret; +} + bool MySQL_Session::handler_again___verify_init_connect() { if (mybe->server_myds->myconn->options.init_connect_sent==false) { // we needs to set it to true @@ -2288,7 +2301,7 @@ bool MySQL_Session::handler_again___status_SETTING_SQL_MODE(int *_rc) { } */ -bool MySQL_Session::handler_again___status_SETTING_GENERIC_VARIABLE(int *_rc, char *var_name, char *var_value) { +bool MySQL_Session::handler_again___status_SETTING_GENERIC_VARIABLE(int *_rc, char *var_name, char *var_value, bool no_quote) { bool ret = false; assert(mybe->server_myds->myconn); MySQL_Data_Stream *myds=mybe->server_myds; @@ -2302,15 +2315,19 @@ bool MySQL_Session::handler_again___status_SETTING_GENERIC_VARIABLE(int *_rc, ch unsigned long query_length=0; if (myconn->async_state_machine==ASYNC_IDLE) { char *q = NULL; - q=(char *)"SET %s='%s'"; // default - if (var_value[0]=='@') { - q=(char *)"SET %s=%s";} - if (strncasecmp(var_value,(char *)"CONCAT",6)==0) - q=(char *)"SET %s=%s"; - if (strncasecmp(var_value,(char *)"IFNULL",6)==0) - q=(char *)"SET %s=%s"; - if (strncasecmp(var_value,(char *)"REPLACE",7)==0) + if (no_quote) { q=(char *)"SET %s=%s"; + } else { + q=(char *)"SET %s='%s'"; // default + if (var_value[0]=='@') { + q=(char *)"SET %s=%s";} + if (strncasecmp(var_value,(char *)"CONCAT",6)==0) + q=(char *)"SET %s=%s"; + if (strncasecmp(var_value,(char *)"IFNULL",6)==0) + q=(char *)"SET %s=%s"; + if (strncasecmp(var_value,(char *)"REPLACE",7)==0) + q=(char *)"SET %s=%s"; + } query=(char *)malloc(strlen(q)+strlen(var_value)); sprintf(query,q,var_name, var_value); query_length=strlen(query); @@ -2381,35 +2398,35 @@ bool MySQL_Session::handler_again___status_SETTING_ISOLATION_LEVEL(int *_rc) { bool MySQL_Session::handler_again___status_SETTING_CHARACTER_SET_RESULTS(int *_rc) { bool ret=false; assert(mybe->server_myds->myconn); - ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"CHARACTER_SET_RESULTS", mybe->server_myds->myconn->options.character_set_results); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"CHARACTER_SET_RESULTS", mybe->server_myds->myconn->options.character_set_results, true); return ret; } bool MySQL_Session::handler_again___status_SETTING_SESSION_TRACK_GTIDS(int *_rc) { bool ret=false; assert(mybe->server_myds->myconn); - ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"SESSION_TRACK_GTIDS", mybe->server_myds->myconn->options.session_track_gtids); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"SESSION_TRACK_GTIDS", mybe->server_myds->myconn->options.session_track_gtids, true); return ret; } bool MySQL_Session::handler_again___status_SETTING_SQL_AUTO_IS_NULL(int *_rc) { bool ret=false; assert(mybe->server_myds->myconn); - ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"SQL_AUTO_IS_NULL", mybe->server_myds->myconn->options.sql_auto_is_null); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"SQL_AUTO_IS_NULL", mybe->server_myds->myconn->options.sql_auto_is_null, true); return ret; } bool MySQL_Session::handler_again___status_SETTING_SQL_SELECT_LIMIT(int *_rc) { bool ret=false; assert(mybe->server_myds->myconn); - ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"SQL_SELECT_LIMIT", mybe->server_myds->myconn->options.sql_select_limit); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"SQL_SELECT_LIMIT", mybe->server_myds->myconn->options.sql_select_limit, true); return ret; } bool MySQL_Session::handler_again___status_SETTING_SQL_SAFE_UPDATES(int *_rc) { bool ret=false; assert(mybe->server_myds->myconn); - ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"SQL_SAFE_UPDATES", mybe->server_myds->myconn->options.sql_safe_updates); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"SQL_SAFE_UPDATES", mybe->server_myds->myconn->options.sql_safe_updates, true); return ret; } @@ -2423,7 +2440,14 @@ bool MySQL_Session::handler_again___status_SETTING_COLLATION_CONNECTION(int *_rc bool MySQL_Session::handler_again___status_SETTING_NET_WRITE_TIMEOUT(int *_rc) { bool ret=false; assert(mybe->server_myds->myconn); - ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"NET_WRITE_TIMEOUT", mybe->server_myds->myconn->options.net_write_timeout); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"NET_WRITE_TIMEOUT", mybe->server_myds->myconn->options.net_write_timeout, true); + return ret; +} + +bool MySQL_Session::handler_again___status_SETTING_MAX_JOIN_SIZE(int *_rc) { + bool ret=false; + assert(mybe->server_myds->myconn); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"MAX_JOIN_SIZE", mybe->server_myds->myconn->options.max_join_size, true); return ret; } @@ -3678,6 +3702,9 @@ handler_again: if (handler_again___verify_backend_net_write_timeout()) { goto handler_again; } + if (handler_again___verify_backend_max_join_size()) { + goto handler_again; + } } if (status==PROCESSING_STMT_EXECUTE) { CurrentQuery.mysql_stmt=myconn->local_stmts->find_backend_stmt_by_global_id(CurrentQuery.stmt_global_id); @@ -4247,6 +4274,78 @@ handler_again: } break; + case SETTING_SQL_AUTO_IS_NULL: + { + int rc=0; + if (handler_again___status_SETTING_SQL_AUTO_IS_NULL(&rc)) + goto handler_again; // we changed status + if (rc==-1) { // we have an error we can't handle + handler_ret = -1; + return handler_ret; + } + } + break; + + case SETTING_SQL_SELECT_LIMIT: + { + int rc=0; + if (handler_again___status_SETTING_SQL_SELECT_LIMIT(&rc)) + goto handler_again; // we changed status + if (rc==-1) { // we have an error we can't handle + handler_ret = -1; + return handler_ret; + } + } + break; + + case SETTING_SQL_SAFE_UPDATES: + { + int rc=0; + if (handler_again___status_SETTING_SQL_SAFE_UPDATES(&rc)) + goto handler_again; // we changed status + if (rc==-1) { // we have an error we can't handle + handler_ret = -1; + return handler_ret; + } + } + break; + + case SETTING_COLLATION_CONNECTION: + { + int rc=0; + if (handler_again___status_SETTING_COLLATION_CONNECTION(&rc)) + goto handler_again; // we changed status + if (rc==-1) { // we have an error we can't handle + handler_ret = -1; + return handler_ret; + } + } + break; + + case SETTING_NET_WRITE_TIMEOUT: + { + int rc=0; + if (handler_again___status_SETTING_NET_WRITE_TIMEOUT(&rc)) + goto handler_again; // we changed status + if (rc==-1) { // we have an error we can't handle + handler_ret = -1; + return handler_ret; + } + } + break; + + case SETTING_MAX_JOIN_SIZE: + { + int rc=0; + if (handler_again___status_SETTING_MAX_JOIN_SIZE(&rc)) + goto handler_again; // we changed status + if (rc==-1) { // we have an error we can't handle + handler_ret = -1; + return handler_ret; + } + } + break; + case SETTING_INIT_CONNECT: { int rc=0; diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index b3497f622..fd8929299 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -339,6 +339,7 @@ static char * mysql_thread_variables_names[]= { (char *)"default_sql_safe_updates", (char *)"default_collation_connection", (char *)"default_net_write_timeout", + (char *)"default_max_join_size", (char *)"connpoll_reset_queue_length", (char *)"min_num_servers_lantency_awareness", (char *)"stats_time_backend_query", @@ -444,6 +445,7 @@ MySQL_Threads_Handler::MySQL_Threads_Handler() { variables.default_sql_safe_updates=strdup((char *)MYSQL_DEFAULT_SQL_SAFE_UPDATES); variables.default_collation_connection=strdup((char *)MYSQL_DEFAULT_COLLATION_CONNECTION); variables.default_net_write_timeout=strdup((char *)MYSQL_DEFAULT_NET_WRITE_TIMEOUT); + variables.default_max_join_size=strdup((char *)MYSQL_DEFAULT_MAX_JOIN_SIZE); variables.ping_interval_server_msec=10000; variables.ping_timeout_server=200; variables.default_schema=strdup((char *)"information_schema"); @@ -694,6 +696,12 @@ char * MySQL_Threads_Handler::get_variable_string(char *name) { } return strdup(variables.default_net_write_timeout); } + if (!strcmp(name,"default_max_join_size")) { + if (variables.default_max_join_size==NULL) { + variables.default_max_join_size=strdup((char *)MYSQL_DEFAULT_MAX_JOIN_SIZE); + } + return strdup(variables.default_max_join_size); + } if (!strcmp(name,"server_version")) return strdup(variables.server_version); if (!strcmp(name,"eventslog_filename")) return strdup(variables.eventslog_filename); if (!strcmp(name,"auditlog_filename")) return strdup(variables.auditlog_filename); @@ -979,6 +987,12 @@ char * MySQL_Threads_Handler::get_variable(char *name) { // this is the public f } return strdup(variables.default_net_write_timeout); } + if (!strcasecmp(name,"default_max_join_size")) { + if (variables.default_max_join_size==NULL) { + variables.default_max_join_size=strdup((char *)MYSQL_DEFAULT_MAX_JOIN_SIZE); + } + return strdup(variables.default_max_join_size); + } if (!strcasecmp(name,"server_version")) return strdup(variables.server_version); if (!strcasecmp(name,"auditlog_filename")) return strdup(variables.auditlog_filename); if (!strcasecmp(name,"eventslog_filename")) return strdup(variables.eventslog_filename); @@ -2320,6 +2334,19 @@ bool MySQL_Threads_Handler::set_variable(char *name, char *value) { // this is t return true; } + if (!strcasecmp(name,"default_max_join_size")) { + if (variables.default_max_join_size) free(variables.default_max_join_size); + variables.default_max_join_size=NULL; + if (vallen) { + if (strcmp(value,"(null)")) + variables.default_max_join_size=strdup(value); + } + if (variables.default_max_join_size==NULL) { + variables.default_max_join_size=strdup((char *)MYSQL_DEFAULT_MAX_JOIN_SIZE); // default + } + return true; + } + if (!strcasecmp(name,"keep_multiplexing_variables")) { if (vallen) { free(variables.keep_multiplexing_variables); @@ -2938,6 +2965,7 @@ MySQL_Threads_Handler::~MySQL_Threads_Handler() { if (variables.default_sql_safe_updates) free(variables.default_sql_safe_updates); if (variables.default_collation_connection) free(variables.default_collation_connection); if (variables.default_net_write_timeout) free(variables.default_net_write_timeout); + if (variables.default_max_join_size) free(variables.default_max_join_size); if (variables.eventslog_filename) free(variables.eventslog_filename); if (variables.auditlog_filename) free(variables.auditlog_filename); if (variables.ssl_p2s_ca) free(variables.ssl_p2s_ca); @@ -3066,6 +3094,7 @@ MySQL_Thread::~MySQL_Thread() { if (mysql_thread___default_sql_safe_updates) { free(mysql_thread___default_sql_safe_updates); mysql_thread___default_sql_safe_updates=NULL; } if (mysql_thread___default_collation_connection) { free(mysql_thread___default_collation_connection); mysql_thread___default_collation_connection=NULL; } if (mysql_thread___default_net_write_timeout) { free(mysql_thread___default_net_write_timeout); mysql_thread___default_net_write_timeout=NULL; } + if (mysql_thread___default_max_join_size) { free(mysql_thread___default_max_join_size); mysql_thread___default_max_join_size=NULL; } if (mysql_thread___eventslog_filename) { free(mysql_thread___eventslog_filename); mysql_thread___eventslog_filename=NULL; } if (mysql_thread___auditlog_filename) { free(mysql_thread___auditlog_filename); mysql_thread___auditlog_filename=NULL; } if (mysql_thread___ssl_p2s_ca) { free(mysql_thread___ssl_p2s_ca); mysql_thread___ssl_p2s_ca=NULL; } @@ -3176,6 +3205,13 @@ MySQL_Session * MySQL_Thread::create_new_session_and_client_data_stream(int _fd) } sess->client_myds->myconn->options.net_write_timeout=strdup(mysql_thread___default_net_write_timeout); + uint32_t max_join_size_int=SpookyHash::Hash32(mysql_thread___default_max_join_size,strlen(mysql_thread___default_max_join_size),10); + sess->client_myds->myconn->options.max_join_size_int = max_join_size_int; + if (sess->client_myds->myconn->options.max_join_size) { + free(sess->client_myds->myconn->options.max_join_size); + } + sess->client_myds->myconn->options.max_join_size=strdup(mysql_thread___default_max_join_size); + return sess; } @@ -4251,6 +4287,8 @@ void MySQL_Thread::refresh_variables() { mysql_thread___default_collation_connection=GloMTH->get_variable_string((char *)"default_collation_connection"); if (mysql_thread___default_net_write_timeout) free(mysql_thread___default_net_write_timeout); mysql_thread___default_net_write_timeout=GloMTH->get_variable_string((char *)"default_net_write_timeout"); + if (mysql_thread___default_max_join_size) free(mysql_thread___default_max_join_size); + mysql_thread___default_max_join_size=GloMTH->get_variable_string((char *)"default_max_join_size"); if (mysql_thread___server_version) free(mysql_thread___server_version); mysql_thread___server_version=GloMTH->get_variable_string((char *)"server_version"); if (mysql_thread___eventslog_filename) free(mysql_thread___eventslog_filename); diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 4988ccdc7..310367da5 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -214,6 +214,7 @@ MySQL_Connection::MySQL_Connection() { options.sql_safe_updates = NULL; options.collation_connection = NULL; options.net_write_timeout = NULL; + options.max_join_size = NULL; options.isolation_level_sent = false; options.character_set_results_sent = false; options.session_track_gtids_sent = false; @@ -222,6 +223,7 @@ MySQL_Connection::MySQL_Connection() { options.sql_safe_updates_sent = false; options.collation_connection_sent = false; options.net_write_timeout_sent = false; + options.max_join_size_sent = false; options.sql_mode_sent=false; options.ldap_user_variable=NULL; options.ldap_user_variable_value=NULL; @@ -268,6 +270,7 @@ MySQL_Connection::~MySQL_Connection() { if (options.sql_safe_updates) free(options.sql_safe_updates); if (options.collation_connection) free(options.collation_connection); if (options.net_write_timeout) free(options.net_write_timeout); + if (options.max_join_size) free(options.max_join_size); if (options.ldap_user_variable) free(options.ldap_user_variable); if (options.ldap_user_variable_value) free(options.ldap_user_variable_value); if (userinfo) { @@ -2069,6 +2072,12 @@ void MySQL_Connection::reset() { options.net_write_timeout = NULL; options.net_write_timeout_sent = false; } + options.max_join_size_int = 0; + if (options.max_join_size) { + free (options.max_join_size); + options.max_join_size = NULL; + options.max_join_size_sent = false; + } if (options.init_connect) { free(options.init_connect); options.init_connect = NULL; diff --git a/test/set_parser_test/setparsertest.cpp b/test/set_parser_test/setparsertest.cpp index 3bab24b55..22ef30499 100644 --- a/test/set_parser_test/setparsertest.cpp +++ b/test/set_parser_test/setparsertest.cpp @@ -124,6 +124,7 @@ static Test time_zone[] = { { "SET @@time_zone = \"Europe/Paris\"", { Expected("time_zone", {"Europe/Paris"}) } }, { "SET @@time_zone = \"+00:00\"", { Expected("time_zone", {"+00:00"}) } }, { "SET @@time_zone = @OLD_TIME_ZONE", { Expected("time_zone", {"@OLD_TIME_ZONE"}) } }, + { "SET @@TIME_ZONE = @OLD_TIME_ZONE", { Expected("time_zone", {"@OLD_TIME_ZONE"}) } }, }; TEST(TestParse, SET_TIME_ZONE) { @@ -166,6 +167,29 @@ static Test names[] = { TEST(TestParse, SET_NAMES) { TestParse(names, arraysize(names), "names"); } +static Test various[] = { + { "SET @@SESSION.SQL_SELECT_LIMIT= DEFAULT", { Expected("sql_select_limit", {"DEFAULT"}) } }, + { "SET @@SQL_SELECT_LIMIT= DEFAULT", { Expected("sql_select_limit", {"DEFAULT"}) } }, + { "SET SESSION SQL_SELECT_LIMIT = DEFAULT", { Expected("sql_select_limit", {"DEFAULT"}) } }, + { "SET @@SESSION.SQL_SELECT_LIMIT= 1234", { Expected("sql_select_limit", {"1234"}) } }, + { "SET @@SQL_SELECT_LIMIT= 1234", { Expected("sql_select_limit", {"1234"}) } }, + { "SET SESSION SQL_SELECT_LIMIT = 1234", { Expected("sql_select_limit", {"1234"}) } }, + { "SET @@SESSION.SQL_SELECT_LIMIT= 1234", { Expected("sql_select_limit", {"1234"}) } }, + { "SET @@SESSION.SQL_SELECT_LIMIT= @old_sql_select_limit", { Expected("sql_select_limit", {"@old_sql_select_limit"}) } }, + { "SET SQL_SELECT_LIMIT= @old_sql_select_limit", { Expected("sql_select_limit", {"@old_sql_select_limit"}) } }, + { "SET @@SESSION.sql_auto_is_null = 0", { Expected("sql_auto_is_null", {"0"}) } }, + { "SET SESSION sql_auto_is_null = 1", { Expected("sql_auto_is_null", {"1"}) } }, + { "SET sql_auto_is_null = OFF", { Expected("sql_auto_is_null", {"OFF"}) } }, + { "SET @@sql_auto_is_null = ON", { Expected("sql_auto_is_null", {"ON"}) } }, + { "SET @@SESSION.sql_safe_updates = 0", { Expected("sql_safe_updates", {"0"}) } }, + { "SET SESSION sql_safe_updates = 1", { Expected("sql_safe_updates", {"1"}) } }, + { "SET SQL_SAFE_UPDATES = OFF", { Expected("sql_safe_updates", {"OFF"}) } }, + { "SET @@sql_safe_updates = ON", { Expected("sql_safe_updates", {"ON"}) } }, +}; + +TEST(TestParse, SET_VARIOUS) { + TestParse(various, arraysize(various), "various"); +} static Test multiple[] = { { "SET time_zone = 'Europe/Paris', sql_mode = 'TRADITIONAL'", { Expected("time_zone", {"Europe/Paris"}), Expected("sql_mode", {"TRADITIONAL"}) } }, From 197a46ea0da38b940c32366886b3787fe0753959 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Thu, 29 Aug 2019 11:13:06 +1000 Subject: [PATCH 07/14] More on functions for tracking more variables Extended JSON output Temporary disabled the logic on tracking more variables as it causes crashes: we need further testing. --- lib/MySQL_Session.cpp | 221 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 217 insertions(+), 4 deletions(-) diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 14f568e0a..e72851fa3 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -23,6 +23,11 @@ #define EXPMARIA +static inline char is_digit(char c) { + if(c >= '0' && c <= '9') + return 1; + return 0; +} static inline char is_normal_char(char c) { if(c >= 'a' && c <= 'z') return 1; @@ -918,6 +923,15 @@ void MySQL_Session::generate_proxysql_internal_session_json(json &j) { j["transaction_persistent"] = transaction_persistent; j["conn"]["sql_mode"] = ( client_myds->myconn->options.sql_mode ? client_myds->myconn->options.sql_mode : "") ; j["conn"]["time_zone"] = ( client_myds->myconn->options.time_zone ? client_myds->myconn->options.time_zone : "") ; + j["conn"]["isolation_level"] = ( client_myds->myconn->options.isolation_level ? client_myds->myconn->options.isolation_level : "") ; + j["conn"]["character_set_results"] = ( client_myds->myconn->options.character_set_results ? client_myds->myconn->options.character_set_results : "") ; + j["conn"]["session_track_gtids"] = ( client_myds->myconn->options.session_track_gtids ? client_myds->myconn->options.session_track_gtids : "") ; + j["conn"]["sql_auto_is_null"] = ( client_myds->myconn->options.sql_auto_is_null ? client_myds->myconn->options.sql_auto_is_null : "") ; + j["conn"]["sql_select_limit"] = ( client_myds->myconn->options.sql_select_limit ? client_myds->myconn->options.sql_select_limit : "") ; + j["conn"]["sql_safe_updates"] = ( client_myds->myconn->options.sql_safe_updates ? client_myds->myconn->options.sql_safe_updates : "") ; + j["conn"]["collation_connection"] = ( client_myds->myconn->options.collation_connection ? client_myds->myconn->options.collation_connection : "") ; + j["conn"]["net_write_timeout"] = ( client_myds->myconn->options.net_write_timeout ? client_myds->myconn->options.net_write_timeout : "") ; + j["conn"]["max_join_size"] = ( client_myds->myconn->options.max_join_size ? client_myds->myconn->options.max_join_size : "") ; j["conn"]["charset"] = client_myds->myconn->options.charset; j["conn"]["sql_log_bin"] = client_myds->myconn->options.sql_log_bin; j["conn"]["autocommit"] = client_myds->myconn->options.autocommit; @@ -962,6 +976,15 @@ void MySQL_Session::generate_proxysql_internal_session_json(json &j) { j["backends"][i]["conn"]["sql_mode"] = ( _myconn->options.sql_mode ? _myconn->options.sql_mode : "") ; j["backends"][i]["conn"]["sql_mode_sent"] = _myds->myconn->options.sql_mode_sent; j["backends"][i]["conn"]["time_zone"] = ( _myconn->options.time_zone ? _myconn->options.time_zone : "") ; + j["backends"][i]["conn"]["isolation_level"] = ( _myconn->options.isolation_level ? _myconn->options.isolation_level : "") ; + j["backends"][i]["conn"]["character_set_results"] = ( _myconn->options.character_set_results ? _myconn->options.character_set_results : "") ; + j["backends"][i]["conn"]["session_track_gtids"] = ( _myconn->options.session_track_gtids ? _myconn->options.session_track_gtids : "") ; + j["backends"][i]["conn"]["sql_auto_is_null"] = ( _myconn->options.sql_auto_is_null ? _myconn->options.sql_auto_is_null : "") ; + j["backends"][i]["conn"]["sql_select_limit"] = ( _myconn->options.sql_select_limit ? _myconn->options.sql_select_limit : "") ; + j["backends"][i]["conn"]["sql_safe_updates"] = ( _myconn->options.sql_safe_updates ? _myconn->options.sql_safe_updates : "") ; + j["backends"][i]["conn"]["collation_connection"] = ( _myconn->options.collation_connection ? _myconn->options.collation_connection : "") ; + j["backends"][i]["conn"]["net_write_timeout"] = ( _myconn->options.net_write_timeout ? _myconn->options.net_write_timeout : "") ; + j["backends"][i]["conn"]["max_join_size"] = ( _myconn->options.max_join_size ? _myconn->options.max_join_size : "") ; //j["backend"][i]["conn"]["charset"] = _myds->myconn->options.charset; // not used for backend j["backends"][i]["conn"]["sql_log_bin"] = _myconn->options.sql_log_bin; j["backends"][i]["conn"]["init_connect"] = ( _myconn->options.init_connect ? _myconn->options.init_connect : ""); @@ -3678,6 +3701,7 @@ handler_again: if (handler_again___verify_backend_time_zone()) { goto handler_again; } +/* if (handler_again___verify_backend_isolation_level()) { goto handler_again; } @@ -3705,6 +3729,7 @@ handler_again: if (handler_again___verify_backend_max_join_size()) { goto handler_again; } +*/ } if (status==PROCESSING_STMT_EXECUTE) { CurrentQuery.mysql_stmt=myconn->local_stmts->find_backend_stmt_by_global_id(CurrentQuery.stmt_global_id); @@ -5230,6 +5255,80 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C exit_after_SetParse = true; } } + } else if (var == "sql_auto_is_null") { + std::string value1 = *values; + proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Processing SET sql_auto_is_null value %s\n", value1.c_str()); + int __tmp_value = -1; + if ( + (strcasecmp(value1.c_str(),(char *)"0")==0) || + (strcasecmp(value1.c_str(),(char *)"false")==0) || + (strcasecmp(value1.c_str(),(char *)"off")==0) + ) { + __tmp_value = 0; + } else { + if ( + (strcasecmp(value1.c_str(),(char *)"1")==0) || + (strcasecmp(value1.c_str(),(char *)"true")==0) || + (strcasecmp(value1.c_str(),(char *)"on")==0) + ) { + __tmp_value = 1; + } + } + if (__tmp_value >= 0) { + proxy_debug(PROXY_DEBUG_MYSQL_COM, 7, "Processing SET sql_auto_is_null value %s\n", value1.c_str()); + uint32_t sql_auto_is_null_int=SpookyHash::Hash32(value1.c_str(),value1.length(),10); + if (client_myds->myconn->options.sql_auto_is_null_int != sql_auto_is_null_int) { + client_myds->myconn->options.sql_auto_is_null_int = sql_auto_is_null_int; + if (client_myds->myconn->options.sql_auto_is_null) { + free(client_myds->myconn->options.sql_auto_is_null); + } + proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection sql_auto_is_null to %s\n", value1.c_str()); + client_myds->myconn->options.sql_auto_is_null=strdup(value1.c_str()); + } + } else { +#ifdef DEBUG + string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); +#endif + *lock_hostgroup = true; + } + } else if (var == "sql_safe_updates") { + std::string value1 = *values; + proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Processing SET sql_safe_updates value %s\n", value1.c_str()); + int __tmp_value = -1; + if ( + (strcasecmp(value1.c_str(),(char *)"0")==0) || + (strcasecmp(value1.c_str(),(char *)"false")==0) || + (strcasecmp(value1.c_str(),(char *)"off")==0) + ) { + __tmp_value = 0; + } else { + if ( + (strcasecmp(value1.c_str(),(char *)"1")==0) || + (strcasecmp(value1.c_str(),(char *)"true")==0) || + (strcasecmp(value1.c_str(),(char *)"on")==0) + ) { + __tmp_value = 1; + } + } + if (__tmp_value >= 0) { + proxy_debug(PROXY_DEBUG_MYSQL_COM, 7, "Processing SET sql_safe_updates value %s\n", value1.c_str()); + uint32_t sql_safe_updates_int=SpookyHash::Hash32(value1.c_str(),value1.length(),10); + if (client_myds->myconn->options.sql_safe_updates_int != sql_safe_updates_int) { + client_myds->myconn->options.sql_safe_updates_int = sql_safe_updates_int; + if (client_myds->myconn->options.sql_safe_updates) { + free(client_myds->myconn->options.sql_safe_updates); + } + proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection sql_safe_updates to %s\n", value1.c_str()); + client_myds->myconn->options.sql_safe_updates=strdup(value1.c_str()); + } + } else { +#ifdef DEBUG + string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); +#endif + *lock_hostgroup = true; + } } else if (var == "autocommit") { std::string value1 = *values; std::size_t found_at = value1.find("@"); @@ -5326,18 +5425,131 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); #endif + *lock_hostgroup = true; + } + } else if (var == "max_join_size") { + std::string value1 = *values; + int vl = strlen(value1.c_str()); + const char *v = value1.c_str(); + bool only_digit_chars = true; + for (int i=0; imyconn->options.max_join_size_int != max_join_size_int) { + client_myds->myconn->options.max_join_size_int = max_join_size_int; + if (client_myds->myconn->options.max_join_size) { + free(client_myds->myconn->options.max_join_size); + } + proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection max_join_size to %s\n", value1.c_str()); + client_myds->myconn->options.max_join_size=strdup(value1.c_str()); + } + } else { +#ifdef DEBUG + string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); +#endif + *lock_hostgroup = true; + } + } else if (var == "net_write_timeout") { + std::string value1 = *values; + int vl = strlen(value1.c_str()); + const char *v = value1.c_str(); + bool only_digit_chars = true; + for (int i=0; imyconn->options.net_write_timeout_int != net_write_timeout_int) { + client_myds->myconn->options.net_write_timeout_int = net_write_timeout_int; + if (client_myds->myconn->options.net_write_timeout) { + free(client_myds->myconn->options.net_write_timeout); + } + proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection net_write_timeout to %s\n", value1.c_str()); + client_myds->myconn->options.net_write_timeout=strdup(value1.c_str()); + } + } else { +#ifdef DEBUG + string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); +#endif + *lock_hostgroup = true; + } + } else if (var == "sql_select_limit") { + std::string value1 = *values; + int vl = strlen(value1.c_str()); + const char *v = value1.c_str(); + bool only_digit_chars = true; + for (int i=0; imyconn->options.sql_select_limit_int != sql_select_limit_int) { + client_myds->myconn->options.sql_select_limit_int = sql_select_limit_int; + if (client_myds->myconn->options.sql_select_limit) { + free(client_myds->myconn->options.sql_select_limit); + } + proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection sql_select_limit to %s\n", value1.c_str()); + client_myds->myconn->options.sql_select_limit=strdup(value1.c_str()); + } + } else { +#ifdef DEBUG + string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); +#endif + *lock_hostgroup = true; + } + } else if (var == "collation_connection") { + std::string value1 = *values; + int vl = strlen(value1.c_str()); + const char *v = value1.c_str(); + bool only_normal_chars = true; + for (int i=0; imyconn->options.collation_connection_int != collation_connection_int) { + client_myds->myconn->options.collation_connection_int = collation_connection_int; + if (client_myds->myconn->options.collation_connection) { + free(client_myds->myconn->options.collation_connection); + } + proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection collation_connection to %s\n", value1.c_str()); + client_myds->myconn->options.collation_connection=strdup(value1.c_str()); + } + } else { +#ifdef DEBUG + string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); +#endif + *lock_hostgroup = true; } } else if (var == "character_set_results") { std::string value1 = *values; int vl = strlen(value1.c_str()); const char *v = value1.c_str(); - bool only_nomal_chars = true; - for (int i=0; imyconn->options.character_set_results_int != character_set_results_int) { @@ -5353,6 +5565,7 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); #endif + *lock_hostgroup = true; } } else if (var == "names") { std::string value1 = *values++; From c520866058a02b25b2455666a022ed08b39d1f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Mon, 2 Sep 2019 11:09:56 +1000 Subject: [PATCH 08/14] More on functions for tracking more variables --- include/MySQL_Thread.h | 12 ++++++------ lib/MySQL_Session.cpp | 19 ++++++++++++------- lib/mysql_connection.cpp | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 13 deletions(-) diff --git a/include/MySQL_Thread.h b/include/MySQL_Thread.h index ac3958a6f..4e73681b5 100644 --- a/include/MySQL_Thread.h +++ b/include/MySQL_Thread.h @@ -19,12 +19,12 @@ #define MYSQL_DEFAULT_SQL_MODE "" #define MYSQL_DEFAULT_TIME_ZONE "SYSTEM" -#define MYSQL_DEFAULT_ISOLATION_LEVEL "" -#define MYSQL_DEFAULT_CHARACTER_SET_RESULTS "" -#define MYSQL_DEFAULT_SESSION_TRACK_GTIDS "" -#define MYSQL_DEFAULT_SQL_AUTO_IS_NULL "" -#define MYSQL_DEFAULT_SQL_SELECT_LIMIT "" -#define MYSQL_DEFAULT_SQL_SAFE_UPDATES "" +#define MYSQL_DEFAULT_ISOLATION_LEVEL "READ COMMITTED" +#define MYSQL_DEFAULT_CHARACTER_SET_RESULTS "NULL" +#define MYSQL_DEFAULT_SESSION_TRACK_GTIDS "OFF" +#define MYSQL_DEFAULT_SQL_AUTO_IS_NULL "OFF" +#define MYSQL_DEFAULT_SQL_SELECT_LIMIT "DEFAULT" +#define MYSQL_DEFAULT_SQL_SAFE_UPDATES "OFF" #define MYSQL_DEFAULT_COLLATION_CONNECTION "" #define MYSQL_DEFAULT_NET_WRITE_TIMEOUT "60" #define MYSQL_DEFAULT_MAX_JOIN_SIZE "18446744073709551615" diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index e72851fa3..1e2fb0860 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -1639,7 +1639,7 @@ bool MySQL_Session::handler_again___verify_backend__generic_variable(uint32_t *b // fe_int = frontend int (has) // fe_var = frontend value if (*be_int == 0) { - // it is the first time we use this backend. Set isolation_level to default + // it is the first time we use this backend. Set value to default if (*be_var) { free(*be_var); *be_var = NULL; @@ -1655,9 +1655,9 @@ bool MySQL_Session::handler_again___verify_backend__generic_variable(uint32_t *b if (*be_var) { free(*be_var); *be_var = NULL; - if (fe_var) { - *be_var = strdup(fe_var); - } + } + if (fe_var) { + *be_var = strdup(fe_var); } } switch(status) { // this switch can be replaced with a simple previous_status.push(status), but it is here for readibility @@ -2009,6 +2009,7 @@ bool MySQL_Session::handler_again___status_SETTING_INIT_CONNECT(int *_rc) { if (rc==0) { myds->revents|=POLLOUT; // we also set again POLLOUT to send a query immediately! //myds->free_mysql_real_query(); + myds->DSS = STATE_MARIADB_GENERIC; st=previous_status.top(); previous_status.pop(); NEXT_IMMEDIATE_NEW(st); @@ -2068,6 +2069,7 @@ bool MySQL_Session::handler_again___status_SETTING_LDAP_USER_VARIABLE(int *_rc) ) { // nothing to do myds->revents|=POLLOUT; // we also set again POLLOUT to send a query immediately! //myds->free_mysql_real_query(); + myds->DSS = STATE_MARIADB_GENERIC; st=previous_status.top(); previous_status.pop(); NEXT_IMMEDIATE_NEW(st); @@ -2097,6 +2099,7 @@ bool MySQL_Session::handler_again___status_SETTING_LDAP_USER_VARIABLE(int *_rc) if (rc==0) { myds->revents|=POLLOUT; // we also set again POLLOUT to send a query immediately! //myds->free_mysql_real_query(); + myds->DSS = STATE_MARIADB_GENERIC; st=previous_status.top(); previous_status.pop(); NEXT_IMMEDIATE_NEW(st); @@ -2172,6 +2175,7 @@ bool MySQL_Session::handler_again___status_SETTING_SQL_LOG_BIN(int *_rc) { myconn->set_status_sql_log_bin0(false); } myds->revents|=POLLOUT; // we also set again POLLOUT to send a query immediately! + myds->DSS = STATE_MARIADB_GENERIC; st=previous_status.top(); previous_status.pop(); NEXT_IMMEDIATE_NEW(st); @@ -2342,7 +2346,7 @@ bool MySQL_Session::handler_again___status_SETTING_GENERIC_VARIABLE(int *_rc, ch q=(char *)"SET %s=%s"; } else { q=(char *)"SET %s='%s'"; // default - if (var_value[0]=='@') { + if (var_value[0] && var_value[0]=='@') { q=(char *)"SET %s=%s";} if (strncasecmp(var_value,(char *)"CONCAT",6)==0) q=(char *)"SET %s=%s"; @@ -2362,6 +2366,7 @@ bool MySQL_Session::handler_again___status_SETTING_GENERIC_VARIABLE(int *_rc, ch } if (rc==0) { myds->revents|=POLLOUT; // we also set again POLLOUT to send a query immediately! + myds->DSS = STATE_MARIADB_GENERIC; st=previous_status.top(); previous_status.pop(); NEXT_IMMEDIATE_NEW(st); @@ -2490,6 +2495,7 @@ bool MySQL_Session::handler_again___status_CHANGING_SCHEMA(int *_rc) { if (rc==0) { __sync_fetch_and_add(&MyHGM->status.backend_init_db, 1); myds->myconn->userinfo->set(client_myds->myconn->userinfo); + myds->DSS = STATE_MARIADB_GENERIC; st=previous_status.top(); previous_status.pop(); NEXT_IMMEDIATE_NEW(st); @@ -2776,6 +2782,7 @@ bool MySQL_Session::handler_again___status_CHANGING_CHARSET(int *_rc) { int rc=myconn->async_set_names(myds->revents, client_myds->myconn->options.charset); if (rc==0) { __sync_fetch_and_add(&MyHGM->status.backend_set_names, 1); + myds->DSS = STATE_MARIADB_GENERIC; st=previous_status.top(); previous_status.pop(); NEXT_IMMEDIATE_NEW(st); @@ -3701,7 +3708,6 @@ handler_again: if (handler_again___verify_backend_time_zone()) { goto handler_again; } -/* if (handler_again___verify_backend_isolation_level()) { goto handler_again; } @@ -3729,7 +3735,6 @@ handler_again: if (handler_again___verify_backend_max_join_size()) { goto handler_again; } -*/ } if (status==PROCESSING_STMT_EXECUTE) { CurrentQuery.mysql_stmt=myconn->local_stmts->find_backend_stmt_by_global_id(CurrentQuery.stmt_global_id); diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 310367da5..8311eaddc 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -318,6 +318,42 @@ MySQL_Connection::~MySQL_Connection() { free(options.time_zone); options.time_zone=NULL; } + if (options.isolation_level) { + free(options.isolation_level); + options.isolation_level=NULL; + } + if (options.character_set_results) { + free(options.character_set_results); + options.character_set_results=NULL; + } + if (options.session_track_gtids) { + free(options.session_track_gtids); + options.session_track_gtids=NULL; + } + if (options.sql_auto_is_null) { + free(options.sql_auto_is_null); + options.sql_auto_is_null=NULL; + } + if (options.sql_select_limit) { + free(options.sql_select_limit); + options.sql_select_limit=NULL; + } + if (options.sql_safe_updates) { + free(options.sql_safe_updates); + options.sql_safe_updates=NULL; + } + if (options.collation_connection) { + free(options.collation_connection); + options.collation_connection=NULL; + } + if (options.net_write_timeout) { + free(options.net_write_timeout); + options.net_write_timeout=NULL; + } + if (options.max_join_size) { + free(options.max_join_size); + options.max_join_size=NULL; + } }; bool MySQL_Connection::set_autocommit(bool _ac) { From e85c34b2952f5a05d3f02a8afca30c0de334d898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Mon, 2 Sep 2019 14:00:10 +1000 Subject: [PATCH 09/14] Fix a crash detected by valgrind --- lib/configfile.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/configfile.cpp b/lib/configfile.cpp index b09e62f1c..9565896f4 100644 --- a/lib/configfile.cpp +++ b/lib/configfile.cpp @@ -67,7 +67,11 @@ bool ProxySQL_ConfigFile::OpenFile(const char *__filename) { }; void ProxySQL_ConfigFile::CloseFile() { - delete cfg; +/* FIXME + for now we are commenting out this. + It seems that after upgrade to jemalloc 5.2.0 , valgrind crashes here +*/ +// delete cfg; cfg=NULL; } From 7b83ad53e0f1c449f9c795c839328e4e0583d3b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Mon, 2 Sep 2019 23:11:11 +1000 Subject: [PATCH 10/14] Remove double frees --- lib/mysql_connection.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 8311eaddc..18871986c 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -262,15 +262,6 @@ MySQL_Connection::~MySQL_Connection() { proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Destroying MySQL_Connection %p\n", this); if (options.server_version) free(options.server_version); if (options.init_connect) free(options.init_connect); - if (options.character_set_results) free(options.character_set_results); - if (options.session_track_gtids) free(options.session_track_gtids); - if (options.isolation_level) free(options.isolation_level); - if (options.sql_auto_is_null) free(options.sql_auto_is_null); - if (options.sql_select_limit) free(options.sql_select_limit); - if (options.sql_safe_updates) free(options.sql_safe_updates); - if (options.collation_connection) free(options.collation_connection); - if (options.net_write_timeout) free(options.net_write_timeout); - if (options.max_join_size) free(options.max_join_size); if (options.ldap_user_variable) free(options.ldap_user_variable); if (options.ldap_user_variable_value) free(options.ldap_user_variable_value); if (userinfo) { From 3f0b5c7ceb13753a6a8774353325dc77e59efc27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Mon, 2 Sep 2019 23:13:00 +1000 Subject: [PATCH 11/14] Fixed a state in generate_pkt_ERR --- lib/MySQL_Protocol.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/MySQL_Protocol.cpp b/lib/MySQL_Protocol.cpp index 530a471d2..6e10efc47 100644 --- a/lib/MySQL_Protocol.cpp +++ b/lib/MySQL_Protocol.cpp @@ -569,6 +569,7 @@ bool MySQL_Protocol::generate_pkt_ERR(bool send, void **ptr, unsigned int *len, case STATE_CLIENT_HANDSHAKE: case STATE_QUERY_SENT_DS: case STATE_QUERY_SENT_NET: + case STATE_ERR: (*myds)->DSS=STATE_ERR; break; case STATE_OK: From beabd5e66aef3ef86fad919dfc7c57dffcab82ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Tue, 3 Sep 2019 00:35:39 +1000 Subject: [PATCH 12/14] Fixing some unitialized variables --- lib/MySQL_Protocol.cpp | 2 +- lib/mysql_connection.cpp | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/MySQL_Protocol.cpp b/lib/MySQL_Protocol.cpp index 6e10efc47..c6f1f1236 100644 --- a/lib/MySQL_Protocol.cpp +++ b/lib/MySQL_Protocol.cpp @@ -1465,7 +1465,7 @@ bool MySQL_Protocol::process_pkt_COM_CHANGE_USER(unsigned char *pkt, unsigned in bool MySQL_Protocol::process_pkt_handshake_response(unsigned char *pkt, unsigned int len) { bool ret=false; uint8_t charset; - uint32_t capabilities; + uint32_t capabilities = 0; uint32_t max_pkt; uint32_t pass_len; unsigned char *user=NULL; diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 18871986c..2c2637b10 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -233,6 +233,15 @@ MySQL_Connection::MySQL_Connection() { options.sql_mode_int=0; // #509 options.time_zone=NULL; // #819 options.time_zone_int=0; // #819 + options.isolation_level_int=0; + options.character_set_results_int=0; + options.session_track_gtids_int=0; + options.sql_auto_is_null_int=0; + options.sql_select_limit_int=0; + options.sql_safe_updates_int=0; + options.collation_connection_int=0; + options.net_write_timeout_int=0; + options.max_join_size_int=0; compression_pkt_id=0; mysql_result=NULL; query.ptr=NULL; From aaf83eec781ef0a9727239d6472aab704db43783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Mon, 9 Sep 2019 14:42:27 +1000 Subject: [PATCH 13/14] Finalizing the support for more session variables Initial support for `SET SESSION TRANSACTION READ ONLY` or `READ WRITE`. Extended `SET` parser to support also `SET SESSION TRANSACTION`. Hostgroup Manager doesn't kill backend connections in case of error 1231. `autocommit` is set at session level but also on MySQL client connection. Added several debugging entries. Several `handler_again___verify_backend_*` functions are disabled if `locked_on_hostgroup` is enabled. --- include/MySQL_Session.h | 5 +- include/MySQL_Thread.h | 2 + include/mysql_connection.h | 3 + include/proxysql_structs.h | 3 + include/set_parser.h | 3 +- lib/MySQL_HostGroups_Manager.cpp | 44 +-- lib/MySQL_Session.cpp | 461 ++++++++++++++++++++----------- lib/MySQL_Thread.cpp | 42 ++- lib/mysql_connection.cpp | 19 +- lib/set_parser.cpp | 70 ++++- src/events.log.00000004 | 15 + src/events.log.00000005 | 15 + 12 files changed, 487 insertions(+), 195 deletions(-) create mode 100644 src/events.log.00000004 create mode 100644 src/events.log.00000005 diff --git a/include/MySQL_Session.h b/include/MySQL_Session.h index b4bc4cfe8..d2ce03fe6 100644 --- a/include/MySQL_Session.h +++ b/include/MySQL_Session.h @@ -115,6 +115,7 @@ class MySQL_Session bool handler_again___verify_backend_sql_mode(); bool handler_again___verify_backend_time_zone(); bool handler_again___verify_backend_isolation_level(); + bool handler_again___verify_backend_transaction_read(); bool handler_again___verify_backend_character_set_results(); bool handler_again___verify_backend_session_track_gtids(); bool handler_again___verify_backend_sql_auto_is_null(); @@ -130,6 +131,7 @@ class MySQL_Session bool handler_again___status_SETTING_SQL_MODE(int *); bool handler_again___status_SETTING_TIME_ZONE(int *); bool handler_again___status_SETTING_ISOLATION_LEVEL(int *); + bool handler_again___status_SETTING_TRANSACTION_READ(int *); bool handler_again___status_SETTING_CHARACTER_SET_RESULTS(int *); bool handler_again___status_SETTING_SESSION_TRACK_GTIDS(int *); bool handler_again___status_SETTING_SQL_AUTO_IS_NULL(int *); @@ -138,7 +140,7 @@ class MySQL_Session bool handler_again___status_SETTING_COLLATION_CONNECTION(int *); bool handler_again___status_SETTING_NET_WRITE_TIMEOUT(int *); bool handler_again___status_SETTING_MAX_JOIN_SIZE(int *); - bool handler_again___status_SETTING_GENERIC_VARIABLE(int *, char *, char *, bool no_quote=false); + bool handler_again___status_SETTING_GENERIC_VARIABLE(int *_rc, char *var_name, char *var_value, bool no_quote=false, bool set_transaction=false); bool handler_again___status_CHANGING_SCHEMA(int *); bool handler_again___status_CONNECTING_SERVER(int *); bool handler_again___status_CHANGING_USER_SERVER(int *); @@ -265,6 +267,7 @@ class MySQL_Session void finishQuery(MySQL_Data_Stream *myds, MySQL_Connection *myconn, bool); void generate_proxysql_internal_session_json(json &); bool known_query_for_locked_on_hostgroup(uint64_t); + void unable_to_parse_set_statement(bool *); }; #define KILL_QUERY 1 diff --git a/include/MySQL_Thread.h b/include/MySQL_Thread.h index 4e73681b5..362fd6a7e 100644 --- a/include/MySQL_Thread.h +++ b/include/MySQL_Thread.h @@ -20,6 +20,7 @@ #define MYSQL_DEFAULT_SQL_MODE "" #define MYSQL_DEFAULT_TIME_ZONE "SYSTEM" #define MYSQL_DEFAULT_ISOLATION_LEVEL "READ COMMITTED" +#define MYSQL_DEFAULT_TRANSACTION_READ "WRITE" #define MYSQL_DEFAULT_CHARACTER_SET_RESULTS "NULL" #define MYSQL_DEFAULT_SESSION_TRACK_GTIDS "OFF" #define MYSQL_DEFAULT_SQL_AUTO_IS_NULL "OFF" @@ -451,6 +452,7 @@ class MySQL_Threads_Handler char *default_sql_mode; char *default_time_zone; char *default_isolation_level; + char *default_transaction_read; char *default_character_set_results; char *default_session_track_gtids; char *default_sql_auto_is_null; diff --git a/include/mysql_connection.h b/include/mysql_connection.h index eda57a72c..9fd7b90ac 100644 --- a/include/mysql_connection.h +++ b/include/mysql_connection.h @@ -46,6 +46,7 @@ class MySQL_Connection { uint32_t time_zone_int; uint32_t character_set_results_int; uint32_t isolation_level_int; + uint32_t transaction_read_int; uint32_t session_track_gtids_int; uint32_t sql_auto_is_null_int; uint32_t sql_select_limit_int; @@ -61,6 +62,7 @@ class MySQL_Connection { bool init_connect_sent; char * character_set_results; char * isolation_level; + char * transaction_read; char * session_track_gtids; char * sql_auto_is_null; char * sql_select_limit; @@ -69,6 +71,7 @@ class MySQL_Connection { char * net_write_timeout; char * max_join_size; bool isolation_level_sent; + bool transaction_read_sent; bool character_set_results_sent; bool session_track_gtids_sent; bool sql_auto_is_null_sent; diff --git a/include/proxysql_structs.h b/include/proxysql_structs.h index 5f26ec595..6a452cae6 100644 --- a/include/proxysql_structs.h +++ b/include/proxysql_structs.h @@ -153,6 +153,7 @@ enum session_status { SETTING_SQL_MODE, SETTING_TIME_ZONE, SETTING_ISOLATION_LEVEL, + SETTING_TRANSACTION_READ, SETTING_CHARACTER_SET_RESULTS, SETTING_SESSION_TRACK_GTIDS, SETTING_SQL_AUTO_IS_NULL, @@ -622,6 +623,7 @@ __thread char *mysql_thread___ldap_user_variable; __thread char *mysql_thread___default_sql_mode; __thread char *mysql_thread___default_time_zone; __thread char *mysql_thread___default_isolation_level; +__thread char *mysql_thread___default_transaction_read; __thread char *mysql_thread___default_character_set_results; __thread char *mysql_thread___default_session_track_gtids; __thread char *mysql_thread___default_sql_auto_is_null; @@ -765,6 +767,7 @@ extern __thread char *mysql_thread___ldap_user_variable; extern __thread char *mysql_thread___default_sql_mode; extern __thread char *mysql_thread___default_time_zone; extern __thread char *mysql_thread___default_isolation_level; +extern __thread char *mysql_thread___default_transaction_read; extern __thread char *mysql_thread___default_character_set_results; extern __thread char *mysql_thread___default_session_track_gtids; extern __thread char *mysql_thread___default_sql_auto_is_null; diff --git a/include/set_parser.h b/include/set_parser.h index 8a06e78f5..9fc889c56 100644 --- a/include/set_parser.h +++ b/include/set_parser.h @@ -9,7 +9,8 @@ class SetParser { std::string query; public: SetParser(std::string q); - std::map> parse(); + std::map> parse1(); + std::map> parse2(); }; diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 321ecd018..d2d1eefd8 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -2745,24 +2745,32 @@ void MySQL_HostGroups_Manager::destroy_MyConn_from_pool(MySQL_Connection *c, boo // probably because there is a long running query // therefore we will try to kill the connection if (mysql_thread___kill_backend_connection_when_disconnect) { - MySQL_Connection_userinfo *ui=c->userinfo; - char *auth_password=NULL; - if (ui->password) { - if (ui->password[0]=='*') { // we don't have the real password, let's pass sha1 - auth_password=ui->sha1_pass; - } else { - auth_password=ui->password; - } - } - KillArgs *ka = new KillArgs(ui->username, auth_password, c->parent->address, c->parent->port, c->mysql->thread_id, KILL_CONNECTION, NULL); - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - pthread_attr_setstacksize (&attr, 256*1024); - pthread_t pt; - if (pthread_create(&pt, &attr, &kill_query_thread, ka) != 0) { - proxy_error("Thread creation\n"); - assert(0); + int myerr=mysql_errno(c->mysql); + switch (myerr) { + case 1231: + break; + default: { + MySQL_Connection_userinfo *ui=c->userinfo; + char *auth_password=NULL; + if (ui->password) { + if (ui->password[0]=='*') { // we don't have the real password, let's pass sha1 + auth_password=ui->sha1_pass; + } else { + auth_password=ui->password; + } + } + KillArgs *ka = new KillArgs(ui->username, auth_password, c->parent->address, c->parent->port, c->mysql->thread_id, KILL_CONNECTION, NULL); + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + pthread_attr_setstacksize (&attr, 256*1024); + pthread_t pt; + if (pthread_create(&pt, &attr, &kill_query_thread, ka) != 0) { + proxy_error("Thread creation\n"); + assert(0); + } + } + break; } } } diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 1e2fb0860..1bf3d548c 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -837,18 +837,21 @@ bool MySQL_Session::handler_SetAutocommit(PtrSize_t *pkt) { // there is an active transaction, we need to forward it // because this can potentially close the transaction autocommit=true; + client_myds->myconn->set_autocommit(autocommit); autocommit_on_hostgroup=FindOneActiveTransaction(); return false; } else { // as there is no active transaction, we do no need to forward it // just change internal state autocommit=true; + client_myds->myconn->set_autocommit(autocommit); goto __ret_autocommit_OK; } } if (fd==0) { autocommit=false; // we set it, no matter if already set or not + client_myds->myconn->set_autocommit(autocommit); // it turned out I was wrong // set autocommit=0 has no effect if there is an acrive transaction // therefore, we never forward set autocommit = 0 @@ -924,6 +927,7 @@ void MySQL_Session::generate_proxysql_internal_session_json(json &j) { j["conn"]["sql_mode"] = ( client_myds->myconn->options.sql_mode ? client_myds->myconn->options.sql_mode : "") ; j["conn"]["time_zone"] = ( client_myds->myconn->options.time_zone ? client_myds->myconn->options.time_zone : "") ; j["conn"]["isolation_level"] = ( client_myds->myconn->options.isolation_level ? client_myds->myconn->options.isolation_level : "") ; + j["conn"]["transaction_read"] = ( client_myds->myconn->options.transaction_read ? client_myds->myconn->options.transaction_read : "") ; j["conn"]["character_set_results"] = ( client_myds->myconn->options.character_set_results ? client_myds->myconn->options.character_set_results : "") ; j["conn"]["session_track_gtids"] = ( client_myds->myconn->options.session_track_gtids ? client_myds->myconn->options.session_track_gtids : "") ; j["conn"]["sql_auto_is_null"] = ( client_myds->myconn->options.sql_auto_is_null ? client_myds->myconn->options.sql_auto_is_null : "") ; @@ -977,6 +981,7 @@ void MySQL_Session::generate_proxysql_internal_session_json(json &j) { j["backends"][i]["conn"]["sql_mode_sent"] = _myds->myconn->options.sql_mode_sent; j["backends"][i]["conn"]["time_zone"] = ( _myconn->options.time_zone ? _myconn->options.time_zone : "") ; j["backends"][i]["conn"]["isolation_level"] = ( _myconn->options.isolation_level ? _myconn->options.isolation_level : "") ; + j["backends"][i]["conn"]["transaction_read"] = ( _myconn->options.transaction_read ? _myconn->options.transaction_read : "") ; j["backends"][i]["conn"]["character_set_results"] = ( _myconn->options.character_set_results ? _myconn->options.character_set_results : "") ; j["backends"][i]["conn"]["session_track_gtids"] = ( _myconn->options.session_track_gtids ? _myconn->options.session_track_gtids : "") ; j["backends"][i]["conn"]["sql_auto_is_null"] = ( _myconn->options.sql_auto_is_null ? _myconn->options.sql_auto_is_null : "") ; @@ -1552,6 +1557,7 @@ void MySQL_Session::handler_again___new_thread_to_kill_connection() { #define NEXT_IMMEDIATE_NEW(new_st) do { set_status(new_st); return true; } while (0) bool MySQL_Session::handler_again___verify_backend_charset() { + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client charset: %d , backend charset: %d\n", this, client_myds->myconn->options.charset, mybe->server_myds->myconn->mysql->charset->nr); if (client_myds->myconn->options.charset != mybe->server_myds->myconn->mysql->charset->nr) { //previous_status.push(PROCESSING_QUERY); switch(status) { // this switch can be replaced with a simple previous_status.push(status), but it is here for readibility @@ -1597,6 +1603,7 @@ bool MySQL_Session::handler_again___verify_backend_sql_log_bin() { bool MySQL_Session::handler_again___verify_backend_sql_mode() { bool ret = false; + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client: %s , backend: %s\n", this, client_myds->myconn->options.sql_mode, mybe->server_myds->myconn->options.sql_mode); ret = handler_again___verify_backend__generic_variable( &mybe->server_myds->myconn->options.sql_mode_int, &mybe->server_myds->myconn->options.sql_mode, @@ -1621,6 +1628,7 @@ bool MySQL_Session::handler_again___verify_backend_sql_mode() { bool MySQL_Session::handler_again___verify_backend_time_zone() { bool ret = false; + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client: %s , backend: %s\n", this, client_myds->myconn->options.time_zone, mybe->server_myds->myconn->options.time_zone); ret = handler_again___verify_backend__generic_variable( &mybe->server_myds->myconn->options.time_zone_int, &mybe->server_myds->myconn->options.time_zone, @@ -1682,6 +1690,7 @@ bool MySQL_Session::handler_again___verify_backend__generic_variable(uint32_t *b bool MySQL_Session::handler_again___verify_backend_isolation_level() { bool ret = false; + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client: %s , backend: %s\n", this, client_myds->myconn->options.isolation_level, mybe->server_myds->myconn->options.isolation_level); ret = handler_again___verify_backend__generic_variable( &mybe->server_myds->myconn->options.isolation_level_int, &mybe->server_myds->myconn->options.isolation_level, @@ -1693,8 +1702,23 @@ bool MySQL_Session::handler_again___verify_backend_isolation_level() { return ret; } +bool MySQL_Session::handler_again___verify_backend_transaction_read() { + bool ret = false; + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client: %s , backend: %s\n", this, client_myds->myconn->options.transaction_read, mybe->server_myds->myconn->options.transaction_read); + ret = handler_again___verify_backend__generic_variable( + &mybe->server_myds->myconn->options.transaction_read_int, + &mybe->server_myds->myconn->options.transaction_read, + mysql_thread___default_transaction_read, + &client_myds->myconn->options.transaction_read_int, + client_myds->myconn->options.transaction_read, + SETTING_TRANSACTION_READ + ); + return ret; +} + bool MySQL_Session::handler_again___verify_backend_character_set_results() { bool ret = false; + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client: %s , backend: %s\n", this, client_myds->myconn->options.character_set_results, mybe->server_myds->myconn->options.character_set_results); ret = handler_again___verify_backend__generic_variable( &mybe->server_myds->myconn->options.character_set_results_int, &mybe->server_myds->myconn->options.character_set_results, @@ -1708,6 +1732,7 @@ bool MySQL_Session::handler_again___verify_backend_character_set_results() { bool MySQL_Session::handler_again___verify_backend_session_track_gtids() { bool ret = false; + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client: %s , backend: %s\n", this, client_myds->myconn->options.session_track_gtids, mybe->server_myds->myconn->options.session_track_gtids); ret = handler_again___verify_backend__generic_variable( &mybe->server_myds->myconn->options.session_track_gtids_int, &mybe->server_myds->myconn->options.session_track_gtids, @@ -1721,6 +1746,7 @@ bool MySQL_Session::handler_again___verify_backend_session_track_gtids() { bool MySQL_Session::handler_again___verify_backend_sql_auto_is_null() { bool ret = false; + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client: %s , backend: %s\n", this, client_myds->myconn->options.sql_auto_is_null, mybe->server_myds->myconn->options.sql_auto_is_null); ret = handler_again___verify_backend__generic_variable( &mybe->server_myds->myconn->options.sql_auto_is_null_int, &mybe->server_myds->myconn->options.sql_auto_is_null, @@ -1734,6 +1760,7 @@ bool MySQL_Session::handler_again___verify_backend_sql_auto_is_null() { bool MySQL_Session::handler_again___verify_backend_sql_select_limit() { bool ret = false; + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client: %s , backend: %s\n", this, client_myds->myconn->options.sql_select_limit, mybe->server_myds->myconn->options.sql_select_limit); ret = handler_again___verify_backend__generic_variable( &mybe->server_myds->myconn->options.sql_select_limit_int, &mybe->server_myds->myconn->options.sql_select_limit, @@ -1747,6 +1774,7 @@ bool MySQL_Session::handler_again___verify_backend_sql_select_limit() { bool MySQL_Session::handler_again___verify_backend_sql_safe_updates() { bool ret = false; + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client: %s , backend: %s\n", this, client_myds->myconn->options.sql_safe_updates, mybe->server_myds->myconn->options.sql_safe_updates); ret = handler_again___verify_backend__generic_variable( &mybe->server_myds->myconn->options.sql_safe_updates_int, &mybe->server_myds->myconn->options.sql_safe_updates, @@ -1760,6 +1788,7 @@ bool MySQL_Session::handler_again___verify_backend_sql_safe_updates() { bool MySQL_Session::handler_again___verify_backend_collation_connection() { bool ret = false; + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client: %s , backend: %s\n", this, client_myds->myconn->options.collation_connection, mybe->server_myds->myconn->options.collation_connection); ret = handler_again___verify_backend__generic_variable( &mybe->server_myds->myconn->options.collation_connection_int, &mybe->server_myds->myconn->options.collation_connection, @@ -1773,6 +1802,7 @@ bool MySQL_Session::handler_again___verify_backend_collation_connection() { bool MySQL_Session::handler_again___verify_backend_net_write_timeout() { bool ret = false; + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client: %s , backend: %s\n", this, client_myds->myconn->options.net_write_timeout, mybe->server_myds->myconn->options.net_write_timeout); ret = handler_again___verify_backend__generic_variable( &mybe->server_myds->myconn->options.net_write_timeout_int, &mybe->server_myds->myconn->options.net_write_timeout, @@ -1786,6 +1816,7 @@ bool MySQL_Session::handler_again___verify_backend_net_write_timeout() { bool MySQL_Session::handler_again___verify_backend_max_join_size() { bool ret = false; + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client: %s , backend: %s\n", this, client_myds->myconn->options.max_join_size, mybe->server_myds->myconn->options.max_join_size); ret = handler_again___verify_backend__generic_variable( &mybe->server_myds->myconn->options.max_join_size_int, &mybe->server_myds->myconn->options.max_join_size, @@ -1880,6 +1911,7 @@ bool MySQL_Session::handler_again___verify_backend_autocommit() { if (mysql_thread___forward_autocommit == true) { return false; } + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client: %d , backend: %d\n", this, client_myds->myconn->options.autocommit, mybe->server_myds->myconn->options.autocommit); if (autocommit != mybe->server_myds->myconn->IsAutoCommit()) { // see case #485 if (mysql_thread___enforce_autocommit_on_reads == false && autocommit == false) { @@ -1939,12 +1971,15 @@ bool MySQL_Session::handler_again___verify_backend_autocommit() { } } } else { // mysql_thread___enforce_autocommit_on_reads == true + // this code seems wrong. Removed +/* if (mybe->server_myds->myconn->IsActiveTransaction() == false) { if (status == PROCESSING_QUERY) { previous_status.push(PROCESSING_QUERY); NEXT_IMMEDIATE_NEW(CHANGING_AUTOCOMMIT); } } +*/ } } } @@ -1953,6 +1988,8 @@ bool MySQL_Session::handler_again___verify_backend_autocommit() { bool MySQL_Session::handler_again___verify_backend_user_schema() { MySQL_Data_Stream *myds=mybe->server_myds; + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client: %s , backend: %s\n", this, client_myds->myconn->userinfo->username, mybe->server_myds->myconn->userinfo->username); + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client: %s , backend: %s\n", this, client_myds->myconn->userinfo->schemaname, mybe->server_myds->myconn->userinfo->schemaname); if (client_myds->myconn->userinfo->hash!=mybe->server_myds->myconn->userinfo->hash) { if (strcmp(client_myds->myconn->userinfo->username,myds->myconn->userinfo->username)) { //previous_status.push(PROCESSING_QUERY); @@ -2328,7 +2365,7 @@ bool MySQL_Session::handler_again___status_SETTING_SQL_MODE(int *_rc) { } */ -bool MySQL_Session::handler_again___status_SETTING_GENERIC_VARIABLE(int *_rc, char *var_name, char *var_value, bool no_quote) { +bool MySQL_Session::handler_again___status_SETTING_GENERIC_VARIABLE(int *_rc, char *var_name, char *var_value, bool no_quote, bool set_transaction) { bool ret = false; assert(mybe->server_myds->myconn); MySQL_Data_Stream *myds=mybe->server_myds; @@ -2342,20 +2379,26 @@ bool MySQL_Session::handler_again___status_SETTING_GENERIC_VARIABLE(int *_rc, ch unsigned long query_length=0; if (myconn->async_state_machine==ASYNC_IDLE) { char *q = NULL; - if (no_quote) { - q=(char *)"SET %s=%s"; - } else { - q=(char *)"SET %s='%s'"; // default - if (var_value[0] && var_value[0]=='@') { - q=(char *)"SET %s=%s";} - if (strncasecmp(var_value,(char *)"CONCAT",6)==0) - q=(char *)"SET %s=%s"; - if (strncasecmp(var_value,(char *)"IFNULL",6)==0) - q=(char *)"SET %s=%s"; - if (strncasecmp(var_value,(char *)"REPLACE",7)==0) + if (set_transaction==false) { + if (no_quote) { q=(char *)"SET %s=%s"; + } else { + q=(char *)"SET %s='%s'"; // default + if (var_value[0] && var_value[0]=='@') { + q=(char *)"SET %s=%s";} + if (strncasecmp(var_value,(char *)"CONCAT",6)==0) + q=(char *)"SET %s=%s"; + if (strncasecmp(var_value,(char *)"IFNULL",6)==0) + q=(char *)"SET %s=%s"; + if (strncasecmp(var_value,(char *)"REPLACE",7)==0) + q=(char *)"SET %s=%s"; + } + } else { + // NOTE: for now, only SET SESSION is supported + // the calling function is already passing "SESSION TRANSACTION" + q=(char *)"SET %s %s"; } - query=(char *)malloc(strlen(q)+strlen(var_value)); + query=(char *)malloc(strlen(q)+strlen(var_name)+strlen(var_value)); sprintf(query,q,var_name, var_value); query_length=strlen(query); } @@ -2398,7 +2441,32 @@ bool MySQL_Session::handler_again___status_SETTING_GENERIC_VARIABLE(int *_rc, ch char sqlstate[10]; sprintf(sqlstate,"%s",mysql_sqlstate(myconn->mysql)); client_myds->myprot.generate_pkt_ERR(true,NULL,NULL,1,mysql_errno(myconn->mysql),sqlstate,mysql_error(myconn->mysql)); - myds->destroy_MySQL_Connection_From_Pool(true); + int myerr=mysql_errno(myconn->mysql); + switch (myerr) { + case 1231: +/* + too complicated code? + if (mysql_thread___multiplexing && (myconn->reusable==true) && myconn->IsActiveTransaction()==false && myconn->MultiplexDisabled()==false) { + myds->DSS=STATE_NOT_INITIALIZED; + if (mysql_thread___autocommit_false_not_reusable && myconn->IsAutoCommit()==false) { + if (mysql_thread___reset_connection_algorithm == 2) { + create_new_session_and_reset_connection(myds); + } else { + myds->destroy_MySQL_Connection_From_Pool(true); + } + } else { + myds->return_MySQL_Connection_To_Pool(); + } + } else { + myconn->async_state_machine=ASYNC_IDLE; + myds->DSS=STATE_MARIADB_GENERIC; + } + break; +*/ + default: + myds->destroy_MySQL_Connection_From_Pool(true); + break; + } myds->fd=0; RequestEnd(myds); } @@ -2419,7 +2487,14 @@ bool MySQL_Session::handler_again___status_SETTING_TIME_ZONE(int *_rc) { bool MySQL_Session::handler_again___status_SETTING_ISOLATION_LEVEL(int *_rc) { bool ret=false; assert(mybe->server_myds->myconn); - ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"ISOLATION LEVEL", mybe->server_myds->myconn->options.isolation_level); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"SESSION TRANSACTION ISOLATION LEVEL", mybe->server_myds->myconn->options.isolation_level, false, true); + return ret; +} + +bool MySQL_Session::handler_again___status_SETTING_TRANSACTION_READ(int *_rc) { + bool ret=false; + assert(mybe->server_myds->myconn); + ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"SESSION TRANSACTION READ", mybe->server_myds->myconn->options.transaction_read, false, true); return ret; } @@ -2857,6 +2932,7 @@ bool MySQL_Session::handler_again___status_CHANGING_AUTOCOMMIT(int *_rc) { } else { st=previous_status.top(); previous_status.pop(); + myds->DSS = STATE_MARIADB_GENERIC; NEXT_IMMEDIATE_NEW(st); } } @@ -2866,6 +2942,7 @@ bool MySQL_Session::handler_again___status_CHANGING_AUTOCOMMIT(int *_rc) { if (rc==0) { st=previous_status.top(); previous_status.pop(); + myds->DSS = STATE_MARIADB_GENERIC; NEXT_IMMEDIATE_NEW(st); } else { if (rc==-1) { @@ -3684,6 +3761,7 @@ handler_again: goto handler_again; } if (mirror==false) { // do not care about autocommit and charset if mirror + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , default_HG=%d server_myds DSS=%d , locked_on_HG=%d\n", this, default_hostgroup, mybe->server_myds->DSS, locked_on_hostgroup); if (mybe->server_myds->DSS == STATE_READY || mybe->server_myds->DSS == STATE_MARIADB_GENERIC) { if (handler_again___verify_init_connect()) { goto handler_again; @@ -3693,47 +3771,52 @@ handler_again: goto handler_again; } } - if (handler_again___verify_backend_charset()) { - goto handler_again; - } if (handler_again___verify_backend_autocommit()) { goto handler_again; } - if (handler_again___verify_backend_sql_log_bin()) { - goto handler_again; - } - if (handler_again___verify_backend_sql_mode()) { - goto handler_again; - } - if (handler_again___verify_backend_time_zone()) { - goto handler_again; - } - if (handler_again___verify_backend_isolation_level()) { - goto handler_again; - } - if (handler_again___verify_backend_character_set_results()) { - goto handler_again; - } - if (handler_again___verify_backend_session_track_gtids()) { - goto handler_again; - } - if (handler_again___verify_backend_sql_auto_is_null()) { - goto handler_again; - } - if (handler_again___verify_backend_sql_select_limit()) { - goto handler_again; - } - if (handler_again___verify_backend_sql_safe_updates()) { - goto handler_again; - } - if (handler_again___verify_backend_collation_connection()) { - goto handler_again; - } - if (handler_again___verify_backend_net_write_timeout()) { - goto handler_again; - } - if (handler_again___verify_backend_max_join_size()) { - goto handler_again; + if (locked_on_hostgroup == -1) { + if (handler_again___verify_backend_charset()) { + goto handler_again; + } + if (handler_again___verify_backend_sql_log_bin()) { + goto handler_again; + } + if (handler_again___verify_backend_sql_mode()) { + goto handler_again; + } + if (handler_again___verify_backend_time_zone()) { + goto handler_again; + } + if (handler_again___verify_backend_isolation_level()) { + goto handler_again; + } + if (handler_again___verify_backend_transaction_read()) { + goto handler_again; + } + if (handler_again___verify_backend_character_set_results()) { + goto handler_again; + } + if (handler_again___verify_backend_session_track_gtids()) { + goto handler_again; + } + if (handler_again___verify_backend_sql_auto_is_null()) { + goto handler_again; + } + if (handler_again___verify_backend_sql_select_limit()) { + goto handler_again; + } + if (handler_again___verify_backend_sql_safe_updates()) { + goto handler_again; + } + if (handler_again___verify_backend_collation_connection()) { + goto handler_again; + } + if (handler_again___verify_backend_net_write_timeout()) { + goto handler_again; + } + if (handler_again___verify_backend_max_join_size()) { + goto handler_again; + } } } if (status==PROCESSING_STMT_EXECUTE) { @@ -4280,6 +4363,18 @@ handler_again: } break; + case SETTING_TRANSACTION_READ: + { + int rc=0; + if (handler_again___status_SETTING_TRANSACTION_READ(&rc)) + goto handler_again; // we changed status + if (rc==-1) { // we have an error we can't handle + handler_ret = -1; + return handler_ret; + } + } + break; + case SETTING_CHARACTER_SET_RESULTS: { int rc=0; @@ -5037,6 +5132,8 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C This algorithm will be become obsolete once we implement session tracking for MySQL 5.7+ */ + bool ret = false; + bool exit_after_SetParse = false; unsigned char command_type=*((unsigned char *)pkt->ptr+sizeof(mysql_hdr)); if (qpo->new_query) { // the query was rewritten @@ -5104,7 +5201,8 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C if (CurrentQuery.QueryParserArgs.digest_text) { char *dig=CurrentQuery.QueryParserArgs.digest_text; unsigned int nTrx=NumActiveTransactions(); - if (strncasecmp(dig,(char *)"SET ",4)==0) { + if ((locked_on_hostgroup == -1) && (strncasecmp(dig,(char *)"SET ",4)==0)) { + // this code is executed only if locked_on_hostgroup is not set yet #ifdef DEBUG { string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); @@ -5175,14 +5273,14 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C } else { string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); proxy_error("Unable to parse query. If correct, report it as a bug: %s\n", nqn.c_str()); - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); return false; } } } if ( ( - match_regexes && (match_regexes[1]->match(dig) || match_regexes[2]->match(dig)) + match_regexes && (match_regexes[1]->match(dig)) ) || ( strncasecmp(dig,(char *)"SET NAMES", strlen((char *)"SET NAMES")) == 0) @@ -5192,8 +5290,7 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Parsing SET command %s\n", nq.c_str()); proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Parsing SET command = %s\n", nq.c_str()); SetParser parser(nq); - std::map> set = parser.parse(); - bool exit_after_SetParse = false; + std::map> set = parser.parse1(); for(auto it = std::begin(set); it != std::end(set); ++it) { std::string var = it->first; proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Processing SET variable %s\n", var.c_str()); @@ -5202,7 +5299,7 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); proxy_error("Unable to parse query. If correct, report it as a bug: %s\n", nqn.c_str()); proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); return false; } auto values = std::begin(it->second); @@ -5218,7 +5315,7 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); proxy_error("Unable to parse query. If correct, report it as a bug: %s\n", nqn.c_str()); proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); return false; } std::size_t found_at = value1.find("@"); @@ -5231,11 +5328,9 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C // we found a @ . Maybe we need to lock hostgroup proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Found @ in SQL_MODE . v2 = %s\n", v2); if (strncasecmp(v2,(const char *)"@@sql_mode",strlen((const char *)"@@sql_mode"))) { -#ifdef DEBUG - string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); -#endif - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); + free(v1); + return false; } else { v2++; } @@ -5257,9 +5352,9 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C client_myds->myconn->options.sql_mode=strdup(value1.c_str()); if (strcasestr(value1.c_str(), (char *)"NO_BACKSLASH_ESCAPES")) { //goto __exit_set_destination_hostgroup; - exit_after_SetParse = true; } } + exit_after_SetParse = true; } else if (var == "sql_auto_is_null") { std::string value1 = *values; proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Processing SET sql_auto_is_null value %s\n", value1.c_str()); @@ -5290,12 +5385,10 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection sql_auto_is_null to %s\n", value1.c_str()); client_myds->myconn->options.sql_auto_is_null=strdup(value1.c_str()); } + exit_after_SetParse = true; } else { -#ifdef DEBUG - string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); -#endif - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); + return false; } } else if (var == "sql_safe_updates") { std::string value1 = *values; @@ -5327,22 +5420,17 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection sql_safe_updates to %s\n", value1.c_str()); client_myds->myconn->options.sql_safe_updates=strdup(value1.c_str()); } + exit_after_SetParse = true; } else { -#ifdef DEBUG - string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); -#endif - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); + return false; } } else if (var == "autocommit") { std::string value1 = *values; std::size_t found_at = value1.find("@"); if (found_at != std::string::npos) { -#ifdef DEBUG - string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); -#endif - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); + return false; } proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Processing SET autocommit value %s\n", value1.c_str()); int __tmp_autocommit = -1; @@ -5374,17 +5462,20 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C // there is an active transaction, we need to forward it // because this can potentially close the transaction autocommit=true; + client_myds->myconn->set_autocommit(autocommit); autocommit_on_hostgroup=FindOneActiveTransaction(); exit_after_SetParse = true; } else { // as there is no active transaction, we do no need to forward it // just change internal state autocommit=true; + client_myds->myconn->set_autocommit(autocommit); } } if (fd==0) { autocommit=false; // we set it, no matter if already set or not + client_myds->myconn->set_autocommit(autocommit); } } else { if (autocommit_handled==true) { @@ -5395,11 +5486,8 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C std::string value1 = *values; std::size_t found_at = value1.find("@"); if (found_at != std::string::npos) { -#ifdef DEBUG - string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); -#endif - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); + return false; } proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Processing SET Time Zone value %s\n", value1.c_str()); uint32_t time_zone_int=SpookyHash::Hash32(value1.c_str(),value1.length(),10); @@ -5412,6 +5500,7 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C proxy_debug(PROXY_DEBUG_MYSQL_COM, 8, "Changing connection Time zone to %s\n", value1.c_str()); client_myds->myconn->options.time_zone=strdup(value1.c_str()); } + exit_after_SetParse = true; } else if (var == "session_track_gtids") { std::string value1 = *values; if ((strcasecmp(value1.c_str(),"OWN_GTID")==0) || (strcasecmp(value1.c_str(),"OFF")==0)) { @@ -5425,12 +5514,10 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection session_track_gtids to %s\n", value1.c_str()); client_myds->myconn->options.session_track_gtids=strdup(value1.c_str()); } + exit_after_SetParse = true; } else { -#ifdef DEBUG - string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); -#endif - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); + return false; } } else if (var == "max_join_size") { std::string value1 = *values; @@ -5453,12 +5540,10 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection max_join_size to %s\n", value1.c_str()); client_myds->myconn->options.max_join_size=strdup(value1.c_str()); } + exit_after_SetParse = true; } else { -#ifdef DEBUG - string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); -#endif - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); + return false; } } else if (var == "net_write_timeout") { std::string value1 = *values; @@ -5481,12 +5566,10 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection net_write_timeout to %s\n", value1.c_str()); client_myds->myconn->options.net_write_timeout=strdup(value1.c_str()); } + exit_after_SetParse = true; } else { -#ifdef DEBUG - string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); -#endif - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); + return false; } } else if (var == "sql_select_limit") { std::string value1 = *values; @@ -5498,6 +5581,11 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C only_digit_chars=false; } } + if (!only_digit_chars) { + if (strcasecmp(v,"default")==0) { + only_digit_chars = true; + } + } if (only_digit_chars) { proxy_debug(PROXY_DEBUG_MYSQL_COM, 7, "Processing SET sql_select_limit value %s\n", value1.c_str()); uint32_t sql_select_limit_int=SpookyHash::Hash32(value1.c_str(),value1.length(),10); @@ -5509,12 +5597,10 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection sql_select_limit to %s\n", value1.c_str()); client_myds->myconn->options.sql_select_limit=strdup(value1.c_str()); } + exit_after_SetParse = true; } else { -#ifdef DEBUG - string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); -#endif - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); + return false; } } else if (var == "collation_connection") { std::string value1 = *values; @@ -5537,12 +5623,10 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection collation_connection to %s\n", value1.c_str()); client_myds->myconn->options.collation_connection=strdup(value1.c_str()); } + exit_after_SetParse = true; } else { -#ifdef DEBUG - string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); -#endif - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); + return false; } } else if (var == "character_set_results") { std::string value1 = *values; @@ -5565,22 +5649,17 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection character_set_results to %s\n", value1.c_str()); client_myds->myconn->options.character_set_results=strdup(value1.c_str()); } + exit_after_SetParse = true; } else { -#ifdef DEBUG - string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); -#endif - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); + return false; } } else if (var == "names") { std::string value1 = *values++; std::size_t found_at = value1.find("@"); if (found_at != std::string::npos) { -#ifdef DEBUG - string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); -#endif - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); + return false; } proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Processing SET NAMES %s\n", value1.c_str()); const MARIADB_CHARSET_INFO * c; @@ -5613,22 +5692,22 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C } else { proxy_debug(PROXY_DEBUG_MYSQL_COM, 8, "Changing connection charset to %d\n", c->nr); client_myds->myconn->set_charset(c->nr); + exit_after_SetParse = true; } } else { std::string value1 = *values; std::size_t found_at = value1.find("@"); if (found_at != std::string::npos) { -#ifdef DEBUG - string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); -#endif - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); + return false; } } } +/* if (exit_after_SetParse) { goto __exit_set_destination_hostgroup; } +*/ // parseSetCommand wasn't able to parse anything... if (set.size() == 0) { // try case listed in #1373 @@ -5681,15 +5760,16 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C } } free(v1); + if (*lock_hostgroup) { + unable_to_parse_set_statement(lock_hostgroup); + return false; + } } } } else { if (memchr((const char *)CurrentQuery.QueryPointer, '@', CurrentQuery.QueryLength)) { -#ifdef DEBUG - string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); -#endif - *lock_hostgroup = true; + unable_to_parse_set_statement(lock_hostgroup); + return false; } int kq = 0; kq = strncmp((const char *)CurrentQuery.QueryPointer, (const char *)"/*!40101 SET SQL_MODE=@OLD_SQL_MODE */" , CurrentQuery.QueryLength); @@ -5704,41 +5784,73 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C } } - if (command_type == _MYSQL_COM_QUERY) { - client_myds->DSS=STATE_QUERY_SENT_NET; - uint16_t setStatus = (nTrx ? SERVER_STATUS_IN_TRANS : 0 ); - if (autocommit) setStatus |= SERVER_STATUS_AUTOCOMMIT; - client_myds->myprot.generate_pkt_OK(true,NULL,NULL,1,0,0,setStatus,0,NULL); + if (exit_after_SetParse) { + if (command_type == _MYSQL_COM_QUERY) { + client_myds->DSS=STATE_QUERY_SENT_NET; + uint16_t setStatus = (nTrx ? SERVER_STATUS_IN_TRANS : 0 ); + if (autocommit) setStatus |= SERVER_STATUS_AUTOCOMMIT; + client_myds->myprot.generate_pkt_OK(true,NULL,NULL,1,0,0,setStatus,0,NULL); client_myds->DSS=STATE_SLEEP; - status=WAITING_CLIENT_DATA; - RequestEnd(NULL); - l_free(pkt->size,pkt->ptr); - return true; + status=WAITING_CLIENT_DATA; + RequestEnd(NULL); + l_free(pkt->size,pkt->ptr); + return true; + } } - } else { - // we couldn't parse the query - string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); - if (qpo->multiplex == -1) { - // we have no rule about this SET statement. We set hostgroup locking - if (locked_on_hostgroup < 0) { - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "SET query to cause setting lock_hostgroup: %s\n", nqn.c_str()); - if (known_query_for_locked_on_hostgroup(CurrentQuery.QueryParserArgs.digest)) { - proxy_info("Setting lock_hostgroup for SET query: %s\n", nqn.c_str()); - } else { - proxy_warning("Unable to parse unknown SET query. Setting lock_hostgroup. Please report a bug for future enhancements:%s\n", nqn.c_str()); + } else if (match_regexes && match_regexes[2]->match(dig)) { + SetParser parser(nq); + std::map> set = parser.parse2(); + for(auto it = std::begin(set); it != std::end(set); ++it) { + std::string var = it->first; + auto values = std::begin(it->second); + proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Processing SET variable %s\n", var.c_str()); + if (var == "isolation level") { + std::string value1 = *values; + proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Processing SET SESSION TRANSACTION ISOLATION LEVEL value %s\n", value1.c_str()); + uint32_t isolation_level_int=SpookyHash::Hash32(value1.c_str(),value1.length(),10); + if (client_myds->myconn->options.isolation_level_int != isolation_level_int) { + client_myds->myconn->options.isolation_level_int = isolation_level_int; + if (client_myds->myconn->options.isolation_level) { + free(client_myds->myconn->options.isolation_level); + } + proxy_debug(PROXY_DEBUG_MYSQL_COM, 8, "Changing connection TRANSACTION ISOLATION LEVEL to %s\n", value1.c_str()); + client_myds->myconn->options.isolation_level=strdup(value1.c_str()); } - *lock_hostgroup = true; - } else { - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "SET query to cause setting lock_hostgroup, but already set: %s\n", nqn.c_str()); - if (known_query_for_locked_on_hostgroup(CurrentQuery.QueryParserArgs.digest)) { - //proxy_info("Setting lock_hostgroup for SET query: %s\n", nqn.c_str()); - } else { - proxy_warning("Unable to parse unknown SET query. Not setting lock_hostgroup because already set. Please report a bug for future enhancements: %s\n", nqn.c_str()); + exit_after_SetParse = true; + } else if (var == "read") { + std::string value1 = *values; + proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Processing SET SESSION TRANSACTION READ value %s\n", value1.c_str()); + uint32_t transaction_read_int=SpookyHash::Hash32(value1.c_str(),value1.length(),10); + if (client_myds->myconn->options.transaction_read_int != transaction_read_int) { + client_myds->myconn->options.transaction_read_int = transaction_read_int; + if (client_myds->myconn->options.transaction_read) { + free(client_myds->myconn->options.transaction_read); + } + proxy_debug(PROXY_DEBUG_MYSQL_COM, 8, "Changing connection TRANSACTION READ to %s\n", value1.c_str()); + client_myds->myconn->options.transaction_read=strdup(value1.c_str()); } + exit_after_SetParse = true; + } else { + unable_to_parse_set_statement(lock_hostgroup); + return false; } - } else { - proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Unable to parse SET query but NOT setting lock_hostgroup %s\n", nqn.c_str()); } + if (exit_after_SetParse) { + if (command_type == _MYSQL_COM_QUERY) { + client_myds->DSS=STATE_QUERY_SENT_NET; + uint16_t setStatus = (nTrx ? SERVER_STATUS_IN_TRANS : 0 ); + if (autocommit) setStatus |= SERVER_STATUS_AUTOCOMMIT; + client_myds->myprot.generate_pkt_OK(true,NULL,NULL,1,0,0,setStatus,0,NULL); + client_myds->DSS=STATE_SLEEP; + status=WAITING_CLIENT_DATA; + RequestEnd(NULL); + l_free(pkt->size,pkt->ptr); + return true; + } + } + } else { + unable_to_parse_set_statement(lock_hostgroup); + return false; } } } @@ -6688,3 +6800,32 @@ bool MySQL_Session::known_query_for_locked_on_hostgroup(uint64_t digest) { } return ret; } + + + +void MySQL_Session::unable_to_parse_set_statement(bool *lock_hostgroup) { + // we couldn't parse the query + string nqn = string((char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Locking hostgroup for query %s\n", nqn.c_str()); + if (qpo->multiplex == -1) { + // we have no rule about this SET statement. We set hostgroup locking + if (locked_on_hostgroup < 0) { + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "SET query to cause setting lock_hostgroup: %s\n", nqn.c_str()); + if (known_query_for_locked_on_hostgroup(CurrentQuery.QueryParserArgs.digest)) { + proxy_info("Setting lock_hostgroup for SET query: %s\n", nqn.c_str()); + } else { + proxy_warning("Unable to parse unknown SET query. Setting lock_hostgroup. Please report a bug for future enhancements:%s\n", nqn.c_str()); + } + *lock_hostgroup = true; + } else { + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "SET query to cause setting lock_hostgroup, but already set: %s\n", nqn.c_str()); + if (known_query_for_locked_on_hostgroup(CurrentQuery.QueryParserArgs.digest)) { + //proxy_info("Setting lock_hostgroup for SET query: %s\n", nqn.c_str()); + } else { + proxy_warning("Unable to parse unknown SET query. Not setting lock_hostgroup because already set. Please report a bug for future enhancements: %s\n", nqn.c_str()); + } + } + } else { + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "Unable to parse SET query but NOT setting lock_hostgroup %s\n", nqn.c_str()); + } +} diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index fd8929299..42c6a9d22 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -332,6 +332,7 @@ static char * mysql_thread_variables_names[]= { (char *)"default_sql_mode", (char *)"default_time_zone", (char *)"default_isolation_level", + (char *)"default_transaction_read", (char *)"default_character_set_results", (char *)"default_session_track_gtids", (char *)"default_sql_auto_is_null", @@ -438,6 +439,7 @@ MySQL_Threads_Handler::MySQL_Threads_Handler() { variables.default_sql_mode=strdup((char *)MYSQL_DEFAULT_SQL_MODE); variables.default_time_zone=strdup((char *)MYSQL_DEFAULT_TIME_ZONE); variables.default_isolation_level=strdup((char *)MYSQL_DEFAULT_ISOLATION_LEVEL); + variables.default_transaction_read=strdup((char *)MYSQL_DEFAULT_TRANSACTION_READ); variables.default_character_set_results=strdup((char *)MYSQL_DEFAULT_CHARACTER_SET_RESULTS); variables.default_session_track_gtids=strdup((char *)MYSQL_DEFAULT_SESSION_TRACK_GTIDS); variables.default_sql_auto_is_null=strdup((char *)MYSQL_DEFAULT_SQL_AUTO_IS_NULL); @@ -654,6 +656,12 @@ char * MySQL_Threads_Handler::get_variable_string(char *name) { } return strdup(variables.default_isolation_level); } + if (!strcmp(name,"default_transaction_read")) { + if (variables.default_transaction_read==NULL) { + variables.default_transaction_read=strdup((char *)MYSQL_DEFAULT_TRANSACTION_READ); + } + return strdup(variables.default_transaction_read); + } if (!strcmp(name,"default_character_set_results")) { if (variables.default_character_set_results==NULL) { variables.default_character_set_results=strdup((char *)MYSQL_DEFAULT_CHARACTER_SET_RESULTS); @@ -945,6 +953,12 @@ char * MySQL_Threads_Handler::get_variable(char *name) { // this is the public f } return strdup(variables.default_isolation_level); } + if (!strcasecmp(name,"default_transaction_read")) { + if (variables.default_transaction_read==NULL) { + variables.default_transaction_read=strdup((char *)MYSQL_DEFAULT_TRANSACTION_READ); + } + return strdup(variables.default_transaction_read); + } if (!strcasecmp(name,"default_character_set_results")) { if (variables.default_character_set_results==NULL) { variables.default_character_set_results=strdup((char *)MYSQL_DEFAULT_CHARACTER_SET_RESULTS); @@ -2243,6 +2257,19 @@ bool MySQL_Threads_Handler::set_variable(char *name, char *value) { // this is t return true; } + if (!strcasecmp(name,"default_transaction_read")) { + if (variables.default_transaction_read) free(variables.default_transaction_read); + variables.default_transaction_read=NULL; + if (vallen) { + if (strcmp(value,"(null)")) + variables.default_transaction_read=strdup(value); + } + if (variables.default_transaction_read==NULL) { + variables.default_transaction_read=strdup((char *)MYSQL_DEFAULT_TRANSACTION_READ); // default + } + return true; + } + if (!strcasecmp(name,"default_character_set_results")) { if (variables.default_character_set_results) free(variables.default_character_set_results); variables.default_character_set_results=NULL; @@ -2958,6 +2985,7 @@ MySQL_Threads_Handler::~MySQL_Threads_Handler() { if (variables.default_sql_mode) free(variables.default_sql_mode); if (variables.default_time_zone) free(variables.default_time_zone); if (variables.default_isolation_level) free(variables.default_isolation_level); + if (variables.default_transaction_read) free(variables.default_transaction_read); if (variables.default_character_set_results) free(variables.default_character_set_results); if (variables.default_session_track_gtids) free(variables.default_session_track_gtids); if (variables.default_sql_auto_is_null) free(variables.default_sql_auto_is_null); @@ -3087,6 +3115,7 @@ MySQL_Thread::~MySQL_Thread() { if (mysql_thread___default_sql_mode) { free(mysql_thread___default_sql_mode); mysql_thread___default_sql_mode=NULL; } if (mysql_thread___default_time_zone) { free(mysql_thread___default_time_zone); mysql_thread___default_time_zone=NULL; } if (mysql_thread___default_isolation_level) { free(mysql_thread___default_isolation_level); mysql_thread___default_isolation_level=NULL; } + if (mysql_thread___default_transaction_read) { free(mysql_thread___default_transaction_read); mysql_thread___default_transaction_read=NULL; } if (mysql_thread___default_character_set_results) { free(mysql_thread___default_character_set_results); mysql_thread___default_character_set_results=NULL; } if (mysql_thread___default_session_track_gtids) { free(mysql_thread___default_session_track_gtids); mysql_thread___default_session_track_gtids=NULL; } if (mysql_thread___default_sql_auto_is_null) { free(mysql_thread___default_sql_auto_is_null); mysql_thread___default_sql_auto_is_null=NULL; } @@ -3156,6 +3185,13 @@ MySQL_Session * MySQL_Thread::create_new_session_and_client_data_stream(int _fd) } sess->client_myds->myconn->options.isolation_level=strdup(mysql_thread___default_isolation_level); + uint32_t transaction_read_int=SpookyHash::Hash32(mysql_thread___default_transaction_read,strlen(mysql_thread___default_transaction_read),10); + sess->client_myds->myconn->options.transaction_read_int = transaction_read_int; + if (sess->client_myds->myconn->options.transaction_read) { + free(sess->client_myds->myconn->options.transaction_read); + } + sess->client_myds->myconn->options.transaction_read=strdup(mysql_thread___default_transaction_read); + uint32_t character_set_results_int=SpookyHash::Hash32(mysql_thread___default_character_set_results,strlen(mysql_thread___default_character_set_results),10); sess->client_myds->myconn->options.character_set_results_int = character_set_results_int; if (sess->client_myds->myconn->options.character_set_results) { @@ -3250,8 +3286,8 @@ bool MySQL_Thread::init() { match_regexes=(Session_Regex **)malloc(sizeof(Session_Regex *)*3); match_regexes[0]=new Session_Regex((char *)"^SET (|SESSION |@@|@@session.)SQL_LOG_BIN( *)(:|)=( *)"); - match_regexes[1]=new Session_Regex((char *)"^SET (|SESSION |@@|@@session.)SQL_MODE( *)(:|)=( *)"); - match_regexes[2]=new Session_Regex((char *)"^SET (|SESSION |@@|@@session.)TIME_ZONE( *)(:|)=( *)"); + match_regexes[1]=new Session_Regex((char *)"^SET (|SESSION |@@|@@session.)(SQL_MODE|TIME_ZONE|CHARACTER_SET_RESULTS|SESSION_TRACK_GTIDS|SQL_AUTO_IS_NULL|SQL_SELECT_LIMIT|SQL_SAFE_UPDATES|COLLATION_CONNECTION|NET_WRITE_TIMEOUT|MAX_JOIN_SIZE( *)(:|)=( *))"); + match_regexes[2]=new Session_Regex((char *)"^SET(?: +)(|SESSION +)TRANSACTION(?: +)(?:(?:(ISOLATION(?: +)LEVEL)(?: +)(REPEATABLE(?: +)READ|READ(?: +)COMMITTED|READ(?: +)UNCOMMITTED|SERIALIZABLE))|(?:(READ)(?: +)(WRITE|ONLY)))"); return true; @@ -4273,6 +4309,8 @@ void MySQL_Thread::refresh_variables() { mysql_thread___default_time_zone=GloMTH->get_variable_string((char *)"default_time_zone"); if (mysql_thread___default_isolation_level) free(mysql_thread___default_isolation_level); mysql_thread___default_isolation_level=GloMTH->get_variable_string((char *)"default_isolation_level"); + if (mysql_thread___default_transaction_read) free(mysql_thread___default_transaction_read); + mysql_thread___default_transaction_read=GloMTH->get_variable_string((char *)"default_transaction_read"); if (mysql_thread___default_character_set_results) free(mysql_thread___default_character_set_results); mysql_thread___default_character_set_results=GloMTH->get_variable_string((char *)"default_character_set_results"); if (mysql_thread___default_session_track_gtids) free(mysql_thread___default_session_track_gtids); diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 2c2637b10..dbc653b4f 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -28,9 +28,9 @@ static char * session_vars[]= { // For issue #555 , multiplexing is disabled if --safe-updates is used //(char *)"SQL_SAFE_UPDATES=?,SQL_SELECT_LIMIT=?,MAX_JOIN_SIZE=?", // for issue #1832 , we are splitting the above into 3 variables - (char *)"SQL_SAFE_UPDATES", - (char *)"SQL_SELECT_LIMIT", - (char *)"MAX_JOIN_SIZE", +// (char *)"SQL_SAFE_UPDATES", +// (char *)"SQL_SELECT_LIMIT", +// (char *)"MAX_JOIN_SIZE", (char *)"FOREIGN_KEY_CHECKS", (char *)"UNIQUE_CHECKS", (char *)"AUTO_INCREMENT_INCREMENT", @@ -208,6 +208,7 @@ MySQL_Connection::MySQL_Connection() { options.init_connect_sent=false; options.character_set_results = NULL; options.isolation_level = NULL; + options.transaction_read = NULL; options.session_track_gtids = NULL; options.sql_auto_is_null = NULL; options.sql_select_limit = NULL; @@ -216,6 +217,7 @@ MySQL_Connection::MySQL_Connection() { options.net_write_timeout = NULL; options.max_join_size = NULL; options.isolation_level_sent = false; + options.transaction_read_sent = false; options.character_set_results_sent = false; options.session_track_gtids_sent = false; options.sql_auto_is_null_sent = false; @@ -234,6 +236,7 @@ MySQL_Connection::MySQL_Connection() { options.time_zone=NULL; // #819 options.time_zone_int=0; // #819 options.isolation_level_int=0; + options.transaction_read_int=0; options.character_set_results_int=0; options.session_track_gtids_int=0; options.sql_auto_is_null_int=0; @@ -322,6 +325,10 @@ MySQL_Connection::~MySQL_Connection() { free(options.isolation_level); options.isolation_level=NULL; } + if (options.transaction_read) { + free(options.transaction_read); + options.transaction_read=NULL; + } if (options.character_set_results) { free(options.character_set_results); options.character_set_results=NULL; @@ -2066,6 +2073,12 @@ void MySQL_Connection::reset() { options.isolation_level = NULL; options.isolation_level_sent = false; } + options.transaction_read_int = 0; + if (options.transaction_read) { + free (options.transaction_read); + options.transaction_read = NULL; + options.transaction_read_sent = false; + } options.character_set_results_int = 0; if (options.character_set_results) { free (options.character_set_results); diff --git a/lib/set_parser.cpp b/lib/set_parser.cpp index 640f7bd5b..b46fb32df 100644 --- a/lib/set_parser.cpp +++ b/lib/set_parser.cpp @@ -16,7 +16,12 @@ SetParser::SetParser(std::string nq) { free(query_no_space); } -std::map> SetParser::parse() { +#define QUOTES "(?:'|\")?" +#define SPACES " *" +#define NAMES "(NAMES)" +#define NAME_VALUE "((?:\\w|\\d)+)" + +std::map> SetParser::parse1() { proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 4, "Parsing query %s\n", query.c_str()); re2::RE2::Options *opt2=new re2::RE2::Options(RE2::Quiet); @@ -28,17 +33,13 @@ std::map> SetParser::parse() { std::map> result; -#define NAMES "(NAMES)" -#define QUOTES "(?:'|\")?" -#define NAME_VALUE "((?:\\w|\\d)+)" -#define SESSION "(?:|SESSION +|@@|@@session.)" -#define VAR "(\\w+)" -#define SPACES " *" +#define SESSION_P1 "(?:|SESSION +|@@|@@session.)" +#define VAR_P1 "(\\w+)" //#define VAR_VALUE "((?:[\\w/\\d:\\+\\-]|,)+)" //#define VAR_VALUE "((?:CONCAT\\((?:(REPLACE|CONCAT)\\()+@@sql_mode,(?:(?:'|\\w|,| |\"|\\))+(?:\\)))|(?:[@\\w/\\d:\\+\\-]|,)+|(?:)))" -#define VAR_VALUE "(((?:CONCAT\\()*(?:((?: )*REPLACE|IFNULL|CONCAT)\\()+(?: )*(?:NULL|@OLD_SQL_MODE|@@sql_mode),(?:(?:'|\\w|,| |\"|\\))+(?:\\))*)|(?:[@\\w/\\d:\\+\\-]|,)+|(?:)))" +#define VAR_VALUE_P1 "(((?:CONCAT\\()*(?:((?: )*REPLACE|IFNULL|CONCAT)\\()+(?: )*(?:NULL|@OLD_SQL_MODE|@@sql_mode),(?:(?:'|\\w|,| |\"|\\))+(?:\\))*)|(?:[@\\w/\\d:\\+\\-]|,)+|(?:)))" - const string pattern="(?:" NAMES SPACES QUOTES NAME_VALUE QUOTES "(?: +COLLATE +" QUOTES NAME_VALUE QUOTES "|)" "|" SESSION VAR SPACES "(?:|:)=" SPACES QUOTES VAR_VALUE QUOTES ") *,? *"; + const string pattern="(?:" NAMES SPACES QUOTES NAME_VALUE QUOTES "(?: +COLLATE +" QUOTES NAME_VALUE QUOTES "|)" "|" SESSION_P1 VAR_P1 SPACES "(?:|:)=" SPACES QUOTES VAR_VALUE_P1 QUOTES ") *,? *"; re2::RE2 re(pattern, *opt2); string var; string value1, value2, value3, value4, value5; @@ -54,7 +55,7 @@ std::map> SetParser::parse() { key = value1; op.push_back(value2); if (value3 != "") { - op.push_back(value3); + op.push_back(value3); } } else if (value4 != "") { // VARIABLE @@ -70,4 +71,53 @@ std::map> SetParser::parse() { } +std::map> SetParser::parse2() { + + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 4, "Parsing query %s\n", query.c_str()); + re2::RE2::Options *opt2=new re2::RE2::Options(RE2::Quiet); + opt2->set_case_sensitive(false); + opt2->set_longest_match(false); + + re2::RE2 re0("^\\s*SET\\s+", *opt2); + re2::RE2::Replace(&query, re0, ""); + + std::map> result; + +// regex used: +// SET(?: +)(|SESSION +)TRANSACTION(?: +)(?:(?:(ISOLATION(?: +)LEVEL)(?: +)(REPEATABLE(?: +)READ|READ(?: +)COMMITTED|READ(?: +)UNCOMMITTED|SERIALIZABLE))|(?:(READ)(?: +)(WRITE|ONLY))) +/* +#define SESSION_P2 "(|SESSION)" +#define VAR_P2 "(ISOLATION LEVEL|READ)" +//#define VAR_VALUE "((?:[\\w/\\d:\\+\\-]|,)+)" +//#define VAR_VALUE "((?:CONCAT\\((?:(REPLACE|CONCAT)\\()+@@sql_mode,(?:(?:'|\\w|,| |\"|\\))+(?:\\)))|(?:[@\\w/\\d:\\+\\-]|,)+|(?:)))" +#define VAR_VALUE_P2 "(((?:CONCAT\\()*(?:((?: )*REPLACE|IFNULL|CONCAT)\\()+(?: )*(?:NULL|@OLD_SQL_MODE|@@sql_mode),(?:(?:'|\\w|,| |\"|\\))+(?:\\))*)|(?:[@\\w/\\d:\\+\\-]|,)+|(?:)))" +*/ + //const string pattern="(?:" NAMES SPACES QUOTES NAME_VALUE QUOTES "(?: +COLLATE +" QUOTES NAME_VALUE QUOTES "|)" "|" SESSION_P1 VAR_P1 SPACES "(?:|:)=" SPACES QUOTES VAR_VALUE_P1 QUOTES ") *,? *"; + const string pattern="(|SESSION) *TRANSACTION(?: +)(?:(?:(ISOLATION(?: +)LEVEL)(?: +)(REPEATABLE(?: +)READ|READ(?: +)COMMITTED|READ(?: +)UNCOMMITTED|SERIALIZABLE))|(?:(READ)(?: +)(WRITE|ONLY)))"; + re2::RE2 re(pattern, *opt2); + string var; + string value1, value2, value3, value4, value5; + re2::StringPiece input(query); + while (re2::RE2::Consume(&input, re, &value1, &value2, &value3, &value4, &value5)) { + std::vector op; +#ifdef DEBUG + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 4, "SET parsing: v1='%s' , v2='%s' , v3='%s' , v4='%s' , v5='%s'\n", value1.c_str(), value2.c_str(), value3.c_str(), value4.c_str(), value5.c_str()); +#endif // DEBUG + string key; + if (value1 != "") { // session is specified + if (value2 != "") { // isolation level + key = value2; + std::transform(value3.begin(), value3.end(), value3.begin(), ::tolower); + op.push_back(value3); + } else { + key = value4; + std::transform(value5.begin(), value5.end(), value5.begin(), ::tolower); + op.push_back(value5); + } + } + std::transform(key.begin(), key.end(), key.begin(), ::tolower); + result[key] = op; + } + return result; +} diff --git a/src/events.log.00000004 b/src/events.log.00000004 new file mode 100644 index 000000000..c1df5d376 --- /dev/null +++ b/src/events.log.00000004 @@ -0,0 +1,15 @@ +{"client":"127.0.0.1:37850","digest":"0xDF13345B9BD2E195","duration_us":0,"endtime":"2019-09-08 17:25:48.434146","endtime_timestamp_us":1567927548434146,"event":"COM_QUERY","hostgroup_id":-1,"query":"SET time_zone='+04:00', sql_mode='NO_ENGINE_SUBSTITUTION'","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:25:48.434146","starttime_timestamp_us":1567927548434146,"thread_id":4,"username":"sbtest"} +{"client":"127.0.0.1:37850","digest":"0xE431D1FD83A3CB81","duration_us":11933,"endtime":"2019-09-08 17:25:48.542250","endtime_timestamp_us":1567927548542250,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 95;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.530317","starttime_timestamp_us":1567927548530317,"thread_id":4,"username":"sbtest"} +{"client":"127.0.0.1:37850","digest":"0xFE063E56751625F3","duration_us":1542,"endtime":"2019-09-08 17:25:48.544556","endtime_timestamp_us":1567927548544556,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.543014","starttime_timestamp_us":1567927548543014,"thread_id":4,"username":"sbtest"} +{"client":"127.0.0.1:37856","digest":"0x654DFECE24829BE6","duration_us":0,"endtime":"2019-09-08 17:25:48.546294","endtime_timestamp_us":1567927548546294,"event":"COM_QUERY","hostgroup_id":-1,"query":"SET time_zone='+01:00'","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:25:48.546294","starttime_timestamp_us":1567927548546294,"thread_id":7,"username":"sbtest"} +{"client":"127.0.0.1:37856","digest":"0xE431D1FD83A3CB81","duration_us":1389,"endtime":"2019-09-08 17:25:48.617356","endtime_timestamp_us":1567927548617356,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 69;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.615967","starttime_timestamp_us":1567927548615967,"thread_id":7,"username":"sbtest"} +{"client":"127.0.0.1:37856","digest":"0xFE063E56751625F3","duration_us":2237,"endtime":"2019-09-08 17:25:48.620243","endtime_timestamp_us":1567927548620243,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.618006","starttime_timestamp_us":1567927548618006,"thread_id":7,"username":"sbtest"} +{"client":"127.0.0.1:37848","digest":"0xC51BDBBD6C9BB1D7","duration_us":0,"endtime":"2019-09-08 17:25:48.622148","endtime_timestamp_us":1567927548622148,"event":"COM_QUERY","hostgroup_id":-1,"query":"SET autocommit=0","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:25:48.622148","starttime_timestamp_us":1567927548622148,"thread_id":3,"username":"sbtest"} +{"client":"127.0.0.1:37848","digest":"0xE431D1FD83A3CB81","duration_us":2212,"endtime":"2019-09-08 17:25:48.678108","endtime_timestamp_us":1567927548678108,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 53;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.675896","starttime_timestamp_us":1567927548675896,"thread_id":3,"username":"sbtest"} +{"client":"127.0.0.1:37848","digest":"0xFE063E56751625F3","duration_us":1854,"endtime":"2019-09-08 17:25:48.680596","endtime_timestamp_us":1567927548680596,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.678742","starttime_timestamp_us":1567927548678742,"thread_id":3,"username":"sbtest"} +{"client":"127.0.0.1:37850","digest":"0xE9785F59E9F9FBA0","duration_us":0,"endtime":"2019-09-08 17:25:48.682160","endtime_timestamp_us":1567927548682160,"event":"COM_QUERY","hostgroup_id":-1,"query":"set sql_mode=''","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:25:48.682160","starttime_timestamp_us":1567927548682160,"thread_id":4,"username":"sbtest"} +{"client":"127.0.0.1:37850","digest":"0xE431D1FD83A3CB81","duration_us":1276,"endtime":"2019-09-08 17:25:48.719923","endtime_timestamp_us":1567927548719923,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 36;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.718647","starttime_timestamp_us":1567927548718647,"thread_id":4,"username":"sbtest"} +{"client":"127.0.0.1:37850","digest":"0xFE063E56751625F3","duration_us":1416,"endtime":"2019-09-08 17:25:48.721702","endtime_timestamp_us":1567927548721702,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.720286","starttime_timestamp_us":1567927548720286,"thread_id":4,"username":"sbtest"} +{"client":"127.0.0.1:37852","digest":"0x1D7CA0CFB0D87824","duration_us":0,"endtime":"2019-09-08 17:25:48.723249","endtime_timestamp_us":1567927548723249,"event":"COM_QUERY","hostgroup_id":-1,"query":"SET sql_mode='PIPES_AS_CONCAT,NO_ENGINE_SUBSTITUTION'","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:25:48.723249","starttime_timestamp_us":1567927548723249,"thread_id":5,"username":"sbtest"} +{"client":"127.0.0.1:37852","digest":"0xE431D1FD83A3CB81","duration_us":1517,"endtime":"2019-09-08 17:25:48.759388","endtime_timestamp_us":1567927548759388,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 34;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.757871","starttime_timestamp_us":1567927548757871,"thread_id":5,"username":"sbtest"} +{"client":"127.0.0.1:37852","digest":"0xFE063E56751625F3","duration_us":1828,"endtime":"2019-09-08 17:25:48.761746","endtime_timestamp_us":1567927548761746,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.759918","starttime_timestamp_us":1567927548759918,"thread_id":5,"username":"sbtest"} diff --git a/src/events.log.00000005 b/src/events.log.00000005 new file mode 100644 index 000000000..bb17279fa --- /dev/null +++ b/src/events.log.00000005 @@ -0,0 +1,15 @@ +{"client":"127.0.0.1:38026","digest":"0xDF13345B9BD2E195","duration_us":0,"endtime":"2019-09-08 17:33:14.527445","endtime_timestamp_us":1567927994527445,"event":"COM_QUERY","hostgroup_id":-1,"query":"SET time_zone='-03:00', sql_mode='ALLOW_INVALID_DATES'","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:33:14.527445","starttime_timestamp_us":1567927994527445,"thread_id":4,"username":"sbtest"} +{"client":"127.0.0.1:38026","digest":"0xE431D1FD83A3CB81","duration_us":10692,"endtime":"2019-09-08 17:33:14.637785","endtime_timestamp_us":1567927994637785,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 99;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.627093","starttime_timestamp_us":1567927994627093,"thread_id":4,"username":"sbtest"} +{"client":"127.0.0.1:38026","digest":"0xFE063E56751625F3","duration_us":1359,"endtime":"2019-09-08 17:33:14.639497","endtime_timestamp_us":1567927994639497,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.638138","starttime_timestamp_us":1567927994638138,"thread_id":4,"username":"sbtest"} +{"client":"127.0.0.1:38040","digest":"0xE9785F59E9F9FBA0","duration_us":0,"endtime":"2019-09-08 17:33:14.641255","endtime_timestamp_us":1567927994641255,"event":"COM_QUERY","hostgroup_id":-1,"query":"set sql_mode=''","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:33:14.641255","starttime_timestamp_us":1567927994641255,"thread_id":11,"username":"sbtest"} +{"client":"127.0.0.1:38040","digest":"0xE431D1FD83A3CB81","duration_us":3662,"endtime":"2019-09-08 17:33:14.730834","endtime_timestamp_us":1567927994730834,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 85;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.727172","starttime_timestamp_us":1567927994727172,"thread_id":11,"username":"sbtest"} +{"client":"127.0.0.1:38040","digest":"0xFE063E56751625F3","duration_us":2057,"endtime":"2019-09-08 17:33:14.733486","endtime_timestamp_us":1567927994733486,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.731429","starttime_timestamp_us":1567927994731429,"thread_id":11,"username":"sbtest"} +{"client":"127.0.0.1:38040","digest":"0x1D7CA0CFB0D87824","duration_us":0,"endtime":"2019-09-08 17:33:14.735820","endtime_timestamp_us":1567927994735820,"event":"COM_QUERY","hostgroup_id":-1,"query":"SET sql_mode='PIPES_AS_CONCAT,NO_ENGINE_SUBSTITUTION'","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:33:14.735820","starttime_timestamp_us":1567927994735820,"thread_id":11,"username":"sbtest"} +{"client":"127.0.0.1:38040","digest":"0xE431D1FD83A3CB81","duration_us":1842,"endtime":"2019-09-08 17:33:14.829667","endtime_timestamp_us":1567927994829667,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 91;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.827825","starttime_timestamp_us":1567927994827825,"thread_id":11,"username":"sbtest"} +{"client":"127.0.0.1:38040","digest":"0xFE063E56751625F3","duration_us":2820,"endtime":"2019-09-08 17:33:14.833280","endtime_timestamp_us":1567927994833280,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.830460","starttime_timestamp_us":1567927994830460,"thread_id":11,"username":"sbtest"} +{"client":"127.0.0.1:38042","digest":"0xC51BDBBD6C9BB1D7","duration_us":0,"endtime":"2019-09-08 17:33:14.835420","endtime_timestamp_us":1567927994835420,"event":"COM_QUERY","hostgroup_id":-1,"query":"SET autocommit=0","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:33:14.835420","starttime_timestamp_us":1567927994835420,"thread_id":12,"username":"sbtest"} +{"client":"127.0.0.1:38042","digest":"0xE431D1FD83A3CB81","duration_us":1570,"endtime":"2019-09-08 17:33:14.889211","endtime_timestamp_us":1567927994889211,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 51;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.887641","starttime_timestamp_us":1567927994887641,"thread_id":12,"username":"sbtest"} +{"client":"127.0.0.1:38042","digest":"0xFE063E56751625F3","duration_us":2596,"endtime":"2019-09-08 17:33:14.892599","endtime_timestamp_us":1567927994892599,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.890003","starttime_timestamp_us":1567927994890003,"thread_id":12,"username":"sbtest"} +{"client":"127.0.0.1:38026","digest":"0x1D7CA0CFB0D87824","duration_us":0,"endtime":"2019-09-08 17:33:14.895545","endtime_timestamp_us":1567927994895545,"event":"COM_QUERY","hostgroup_id":-1,"query":"SET sql_mode='PIPES_AS_CONCAT,NO_ENGINE_SUBSTITUTION'","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:33:14.895545","starttime_timestamp_us":1567927994895545,"thread_id":4,"username":"sbtest"} +{"client":"127.0.0.1:38026","digest":"0xE431D1FD83A3CB81","duration_us":2406,"endtime":"2019-09-08 17:33:14.989818","endtime_timestamp_us":1567927994989818,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 91;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.987412","starttime_timestamp_us":1567927994987412,"thread_id":4,"username":"sbtest"} +{"client":"127.0.0.1:38026","digest":"0xFE063E56751625F3","duration_us":2856,"endtime":"2019-09-08 17:33:14.993518","endtime_timestamp_us":1567927994993518,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.990662","starttime_timestamp_us":1567927994990662,"thread_id":4,"username":"sbtest"} From 626c7817d8232817edc259149d7962f75e9991e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Mon, 9 Sep 2019 14:42:58 +1000 Subject: [PATCH 14/14] Deleted events file --- src/events.log.00000004 | 15 --------------- src/events.log.00000005 | 15 --------------- 2 files changed, 30 deletions(-) delete mode 100644 src/events.log.00000004 delete mode 100644 src/events.log.00000005 diff --git a/src/events.log.00000004 b/src/events.log.00000004 deleted file mode 100644 index c1df5d376..000000000 --- a/src/events.log.00000004 +++ /dev/null @@ -1,15 +0,0 @@ -{"client":"127.0.0.1:37850","digest":"0xDF13345B9BD2E195","duration_us":0,"endtime":"2019-09-08 17:25:48.434146","endtime_timestamp_us":1567927548434146,"event":"COM_QUERY","hostgroup_id":-1,"query":"SET time_zone='+04:00', sql_mode='NO_ENGINE_SUBSTITUTION'","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:25:48.434146","starttime_timestamp_us":1567927548434146,"thread_id":4,"username":"sbtest"} -{"client":"127.0.0.1:37850","digest":"0xE431D1FD83A3CB81","duration_us":11933,"endtime":"2019-09-08 17:25:48.542250","endtime_timestamp_us":1567927548542250,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 95;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.530317","starttime_timestamp_us":1567927548530317,"thread_id":4,"username":"sbtest"} -{"client":"127.0.0.1:37850","digest":"0xFE063E56751625F3","duration_us":1542,"endtime":"2019-09-08 17:25:48.544556","endtime_timestamp_us":1567927548544556,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.543014","starttime_timestamp_us":1567927548543014,"thread_id":4,"username":"sbtest"} -{"client":"127.0.0.1:37856","digest":"0x654DFECE24829BE6","duration_us":0,"endtime":"2019-09-08 17:25:48.546294","endtime_timestamp_us":1567927548546294,"event":"COM_QUERY","hostgroup_id":-1,"query":"SET time_zone='+01:00'","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:25:48.546294","starttime_timestamp_us":1567927548546294,"thread_id":7,"username":"sbtest"} -{"client":"127.0.0.1:37856","digest":"0xE431D1FD83A3CB81","duration_us":1389,"endtime":"2019-09-08 17:25:48.617356","endtime_timestamp_us":1567927548617356,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 69;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.615967","starttime_timestamp_us":1567927548615967,"thread_id":7,"username":"sbtest"} -{"client":"127.0.0.1:37856","digest":"0xFE063E56751625F3","duration_us":2237,"endtime":"2019-09-08 17:25:48.620243","endtime_timestamp_us":1567927548620243,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.618006","starttime_timestamp_us":1567927548618006,"thread_id":7,"username":"sbtest"} -{"client":"127.0.0.1:37848","digest":"0xC51BDBBD6C9BB1D7","duration_us":0,"endtime":"2019-09-08 17:25:48.622148","endtime_timestamp_us":1567927548622148,"event":"COM_QUERY","hostgroup_id":-1,"query":"SET autocommit=0","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:25:48.622148","starttime_timestamp_us":1567927548622148,"thread_id":3,"username":"sbtest"} -{"client":"127.0.0.1:37848","digest":"0xE431D1FD83A3CB81","duration_us":2212,"endtime":"2019-09-08 17:25:48.678108","endtime_timestamp_us":1567927548678108,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 53;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.675896","starttime_timestamp_us":1567927548675896,"thread_id":3,"username":"sbtest"} -{"client":"127.0.0.1:37848","digest":"0xFE063E56751625F3","duration_us":1854,"endtime":"2019-09-08 17:25:48.680596","endtime_timestamp_us":1567927548680596,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.678742","starttime_timestamp_us":1567927548678742,"thread_id":3,"username":"sbtest"} -{"client":"127.0.0.1:37850","digest":"0xE9785F59E9F9FBA0","duration_us":0,"endtime":"2019-09-08 17:25:48.682160","endtime_timestamp_us":1567927548682160,"event":"COM_QUERY","hostgroup_id":-1,"query":"set sql_mode=''","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:25:48.682160","starttime_timestamp_us":1567927548682160,"thread_id":4,"username":"sbtest"} -{"client":"127.0.0.1:37850","digest":"0xE431D1FD83A3CB81","duration_us":1276,"endtime":"2019-09-08 17:25:48.719923","endtime_timestamp_us":1567927548719923,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 36;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.718647","starttime_timestamp_us":1567927548718647,"thread_id":4,"username":"sbtest"} -{"client":"127.0.0.1:37850","digest":"0xFE063E56751625F3","duration_us":1416,"endtime":"2019-09-08 17:25:48.721702","endtime_timestamp_us":1567927548721702,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.720286","starttime_timestamp_us":1567927548720286,"thread_id":4,"username":"sbtest"} -{"client":"127.0.0.1:37852","digest":"0x1D7CA0CFB0D87824","duration_us":0,"endtime":"2019-09-08 17:25:48.723249","endtime_timestamp_us":1567927548723249,"event":"COM_QUERY","hostgroup_id":-1,"query":"SET sql_mode='PIPES_AS_CONCAT,NO_ENGINE_SUBSTITUTION'","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:25:48.723249","starttime_timestamp_us":1567927548723249,"thread_id":5,"username":"sbtest"} -{"client":"127.0.0.1:37852","digest":"0xE431D1FD83A3CB81","duration_us":1517,"endtime":"2019-09-08 17:25:48.759388","endtime_timestamp_us":1567927548759388,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 34;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.757871","starttime_timestamp_us":1567927548757871,"thread_id":5,"username":"sbtest"} -{"client":"127.0.0.1:37852","digest":"0xFE063E56751625F3","duration_us":1828,"endtime":"2019-09-08 17:25:48.761746","endtime_timestamp_us":1567927548761746,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:25:48.759918","starttime_timestamp_us":1567927548759918,"thread_id":5,"username":"sbtest"} diff --git a/src/events.log.00000005 b/src/events.log.00000005 deleted file mode 100644 index bb17279fa..000000000 --- a/src/events.log.00000005 +++ /dev/null @@ -1,15 +0,0 @@ -{"client":"127.0.0.1:38026","digest":"0xDF13345B9BD2E195","duration_us":0,"endtime":"2019-09-08 17:33:14.527445","endtime_timestamp_us":1567927994527445,"event":"COM_QUERY","hostgroup_id":-1,"query":"SET time_zone='-03:00', sql_mode='ALLOW_INVALID_DATES'","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:33:14.527445","starttime_timestamp_us":1567927994527445,"thread_id":4,"username":"sbtest"} -{"client":"127.0.0.1:38026","digest":"0xE431D1FD83A3CB81","duration_us":10692,"endtime":"2019-09-08 17:33:14.637785","endtime_timestamp_us":1567927994637785,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 99;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.627093","starttime_timestamp_us":1567927994627093,"thread_id":4,"username":"sbtest"} -{"client":"127.0.0.1:38026","digest":"0xFE063E56751625F3","duration_us":1359,"endtime":"2019-09-08 17:33:14.639497","endtime_timestamp_us":1567927994639497,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.638138","starttime_timestamp_us":1567927994638138,"thread_id":4,"username":"sbtest"} -{"client":"127.0.0.1:38040","digest":"0xE9785F59E9F9FBA0","duration_us":0,"endtime":"2019-09-08 17:33:14.641255","endtime_timestamp_us":1567927994641255,"event":"COM_QUERY","hostgroup_id":-1,"query":"set sql_mode=''","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:33:14.641255","starttime_timestamp_us":1567927994641255,"thread_id":11,"username":"sbtest"} -{"client":"127.0.0.1:38040","digest":"0xE431D1FD83A3CB81","duration_us":3662,"endtime":"2019-09-08 17:33:14.730834","endtime_timestamp_us":1567927994730834,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 85;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.727172","starttime_timestamp_us":1567927994727172,"thread_id":11,"username":"sbtest"} -{"client":"127.0.0.1:38040","digest":"0xFE063E56751625F3","duration_us":2057,"endtime":"2019-09-08 17:33:14.733486","endtime_timestamp_us":1567927994733486,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.731429","starttime_timestamp_us":1567927994731429,"thread_id":11,"username":"sbtest"} -{"client":"127.0.0.1:38040","digest":"0x1D7CA0CFB0D87824","duration_us":0,"endtime":"2019-09-08 17:33:14.735820","endtime_timestamp_us":1567927994735820,"event":"COM_QUERY","hostgroup_id":-1,"query":"SET sql_mode='PIPES_AS_CONCAT,NO_ENGINE_SUBSTITUTION'","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:33:14.735820","starttime_timestamp_us":1567927994735820,"thread_id":11,"username":"sbtest"} -{"client":"127.0.0.1:38040","digest":"0xE431D1FD83A3CB81","duration_us":1842,"endtime":"2019-09-08 17:33:14.829667","endtime_timestamp_us":1567927994829667,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 91;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.827825","starttime_timestamp_us":1567927994827825,"thread_id":11,"username":"sbtest"} -{"client":"127.0.0.1:38040","digest":"0xFE063E56751625F3","duration_us":2820,"endtime":"2019-09-08 17:33:14.833280","endtime_timestamp_us":1567927994833280,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.830460","starttime_timestamp_us":1567927994830460,"thread_id":11,"username":"sbtest"} -{"client":"127.0.0.1:38042","digest":"0xC51BDBBD6C9BB1D7","duration_us":0,"endtime":"2019-09-08 17:33:14.835420","endtime_timestamp_us":1567927994835420,"event":"COM_QUERY","hostgroup_id":-1,"query":"SET autocommit=0","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:33:14.835420","starttime_timestamp_us":1567927994835420,"thread_id":12,"username":"sbtest"} -{"client":"127.0.0.1:38042","digest":"0xE431D1FD83A3CB81","duration_us":1570,"endtime":"2019-09-08 17:33:14.889211","endtime_timestamp_us":1567927994889211,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 51;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.887641","starttime_timestamp_us":1567927994887641,"thread_id":12,"username":"sbtest"} -{"client":"127.0.0.1:38042","digest":"0xFE063E56751625F3","duration_us":2596,"endtime":"2019-09-08 17:33:14.892599","endtime_timestamp_us":1567927994892599,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.890003","starttime_timestamp_us":1567927994890003,"thread_id":12,"username":"sbtest"} -{"client":"127.0.0.1:38026","digest":"0x1D7CA0CFB0D87824","duration_us":0,"endtime":"2019-09-08 17:33:14.895545","endtime_timestamp_us":1567927994895545,"event":"COM_QUERY","hostgroup_id":-1,"query":"SET sql_mode='PIPES_AS_CONCAT,NO_ENGINE_SUBSTITUTION'","rows_affected":0,"rows_sent":0,"schemaname":"information_schema","starttime":"2019-09-08 17:33:14.895545","starttime_timestamp_us":1567927994895545,"thread_id":4,"username":"sbtest"} -{"client":"127.0.0.1:38026","digest":"0xE431D1FD83A3CB81","duration_us":2406,"endtime":"2019-09-08 17:33:14.989818","endtime_timestamp_us":1567927994989818,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT 91;","rows_affected":0,"rows_sent":1,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.987412","starttime_timestamp_us":1567927994987412,"thread_id":4,"username":"sbtest"} -{"client":"127.0.0.1:38026","digest":"0xFE063E56751625F3","duration_us":2856,"endtime":"2019-09-08 17:33:14.993518","endtime_timestamp_us":1567927994993518,"event":"COM_QUERY","hostgroup_id":0,"query":"SELECT * FROM performance_schema.session_variables WHERE variable_name IN ('hostname', 'sql_log_bin', 'sql_mode', 'init_connect', 'time_zone', 'autocommit', 'sql_auto_is_null', 'sql_safe_updates', 'session_track_gtids', 'max_join_size', 'net_write_timeout', 'sql_select_limit');","rows_affected":0,"rows_sent":12,"schemaname":"information_schema","server":"127.0.0.1:3306","starttime":"2019-09-08 17:33:14.990662","starttime_timestamp_us":1567927994990662,"thread_id":4,"username":"sbtest"}