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.
pull/2243/head
René Cannaò 7 years ago
parent beabd5e66a
commit aaf83eec78

@ -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

@ -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;

@ -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;

@ -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;

@ -9,7 +9,8 @@ class SetParser {
std::string query;
public:
SetParser(std::string q);
std::map<std::string, std::vector<std::string>> parse();
std::map<std::string, std::vector<std::string>> parse1();
std::map<std::string, std::vector<std::string>> parse2();
};

@ -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;
}
}
}

@ -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<std::string, std::vector<std::string>> set = parser.parse();
bool exit_after_SetParse = false;
std::map<std::string, std::vector<std::string>> 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<std::string, std::vector<std::string>> 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());
}
}

@ -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);

@ -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);

@ -16,7 +16,12 @@ SetParser::SetParser(std::string nq) {
free(query_no_space);
}
std::map<std::string,std::vector<string>> SetParser::parse() {
#define QUOTES "(?:'|\")?"
#define SPACES " *"
#define NAMES "(NAMES)"
#define NAME_VALUE "((?:\\w|\\d)+)"
std::map<std::string,std::vector<string>> 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<std::string,std::vector<string>> SetParser::parse() {
std::map<std::string,std::vector<string>> 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<std::string,std::vector<string>> 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<std::string,std::vector<string>> SetParser::parse() {
}
std::map<std::string,std::vector<string>> 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<std::string,std::vector<string>> 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<std::string> 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;
}

@ -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"}

@ -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"}
Loading…
Cancel
Save