Merge pull request #2243 from sysown/v2.0.7.2

V2.0.7.2
pull/2251/head
René Cannaò 7 years ago committed by GitHub
commit 99b4dd4bbd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -114,11 +114,33 @@ 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_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();
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_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 *);
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_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 *);
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_MAX_JOIN_SIZE(int *);
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 *);
@ -245,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

@ -19,6 +19,16 @@
#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"
#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"
static unsigned int near_pow_2 (unsigned int n) {
unsigned int i = 1;
@ -443,6 +453,16 @@ class MySQL_Threads_Handler
char *add_ldap_user_comment;
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;
char *default_sql_select_limit;
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 */

@ -44,12 +44,42 @@ class MySQL_Connection {
char *time_zone;
uint32_t sql_mode_int;
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;
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;
unsigned int compression_min_length;
char *init_connect;
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;
char * sql_safe_updates;
char * collation_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;
bool sql_select_limit_sent;
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;

@ -152,6 +152,16 @@ enum session_status {
SETTING_SQL_LOG_BIN,
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,
SETTING_SQL_SELECT_LIMIT,
SETTING_SQL_SAFE_UPDATES,
SETTING_COLLATION_CONNECTION,
SETTING_NET_WRITE_TIMEOUT,
SETTING_MAX_JOIN_SIZE,
FAST_FORWARD,
PROCESSING_STMT_PREPARE,
PROCESSING_STMT_EXECUTE,
@ -612,6 +622,16 @@ __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_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;
__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 bool mysql_thread___use_tcp_keepalive;
__thread int mysql_thread___tcp_keepalive_time;
@ -748,6 +768,16 @@ 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_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;
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 bool mysql_thread___use_tcp_keepalive;
extern __thread int mysql_thread___tcp_keepalive_time;

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

@ -2777,24 +2777,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;
}
}
}

@ -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:
@ -1475,7 +1476,7 @@ bool MySQL_Protocol::process_pkt_handshake_response(unsigned char *pkt, unsigned
#endif
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;

File diff suppressed because it is too large Load Diff

@ -333,6 +333,16 @@ 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_transaction_read",
(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 *)"default_max_join_size",
(char *)"connpoll_reset_queue_length",
(char *)"min_num_servers_lantency_awareness",
(char *)"stats_time_backend_query",
@ -432,6 +442,16 @@ 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_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);
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.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");
@ -634,6 +654,66 @@ 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_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);
}
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,"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,"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);
@ -873,6 +953,66 @@ 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_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);
}
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,"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,"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);
@ -2139,6 +2279,136 @@ 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_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;
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,"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,"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);
@ -2749,6 +3019,16 @@ 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_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);
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.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);
@ -2869,6 +3149,16 @@ 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_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; }
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___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; }
@ -2931,6 +3221,77 @@ 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 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) {
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);
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);
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;
}
@ -2969,8 +3330,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;
@ -3996,6 +4357,26 @@ 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_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);
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___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);

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

@ -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",
@ -206,6 +206,26 @@ MySQL_Connection::MySQL_Connection() {
options.no_backslash_escapes=false;
options.init_connect=NULL;
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;
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.transaction_read_sent = false;
options.character_set_results_sent = false;
options.session_track_gtids_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.max_join_size_sent = false;
options.sql_mode_sent=false;
options.ldap_user_variable=NULL;
options.ldap_user_variable_value=NULL;
@ -215,6 +235,16 @@ 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.transaction_read_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;
@ -291,6 +321,46 @@ 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.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;
}
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) {
@ -1997,6 +2067,66 @@ 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.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);
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;
}
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;
}
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;

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

@ -124,12 +124,39 @@ 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) {
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"}) } },
@ -140,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"}) } },

Loading…
Cancel
Save