Generalize the use of session variables

Added new array mysql_tracked_variables[] that defines the tracked variables.
Ideally, tracking a new session variable will requires adding only a couple of lines of code.

Removed session variables from mysql_thread_variables_names:
- now both MySQL_Threads_Handler::get_variables_list() and MySQL_Threads_Handler::has_variable() rely on mysql_tracked_variables[]

Simplified MySQL_Variables, as it now also uses mysql_tracked_variables[] .

Simplify parser in MySQL_Session

Generalized code to handle two variables together:
- sql_auto_is_null
- sql_safe_updates

Migrating more session variables to new algorithm

- collation_connection
- net_write_timeout
- max_join_size

Migrating more session variables to new algorithm

- collation_connection
- net_write_timeout
- max_join_size
pull/2582/head
René Cannaò 6 years ago committed by val
parent 1fb5c9cf06
commit d242771a25

@ -107,23 +107,14 @@ class MySQL_Session
int handler_again___status_RESETTING_CONNECTION();
void handler_again___new_thread_to_kill_connection();
bool handler_again___verify_backend(int var);
// bool handler_again___verify_backend(int var);
bool handler_again___verify_backend_charset();
bool handler_again___verify_init_connect();
bool handler_again___verify_ldap_user_variable();
bool handler_again___verify_backend_autocommit();
bool handler_again___verify_backend_user_schema();
bool handler_again___verify_backend_sql_log_bin();
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_tx_isolation();
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_collation_connection();
bool handler_again___verify_backend_net_write_timeout();
bool handler_again___verify_backend_max_join_size();
bool handler_again___verify_backend_multi_statement();
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 *);

@ -17,16 +17,7 @@
#define SQLITE_HOSTGROUP -4
#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_TX_ISOLATION "READ-COMMITTED"
#define MYSQL_DEFAULT_CHARACTER_SET_RESULTS "NULL"
#define MYSQL_DEFAULT_SESSION_TRACK_GTIDS "OFF"
#define MYSQL_DEFAULT_SQL_AUTO_IS_NULL "OFF"
#define MYSQL_DEFAULT_SQL_SELECT_LIMIT "DEFAULT"
#define MYSQL_DEFAULT_SQL_SAFE_UPDATES "OFF"
#define MYSQL_DEFAULT_COLLATION_CONNECTION ""
#define MYSQL_DEFAULT_NET_WRITE_TIMEOUT "60"
#define MYSQL_DEFAULT_MAX_JOIN_SIZE "18446744073709551615"
@ -365,19 +356,8 @@ class MySQL_Threads_Handler
char *init_connect;
char *ldap_user_variable;
char *add_ldap_user_comment;
char *default_sql_mode;
char *default_time_zone;
char *default_isolation_level;
char *default_transaction_read;
char *default_tx_isolation;
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 *default_variables[SQL_NAME_LAST];
char *firewall_whitelist_errormsg;
#ifdef DEBUG
bool session_debug;

@ -44,7 +44,7 @@ public:
uint32_t server_get_hash(int idx);
bool verify_variable(int idx);
bool update_variable(int &_rc);
bool update_variable(session_status status, int &_rc);
};

@ -59,21 +59,21 @@ class MySQL_Connection {
public:
struct {
char *server_version;
uint32_t collation_connection_int;
uint32_t net_write_timeout_int;
uint32_t max_join_size_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 * collation_connection;
char * net_write_timeout;
char * max_join_size;
bool collation_connection_sent;
bool net_write_timeout_sent;
bool max_join_size_sent;
// char * collation_connection;
// char * net_write_timeout;
// char * max_join_size;
// bool collation_connection_sent;
// bool net_write_timeout_sent;
// bool max_join_size_sent;
char *ldap_user_variable;
char *ldap_user_variable_value;
bool ldap_user_variable_sent;

@ -156,9 +156,9 @@ enum variable_name {
SQL_TRANSACTION_READ,
SQL_SESSION_TRACK_GTIDS,
SQL_SQL_AUTO_IS_NULL,
/* SQL_COLLATION_CONNECTION,
SQL_COLLATION_CONNECTION,
SQL_NET_WRITE_TIMEOUT,
SQL_MAX_JOIN_SIZE,*/
SQL_MAX_JOIN_SIZE,
SQL_NAME_LAST
};
@ -196,9 +196,24 @@ enum session_status {
FAST_FORWARD,
PROCESSING_STMT_PREPARE,
PROCESSING_STMT_EXECUTE,
SETTING_VARIABLE,
SETTING_MULTIPLE_VARIABLES,
NONE
};
#ifdef __cplusplus
typedef struct {
enum variable_name idx; // index number
enum session_status status; // what status should be changed after setting this variables
bool quote; // if the variable needs to be quoted
bool set_transaction; // if related to SET TRANSACTION statement . if false , it will be execute "SET varname = varvalue" . If true, "SET varname varvalue"
bool special_handling; // if true, some special handling is required
char * set_variable_name; // what variable name (or string) will be used when setting it to backend
char * internal_variable_name; // variable name as displayed in admin , WITHOUT "default_"
char * default_value; // default value
} mysql_variable_st;
#endif
enum mysql_data_stream_status {
STATE_NOT_INITIALIZED,
STATE_NOT_CONNECTED,
@ -667,19 +682,7 @@ __thread char *mysql_thread___server_version;
__thread char *mysql_thread___keep_multiplexing_variables;
__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_tx_isolation;
__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 char *mysql_thread___firewall_whitelist_errormsg;
__thread int mysql_thread___max_allowed_packet;
__thread bool mysql_thread___automatic_detect_sqli;
@ -753,6 +756,7 @@ __thread bool mysql_thread___session_idle_show_processlist;
__thread bool mysql_thread___sessions_sort;
__thread bool mysql_thread___kill_backend_connection_when_disconnect;
__thread bool mysql_thread___client_session_track_gtid;
__thread char * mysql_thread___default_variables[SQL_NAME_LAST];
/* variables used for Query Cache */
__thread int mysql_thread___query_cache_size_MB;
@ -822,19 +826,7 @@ extern __thread char *mysql_thread___server_version;
extern __thread char *mysql_thread___keep_multiplexing_variables;
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_tx_isolation;
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 char *mysql_thread___firewall_whitelist_errormsg;
extern __thread int mysql_thread___max_allowed_packet;
extern __thread bool mysql_thread___automatic_detect_sqli;
@ -908,6 +900,7 @@ extern __thread bool mysql_thread___session_idle_show_processlist;
extern __thread bool mysql_thread___sessions_sort;
extern __thread bool mysql_thread___kill_backend_connection_when_disconnect;
extern __thread bool mysql_thread___client_session_track_gtid;
extern __thread char * mysql_thread___default_variables[SQL_NAME_LAST];
/* variables used for Query Cache */
extern __thread int mysql_thread___query_cache_size_MB;
@ -967,3 +960,26 @@ extern __thread bool mysql_thread___session_debug;
#endif /* DEBUG */
extern __thread unsigned int g_seed;
#endif /* PROXYSQL_EXTERN */
#ifndef MYSQL_TRACKED_VARIABLES
#define MYSQL_TRACKED_VARIABLES
#ifdef PROXYSQL_EXTERN
mysql_variable_st mysql_tracked_variables[] {
{ SQL_SAFE_UPDATES, SETTING_SQL_SAFE_UPDATES , true, false, false, (char *)"sql_safe_update", (char *)"sql_safe_update", (char *)"OFF" } ,
{ SQL_SELECT_LIMIT, SETTING_SQL_SELECT_LIMIT , true, false, false, (char *)"sql_select_limit", (char *)"sql_select_limit", (char *)"DEFAULT" } ,
{ SQL_SQL_MODE, SETTING_SQL_MODE , false, false, false, (char *)"sql_mode" , (char *)"sql_mode" , (char *)"" } ,
{ SQL_TIME_ZONE, SETTING_TIME_ZONE , false, false, false, (char *)"time_zone", (char *)"time_zone", (char *)"SYSTEM" } ,
{ SQL_CHARACTER_SET_RESULTS, SETTING_CHARACTER_SET_RESULTS, true, false, false, (char *)"character_set_results", (char *)"character_set_results", (char *)"NULL" } ,
{ SQL_ISOLATION_LEVEL, SETTING_ISOLATION_LEVEL, false, true, true, (char *)"SESSION TRANSACTION ISOLATION LEVEL", (char *)"isolation_level", (char *)"READ COMMITTED" } ,
{ SQL_TRANSACTION_READ, SETTING_TRANSACTION_READ, false, true, true, (char *)"SESSION TRANSACTION READ", (char *)"transaction_read", (char *)"WRITE" } ,
{ SQL_SESSION_TRACK_GTIDS, SETTING_SESSION_TRACK_GTIDS, true, false, false, (char *)"session_track_gtids" , (char *)"session_track_gtids" , (char *)"OFF" } ,
{ SQL_SQL_AUTO_IS_NULL, SETTING_SQL_AUTO_IS_NULL, true, false, false, (char *)"sql_auto_is_null", (char *)"sql_auto_is_null", (char *)"OFF" } ,
{ SQL_COLLATION_CONNECTION, SETTING_COLLATION_CONNECTION, true, false, false, (char *)"COLLATION_CONNECTION", (char *)"collation_connection", (char *)"" } ,
{ SQL_NET_WRITE_TIMEOUT, SETTING_NET_WRITE_TIMEOUT, false, false, false, (char *)"NET_WRITE_TIMEOUT", (char *)"net_write_timeout", (char *)"60" } ,
{ SQL_MAX_JOIN_SIZE, SETTING_MAX_JOIN_SIZE, false, false, false, (char *)"MAX_JOIN_SIZE", (char *)"max_join_size", (char *)"18446744073709551615" } ,
};
#else
extern mysql_variable_st mysql_tracked_variables[];
#endif // PROXYSQL_EXTERN
#endif // MYSQL_TRACKED_VARIABLES

@ -962,9 +962,6 @@ void MySQL_Session::generate_proxysql_internal_session_json(json &j) {
for (auto idx = 0; idx < SQL_NAME_LAST; idx++) {
client_myds->myconn->variables[idx].fill_client_internal_session(j, idx);
}
j["conn"]["collation_connection"] = ( client_myds->myconn->options.collation_connection ? client_myds->myconn->options.collation_connection : "") ;
j["conn"]["net_write_timeout"] = ( client_myds->myconn->options.net_write_timeout ? client_myds->myconn->options.net_write_timeout : "") ;
j["conn"]["max_join_size"] = ( client_myds->myconn->options.max_join_size ? client_myds->myconn->options.max_join_size : "") ;
j["conn"]["charset"] = client_myds->myconn->options.charset;
j["conn"]["sql_log_bin"] = client_myds->myconn->options.sql_log_bin;
j["conn"]["autocommit"] = ( client_myds->myconn->options.autocommit ? "ON" : "OFF" );
@ -1009,9 +1006,6 @@ void MySQL_Session::generate_proxysql_internal_session_json(json &j) {
j["backends"][i]["conn"]["questions"] = _myconn->statuses.questions;
j["backends"][i]["conn"]["myconnpoll_get"] = _myconn->statuses.myconnpoll_get;
j["backends"][i]["conn"]["myconnpoll_put"] = _myconn->statuses.myconnpoll_put;
j["backends"][i]["conn"]["collation_connection"] = ( _myconn->options.collation_connection ? _myconn->options.collation_connection : "") ;
j["backends"][i]["conn"]["net_write_timeout"] = ( _myconn->options.net_write_timeout ? _myconn->options.net_write_timeout : "") ;
j["backends"][i]["conn"]["max_join_size"] = ( _myconn->options.max_join_size ? _myconn->options.max_join_size : "") ;
//j["backend"][i]["conn"]["charset"] = _myds->myconn->options.charset; // not used for backend
j["backends"][i]["conn"]["sql_log_bin"] = ( _myconn->options.sql_log_bin ? "ON" : "OFF" );
j["backends"][i]["conn"]["init_connect"] = ( _myconn->options.init_connect ? _myconn->options.init_connect : "");
@ -1680,40 +1674,14 @@ bool MySQL_Session::handler_again___verify_backend__generic_variable(uint32_t *b
return false;
}
/*
bool MySQL_Session::handler_again___verify_backend(int var) {
bool ret = false;
proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Session %p , client: %s , backend: %s\n", this, mysql_variables->client_get_value(var), mysql_variables->server_get_value(var));
ret = mysql_variables->verify_variable(var);
return ret;
}
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,
mysql_thread___default_collation_connection,
&client_myds->myconn->options.collation_connection_int,
client_myds->myconn->options.collation_connection,
SETTING_COLLATION_CONNECTION
);
return ret;
}
bool MySQL_Session::handler_again___verify_backend_net_write_timeout() {
bool ret = false;
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,
mysql_thread___default_net_write_timeout,
&client_myds->myconn->options.net_write_timeout_int,
client_myds->myconn->options.net_write_timeout,
SETTING_NET_WRITE_TIMEOUT
);
return ret;
}
*/
bool MySQL_Session::handler_again___verify_backend_multi_statement() {
if (client_myds->myconn->options.client_flag & CLIENT_MULTI_STATEMENTS != mybe->server_myds->myconn->options.client_flag & CLIENT_MULTI_STATEMENTS) {
@ -1742,20 +1710,6 @@ bool MySQL_Session::handler_again___verify_backend_multi_statement() {
return false;
}
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,
mysql_thread___default_max_join_size,
&client_myds->myconn->options.max_join_size_int,
client_myds->myconn->options.max_join_size,
SETTING_MAX_JOIN_SIZE
);
return ret;
}
bool MySQL_Session::handler_again___verify_init_connect() {
if (mybe->server_myds->myconn->options.init_connect_sent==false) {
// we needs to set it to true
@ -2183,112 +2137,6 @@ bool MySQL_Session::handler_again___status_SETTING_SQL_LOG_BIN(int *_rc) {
return ret;
}
/* FIXME: this old code hardcoded the handling of issue 1738
// this seems unnecessary/redundant
// leaving the code for further reference, to be removed later
// FIXME
bool MySQL_Session::handler_again___status_SETTING_SQL_MODE(int *_rc) {
bool ret=false;
assert(mybe->server_myds->myconn);
MySQL_Data_Stream *myds=mybe->server_myds;
MySQL_Connection *myconn=myds->myconn;
myds->DSS=STATE_MARIADB_QUERY;
enum session_status st=status;
if (myds->mypolls==NULL) {
thread->mypolls.add(POLLIN|POLLOUT, mybe->server_myds->fd, mybe->server_myds, thread->curtime);
}
char *query=NULL;
unsigned long query_length=0;
if (myconn->async_state_machine==ASYNC_IDLE) {
char *q=NULL;
q=(char *)"SET SQL_MODE='%s'";
if (strlen(myconn->options.sql_mode) > 6) {
if (strncasecmp(myconn->options.sql_mode,(char *)"CONCAT",6)==0) {
q=(char *)"SET SQL_MODE=%s";
}
if (strncasecmp(myconn->options.sql_mode,(char *)"@",1)==0) {
q=(char *)"SET SQL_MODE=%s";
}
}
query=(char *)malloc(strlen(q)+strlen(myconn->options.sql_mode));
sprintf(query,q,myconn->options.sql_mode);
query_length=strlen(query);
}
int rc=myconn->async_send_simple_command(myds->revents,query,query_length);
if (query) {
free(query);
query=NULL;
}
if (rc==0) {
myds->revents|=POLLOUT; // we also set again POLLOUT to send a query immediately!
st=previous_status.top();
previous_status.pop();
bool nbe = (myconn->mysql->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES);
if (client_myds) {
client_myds->myconn->set_no_backslash_escapes(nbe);
}
if (nbe) {
myconn->set_status_no_backslash_escapes(nbe);
}
if (st == PROCESSING_QUERY) { // only TEXT protocol, no prepared statements
if (client_myds && mirror==false) {
if (CurrentQuery.QueryParserArgs.digest_text) {
// this is not meant to match all the SET SQL_MODE, but just to
// reduce unnecessary SET SQL_MODE when possible
if (strncasecmp(CurrentQuery.QueryParserArgs.digest_text,(char *)"set sql_mode",12)==0) {
unsigned int nTrx=NumActiveTransactions();
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);
RequestEnd(myds);
finishQuery(myds,myconn,false);
return ret;
}
}
}
}
NEXT_IMMEDIATE_NEW(st);
} else {
if (rc==-1) {
// the command failed
int myerr=mysql_errno(myconn->mysql);
if (myerr >= 2000) {
bool retry_conn=false;
// client error, serious
proxy_error("Detected a broken connection while setting SQL_MODE on %s , %d : %d, %s\n", myconn->parent->address, myconn->parent->port, myerr, mysql_error(myconn->mysql));
//if ((myds->myconn->reusable==true) && ((myds->myprot.prot_status & SERVER_STATUS_IN_TRANS)==0)) {
if ((myds->myconn->reusable==true) && myds->myconn->IsActiveTransaction()==false && myds->myconn->MultiplexDisabled()==false) {
retry_conn=true;
}
myds->destroy_MySQL_Connection_From_Pool(false);
myds->fd=0;
if (retry_conn) {
myds->DSS=STATE_NOT_INITIALIZED;
//previous_status.push(PROCESSING_QUERY);
NEXT_IMMEDIATE_NEW(CONNECTING_SERVER);
}
*_rc=-1; // an error happened, we should destroy the Session
return ret;
} else {
proxy_warning("Error while setting SQL_MODE: %d, %s\n", myerr, mysql_error(myconn->mysql));
// we won't go back to PROCESSING_QUERY
st=previous_status.top();
previous_status.pop();
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);
myds->fd=0;
RequestEnd(myds);
}
} else {
// rc==1 , nothing to do for now
}
}
return ret;
}
*/
bool MySQL_Session::handler_again___status_SETTING_GENERIC_VARIABLE(int *_rc, const char *var_name, const char *var_value, bool no_quote, bool set_transaction) {
bool ret = false;
assert(mybe->server_myds->myconn);
@ -2457,28 +2305,6 @@ bool MySQL_Session::handler_again___status_SETTING_SQL_SAFE_UPDATES(int *_rc) {
return ret;
}
bool MySQL_Session::handler_again___status_SETTING_COLLATION_CONNECTION(int *_rc) {
bool ret=false;
assert(mybe->server_myds->myconn);
ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"COLLATION_CONNECTION", mybe->server_myds->myconn->options.collation_connection);
return ret;
}
bool MySQL_Session::handler_again___status_SETTING_NET_WRITE_TIMEOUT(int *_rc) {
bool ret=false;
assert(mybe->server_myds->myconn);
ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"NET_WRITE_TIMEOUT", mybe->server_myds->myconn->options.net_write_timeout, true);
return ret;
}
bool MySQL_Session::handler_again___status_SETTING_MAX_JOIN_SIZE(int *_rc) {
bool ret=false;
assert(mybe->server_myds->myconn);
ret = handler_again___status_SETTING_GENERIC_VARIABLE(_rc, (char *)"MAX_JOIN_SIZE", mybe->server_myds->myconn->options.max_join_size, true);
return ret;
}
bool MySQL_Session::handler_again___status_CHANGING_SCHEMA(int *_rc) {
bool ret=false;
//fprintf(stderr,"CHANGING_SCHEMA\n");
@ -3789,6 +3615,7 @@ handler_again:
}
for (auto i = 0; i < SQL_NAME_LAST; i++) {
// FIXME: for now it seems broken
if(mysql_variables->verify_variable(i))
goto handler_again;
}
@ -3796,15 +3623,6 @@ handler_again:
if (handler_again___verify_backend_sql_log_bin()) {
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 (handler_again___verify_backend_multi_statement()) {
goto handler_again;
}
@ -4353,9 +4171,12 @@ handler_again:
case SETTING_TRANSACTION_READ:
case SETTING_SESSION_TRACK_GTIDS:
case SETTING_SQL_AUTO_IS_NULL:
case SETTING_COLLATION_CONNECTION:
case SETTING_NET_WRITE_TIMEOUT:
case SETTING_MAX_JOIN_SIZE:
for (auto i = 0; i < SQL_NAME_LAST; i++) {
int rc = 0;
if (mysql_variables->update_variable(rc)) {
if (mysql_variables->update_variable(status, rc)) {
goto handler_again;
}
if (rc == -1) {
@ -4365,42 +4186,6 @@ handler_again:
}
break;
case SETTING_COLLATION_CONNECTION:
{
int rc=0;
if (handler_again___status_SETTING_COLLATION_CONNECTION(&rc))
goto handler_again; // we changed status
if (rc==-1) { // we have an error we can't handle
handler_ret = -1;
return handler_ret;
}
}
break;
case SETTING_NET_WRITE_TIMEOUT:
{
int rc=0;
if (handler_again___status_SETTING_NET_WRITE_TIMEOUT(&rc))
goto handler_again; // we changed status
if (rc==-1) { // we have an error we can't handle
handler_ret = -1;
return handler_ret;
}
}
break;
case SETTING_MAX_JOIN_SIZE:
{
int rc=0;
if (handler_again___status_SETTING_MAX_JOIN_SIZE(&rc))
goto handler_again; // we changed status
if (rc==-1) { // we have an error we can't handle
handler_ret = -1;
return handler_ret;
}
}
break;
case SETTING_INIT_CONNECT:
{
int rc=0;
@ -5309,9 +5094,9 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C
proxy_debug(PROXY_DEBUG_MYSQL_COM, 8, "Changing connection SQL Mode to %s\n", value1.c_str());
}
exit_after_SetParse = true;
} else if (var == "sql_auto_is_null") {
} else if ((var == "sql_auto_is_null") || (var == "sql_safe_updates")) {
std::string value1 = *values;
proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Processing SET sql_auto_is_null value %s\n", value1.c_str());
proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Processing SET %s value %s\n", var.c_str(), value1.c_str());
int __tmp_value = -1;
if (
(strcasecmp(value1.c_str(),(char *)"0")==0) ||
@ -5329,42 +5114,23 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C
}
}
if (__tmp_value >= 0) {
proxy_debug(PROXY_DEBUG_MYSQL_COM, 7, "Processing SET sql_auto_is_null value %s\n", value1.c_str());
uint32_t sql_auto_is_null_int=SpookyHash::Hash32(value1.c_str(),value1.length(),10);
if (mysql_variables->client_get_hash(SQL_SQL_AUTO_IS_NULL) != sql_auto_is_null_int) {
mysql_variables->client_set_value(SQL_SQL_AUTO_IS_NULL, value1.c_str());
proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection sql_auto_is_null to %s\n", value1.c_str());
proxy_debug(PROXY_DEBUG_MYSQL_COM, 7, "Processing SET %s value %s\n", var.c_str(), value1.c_str());
uint32_t var_value_int=SpookyHash::Hash32(value1.c_str(),value1.length(),10);
int idx = SQL_NAME_LAST;
for (int i = 0 ; i < SQL_NAME_LAST ; i++) {
if (!strcmp(var.c_str(), mysql_tracked_variables[i].set_variable_name)) {
idx = mysql_tracked_variables[i].idx;
break;
}
}
exit_after_SetParse = true;
} else {
unable_to_parse_set_statement(lock_hostgroup);
return false;
}
} else if (var == "sql_safe_updates") {
std::string value1 = *values;
proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Processing SET sql_safe_updates value %s\n", value1.c_str());
int __tmp_value = -1;
if (
(strcasecmp(value1.c_str(),(char *)"0")==0) ||
(strcasecmp(value1.c_str(),(char *)"false")==0) ||
(strcasecmp(value1.c_str(),(char *)"off")==0)
) {
__tmp_value = 0;
} else {
if (
(strcasecmp(value1.c_str(),(char *)"1")==0) ||
(strcasecmp(value1.c_str(),(char *)"true")==0) ||
(strcasecmp(value1.c_str(),(char *)"on")==0)
) {
__tmp_value = 1;
if (idx == SQL_NAME_LAST) {
proxy_error("Variable %s not found in mysql_tracked_variables[]\n", var.c_str());
unable_to_parse_set_statement(lock_hostgroup);
return false;
}
}
if (__tmp_value >= 0) {
proxy_debug(PROXY_DEBUG_MYSQL_COM, 7, "Processing SET sql_safe_updates value %s\n", value1.c_str());
uint32_t sql_safe_updates_int=SpookyHash::Hash32(value1.c_str(),value1.length(),10);
if (mysql_variables->client_get_hash(SQL_SAFE_UPDATES) != sql_safe_updates_int) {
mysql_variables->client_set_value(SQL_SAFE_UPDATES, value1.c_str());
proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection sql_safe_updates to %s\n", value1.c_str());
if (mysql_variables->client_get_hash(idx) != var_value_int) {
mysql_variables->client_set_value(idx, value1.c_str());
proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection %s to %s\n", var.c_str(), value1.c_str());
}
exit_after_SetParse = true;
} else {
@ -5456,7 +5222,7 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C
unable_to_parse_set_statement(lock_hostgroup);
return false;
}
} else if (var == "max_join_size") {
} else if ( (var == "sql_select_limit") || (var == "net_write_timeout") || (var == "max_join_size") ) {
std::string value1 = *values;
int vl = strlen(value1.c_str());
const char *v = value1.c_str();
@ -5466,76 +5232,38 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C
only_digit_chars=false;
}
}
if (only_digit_chars) {
proxy_debug(PROXY_DEBUG_MYSQL_COM, 7, "Processing SET max_join_size value %s\n", value1.c_str());
uint32_t max_join_size_int=SpookyHash::Hash32(value1.c_str(),value1.length(),10);
if (client_myds->myconn->options.max_join_size_int != max_join_size_int) {
client_myds->myconn->options.max_join_size_int = max_join_size_int;
if (client_myds->myconn->options.max_join_size) {
free(client_myds->myconn->options.max_join_size);
if (!only_digit_chars) {
if (var == "sql_select_limit") { // only sql_select_limit allows value "default"
if (strcasecmp(v,"default")==0) {
only_digit_chars = true;
}
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 {
unable_to_parse_set_statement(lock_hostgroup);
return false;
}
} else if (var == "net_write_timeout") {
std::string value1 = *values;
int vl = strlen(value1.c_str());
const char *v = value1.c_str();
bool only_digit_chars = true;
for (int i=0; i<vl && only_digit_chars==true; i++) {
if (is_digit(v[i])==0) {
only_digit_chars=false;
}
}
if (only_digit_chars) {
proxy_debug(PROXY_DEBUG_MYSQL_COM, 7, "Processing SET net_write_timeout value %s\n", value1.c_str());
uint32_t net_write_timeout_int=SpookyHash::Hash32(value1.c_str(),value1.length(),10);
if (client_myds->myconn->options.net_write_timeout_int != net_write_timeout_int) {
client_myds->myconn->options.net_write_timeout_int = net_write_timeout_int;
if (client_myds->myconn->options.net_write_timeout) {
free(client_myds->myconn->options.net_write_timeout);
proxy_debug(PROXY_DEBUG_MYSQL_COM, 7, "Processing SET %s value %s\n", var.c_str(), value1.c_str());
uint32_t var_value_int=SpookyHash::Hash32(value1.c_str(),value1.length(),10);
int idx = SQL_NAME_LAST;
for (int i = 0 ; i < SQL_NAME_LAST ; i++) {
if (!strcmp(var.c_str(), mysql_tracked_variables[i].set_variable_name)) {
idx = mysql_tracked_variables[i].idx;
break;
}
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 {
unable_to_parse_set_statement(lock_hostgroup);
return false;
}
} else if (var == "sql_select_limit") {
std::string value1 = *values;
int vl = strlen(value1.c_str());
const char *v = value1.c_str();
bool only_digit_chars = true;
for (int i=0; i<vl && only_digit_chars==true; i++) {
if (is_digit(v[i])==0) {
only_digit_chars=false;
}
}
if (!only_digit_chars) {
if (strcasecmp(v,"default")==0) {
only_digit_chars = true;
if (idx == SQL_NAME_LAST) {
proxy_error("Variable %s not found in mysql_tracked_variables[]\n", var.c_str());
unable_to_parse_set_statement(lock_hostgroup);
return false;
}
}
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);
if (mysql_variables->client_get_hash(SQL_SELECT_LIMIT) != sql_select_limit_int) {
mysql_variables->client_set_value(SQL_SELECT_LIMIT, value1.c_str());
proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection sql_select_limit to %s\n", value1.c_str());
if (mysql_variables->client_get_hash(idx) != var_value_int) {
mysql_variables->client_set_value(idx, value1.c_str());
proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection %s to %s\n", var.c_str(), value1.c_str());
}
exit_after_SetParse = true;
} else {
unable_to_parse_set_statement(lock_hostgroup);
return false;
}
} else if (var == "collation_connection") {
} else if ( (var == "character_set_results") || ( var == "collation_connection" ) ) {
std::string value1 = *values;
int vl = strlen(value1.c_str());
const char *v = value1.c_str();
@ -5546,37 +5274,23 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C
}
}
if (only_normal_chars) {
proxy_debug(PROXY_DEBUG_MYSQL_COM, 7, "Processing SET collation_connection value %s\n", value1.c_str());
uint32_t collation_connection_int=SpookyHash::Hash32(value1.c_str(),value1.length(),10);
if (client_myds->myconn->options.collation_connection_int != collation_connection_int) {
client_myds->myconn->options.collation_connection_int = collation_connection_int;
if (client_myds->myconn->options.collation_connection) {
free(client_myds->myconn->options.collation_connection);
proxy_debug(PROXY_DEBUG_MYSQL_COM, 7, "Processing SET %s value %s\n", var.c_str(), value1.c_str());
uint32_t var_value_int=SpookyHash::Hash32(value1.c_str(),value1.length(),10);
int idx = SQL_NAME_LAST;
for (int i = 0 ; i < SQL_NAME_LAST ; i++) {
if (!strcmp(var.c_str(), mysql_tracked_variables[i].set_variable_name)) {
idx = mysql_tracked_variables[i].idx;
break;
}
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 {
unable_to_parse_set_statement(lock_hostgroup);
return false;
}
} else if (var == "character_set_results") {
std::string value1 = *values;
int vl = strlen(value1.c_str());
const char *v = value1.c_str();
bool only_normal_chars = true;
for (int i=0; i<vl && only_normal_chars==true; i++) {
if (is_normal_char(v[i])==0) {
only_normal_chars=false;
if (idx == SQL_NAME_LAST) {
proxy_error("Variable %s not found in mysql_tracked_variables[]\n", var.c_str());
unable_to_parse_set_statement(lock_hostgroup);
return false;
}
}
if (only_normal_chars) {
proxy_debug(PROXY_DEBUG_MYSQL_COM, 7, "Processing SET character_set_results value %s\n", value1.c_str());
uint32_t character_set_results_int=SpookyHash::Hash32(value1.c_str(),value1.length(),10);
if (mysql_variables->client_get_hash(SQL_CHARACTER_SET_RESULTS) != character_set_results_int) {
mysql_variables->client_set_value(SQL_CHARACTER_SET_RESULTS, value1.c_str());
proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection character_set_results to %s\n", value1.c_str());
if (mysql_variables->client_get_hash(idx) != var_value_int) {
mysql_variables->client_set_value(idx, value1.c_str());
proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Changing connection %s to %s\n", var.c_str(), value1.c_str());
}
exit_after_SetParse = true;
} else {

@ -35,6 +35,8 @@ extern MySQL_Threads_Handler *GloMTH;
extern MySQL_Monitor *GloMyMon;
extern MySQL_Logger *GloMyLogger;
extern mysql_variable_st mysql_tracked_variables[];
const MARIADB_CHARSET_INFO * proxysql_find_charset_nr(unsigned int nr) {
const MARIADB_CHARSET_INFO * c = mariadb_compiled_charsets;
do {
@ -467,19 +469,7 @@ static char * mysql_thread_variables_names[]= {
(char *)"init_connect",
(char *)"ldap_user_variable",
(char *)"add_ldap_user_comment",
(char *)"default_sql_mode",
(char *)"default_time_zone",
(char *)"default_isolation_level",
(char *)"default_transaction_read",
(char *)"default_tx_isolation",
(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 *)"aurora_max_lag_ms_only_read_from_replicas",
@ -583,19 +573,10 @@ MySQL_Threads_Handler::MySQL_Threads_Handler() {
variables.init_connect=NULL;
variables.ldap_user_variable=NULL;
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);
for (int i=0; i<SQL_NAME_LAST; i++) {
variables.default_variables[i]=strdup(mysql_tracked_variables[i].default_value);
}
variables.default_tx_isolation=strdup((char *)MYSQL_DEFAULT_TX_ISOLATION);
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");
@ -798,23 +779,15 @@ char * MySQL_Threads_Handler::get_variable_string(char *name) {
}
}
if (!strncmp(name,"default_",8)) {
if (!strcmp(name,"default_sql_mode")) {
if (variables.default_sql_mode==NULL) {
variables.default_sql_mode=strdup((char *)MYSQL_DEFAULT_SQL_MODE);
}
return strdup(variables.default_sql_mode);
}
if (!strcmp(name,"default_time_zone")) {
if (variables.default_time_zone==NULL) {
variables.default_time_zone=strdup((char *)MYSQL_DEFAULT_TIME_ZONE);
}
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);
for (int i=0; i<SQL_NAME_LAST; i++) {
char buf[128];
sprintf(buf, "default_%s", mysql_tracked_variables[i].internal_variable_name);
if (!strcmp(name,buf)) {
if (variables.default_variables[i]==NULL) {
variables.default_variables[i]=strdup(mysql_tracked_variables[i].default_value);
}
return strdup(variables.default_variables[i]);
}
return strdup(variables.default_isolation_level);
}
if (!strcmp(name,"default_tx_isolation")) {
if (variables.default_tx_isolation==NULL) {
@ -822,60 +795,6 @@ char * MySQL_Threads_Handler::get_variable_string(char *name) {
}
return strdup(variables.default_tx_isolation);
}
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,"default_schema")) return strdup(variables.default_schema);
}
if (!strcmp(name,"server_version")) return strdup(variables.server_version);
@ -1144,83 +1063,16 @@ char * MySQL_Threads_Handler::get_variable(char *name) { // this is the public f
return strdup(variables.add_ldap_user_comment);
}
}
if (!strcasecmp(name,"default_sql_mode")) {
if (variables.default_sql_mode==NULL) {
variables.default_sql_mode=strdup((char *)MYSQL_DEFAULT_SQL_MODE);
}
return strdup(variables.default_sql_mode);
}
if (!strcasecmp(name,"default_time_zone")) {
if (variables.default_time_zone==NULL) {
variables.default_time_zone=strdup((char *)MYSQL_DEFAULT_TIME_ZONE);
}
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_tx_isolation")) {
if (variables.default_tx_isolation==NULL) {
variables.default_tx_isolation=strdup((char *)MYSQL_DEFAULT_TX_ISOLATION);
}
return strdup(variables.default_tx_isolation);
}
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);
for (int i=0; i<SQL_NAME_LAST; i++) {
if (variables.default_variables[i]==NULL) {
variables.default_variables[i]=strdup(mysql_tracked_variables[i].default_value);
}
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,"firewall_whitelist_errormsg")) return strdup(variables.firewall_whitelist_errormsg);
if (!strcasecmp(name,"server_version")) return strdup(variables.server_version);
@ -2545,45 +2397,6 @@ bool MySQL_Threads_Handler::set_variable(char *name, char *value) { // this is t
return true;
}
if (!strcasecmp(name,"default_sql_mode")) {
if (variables.default_sql_mode) free(variables.default_sql_mode);
variables.default_sql_mode=NULL;
if (vallen) {
if (strcmp(value,"(null)"))
variables.default_sql_mode=strdup(value);
}
if (variables.default_sql_mode==NULL) {
variables.default_sql_mode=strdup((char *)MYSQL_DEFAULT_SQL_MODE); // default
}
return true;
}
if (!strcasecmp(name,"default_time_zone")) {
if (variables.default_time_zone) free(variables.default_time_zone);
variables.default_time_zone=NULL;
if (vallen) {
if (strcmp(value,"(null)"))
variables.default_time_zone=strdup(value);
}
if (variables.default_time_zone==NULL) {
variables.default_time_zone=strdup((char *)MYSQL_DEFAULT_TIME_ZONE); // default
}
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_tx_isolation")) {
if (variables.default_tx_isolation) free(variables.default_tx_isolation);
variables.default_tx_isolation=NULL;
@ -2597,122 +2410,23 @@ 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;
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
for (int i=0; i<SQL_NAME_LAST; i++) {
char buf[128];
sprintf(buf, "default_%s", mysql_tracked_variables[i].internal_variable_name);
if (!strcasecmp(name,buf)) {
if (variables.default_variables[i]) free(variables.default_variables[i]);
variables.default_variables[i] = NULL;
if (vallen) {
if (strcmp(value,"(null)"))
variables.default_variables[i] = strdup(value);
}
if (variables.default_variables[i] == NULL)
variables.default_variables[i] = strdup(mysql_tracked_variables[i].default_value);
return true;
}
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) {
@ -3227,18 +2941,38 @@ bool MySQL_Threads_Handler::set_variable(char *name, char *value) { // this is t
return false;
}
// return variables from both mysql_thread_variables_names AND mysql_tracked_variables
char ** MySQL_Threads_Handler::get_variables_list() {
size_t l=sizeof(mysql_thread_variables_names)/sizeof(char *);
unsigned int i;
char **ret=(char **)malloc(sizeof(char *)*l);
for (i=0;i<l;i++) {
ret[i]=(i==l-1 ? NULL : strdup(mysql_thread_variables_names[i]));
char **ret=(char **)malloc(sizeof(char *)*l+SQL_NAME_LAST);
for (i=0; i < SQL_NAME_LAST ; i++) {
char * m = (char *)malloc(strlen(mysql_tracked_variables[i].internal_variable_name)+1+strlen((char *)"default_"));
sprintf(m,"default_%s", mysql_tracked_variables[i].internal_variable_name);
ret[i] == m;
}
for (i=SQL_NAME_LAST;i<l+SQL_NAME_LAST;i++) {
ret[i]=(i == l+SQL_NAME_LAST-1 ? NULL : strdup(mysql_thread_variables_names[i]));
}
return ret;
}
// Returns true if the given name is the name of an existing mysql variable
// scan both mysql_thread_variables_names AND mysql_tracked_variables
bool MySQL_Threads_Handler::has_variable(const char *name) {
if (strlen(name) > 8) {
if (strncmp(name, "default_", 8)) {
for (unsigned int i = 0; i < SQL_NAME_LAST ; i++) {
size_t var_len = strlen(mysql_tracked_variables[i].internal_variable_name);
if (strlen(name) == (var_len+8)) {
if (!strncmp(name+8, (mysql_tracked_variables[i].internal_variable_name), var_len)) {
return true;
}
}
}
}
}
size_t no_vars = sizeof(mysql_thread_variables_names) / sizeof(char *);
for (unsigned int i = 0; i < no_vars-1 ; ++i) {
size_t var_len = strlen(mysql_thread_variables_names[i]);
@ -3366,25 +3100,19 @@ MySQL_Threads_Handler::~MySQL_Threads_Handler() {
if (variables.init_connect) free(variables.init_connect);
if (variables.ldap_user_variable) free(variables.ldap_user_variable);
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_tx_isolation) free(variables.default_tx_isolation);
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);
if (variables.ssl_p2s_cert) free(variables.ssl_p2s_cert);
if (variables.ssl_p2s_key) free(variables.ssl_p2s_key);
if (variables.ssl_p2s_cipher) free(variables.ssl_p2s_cipher);
for (int i=0; i<SQL_NAME_LAST; i++) {
if (variables.default_variables[i]) {
free(variables.default_variables[i]);
variables.default_variables[i]=NULL;
}
}
free(mysql_threads);
mysql_threads=NULL;
#ifdef IDLE_THREADS
@ -3498,19 +3226,15 @@ MySQL_Thread::~MySQL_Thread() {
if (mysql_thread___init_connect) { free(mysql_thread___init_connect); mysql_thread___init_connect=NULL; }
if (mysql_thread___ldap_user_variable) { free(mysql_thread___ldap_user_variable); mysql_thread___ldap_user_variable=NULL; }
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_tx_isolation) { free(mysql_thread___default_tx_isolation); mysql_thread___default_tx_isolation=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; }
for (int i=0; i<SQL_NAME_LAST; i++) {
if (mysql_thread___default_variables[i]) {
free(mysql_thread___default_variables[i]);
mysql_thread___default_variables[i] = 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; }
@ -3568,37 +3292,9 @@ MySQL_Session * MySQL_Thread::create_new_session_and_client_data_stream(int _fd)
sess->client_myds->myprot.init(&sess->client_myds, sess->client_myds->myconn->userinfo, sess);
sess->mysql_variables->client_set_value(SQL_SELECT_LIMIT, mysql_thread___default_sql_select_limit);
sess->mysql_variables->client_set_value(SQL_SAFE_UPDATES, mysql_thread___default_sql_safe_updates);
sess->mysql_variables->client_set_value(SQL_SQL_MODE, mysql_thread___default_sql_mode);
sess->mysql_variables->client_set_value(SQL_TIME_ZONE, mysql_thread___default_time_zone);
sess->mysql_variables->client_set_value(SQL_CHARACTER_SET_RESULTS, mysql_thread___default_character_set_results);
sess->mysql_variables->client_set_value(SQL_ISOLATION_LEVEL, mysql_thread___default_isolation_level);
sess->mysql_variables->client_set_value(SQL_TRANSACTION_READ, mysql_thread___default_transaction_read);
sess->mysql_variables->client_set_value(SQL_SESSION_TRACK_GTIDS, mysql_thread___default_session_track_gtids);
sess->mysql_variables->client_set_value(SQL_SQL_AUTO_IS_NULL, mysql_thread___default_sql_auto_is_null);
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);
for (int i=0; i<SQL_NAME_LAST; i++) {
sess->mysql_variables->client_set_value(i, mysql_thread___default_variables[i]);
}
sess->client_myds->myconn->options.max_join_size=strdup(mysql_thread___default_max_join_size);
return sess;
}
@ -4693,32 +4389,18 @@ void MySQL_Thread::refresh_variables() {
mysql_thread___ldap_user_variable=GloMTH->get_variable_string((char *)"ldap_user_variable");
if (mysql_thread___add_ldap_user_comment) free(mysql_thread___add_ldap_user_comment);
mysql_thread___add_ldap_user_comment=GloMTH->get_variable_string((char *)"add_ldap_user_comment");
if (mysql_thread___default_sql_mode) free(mysql_thread___default_sql_mode);
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_tx_isolation) free(mysql_thread___default_tx_isolation);
mysql_thread___default_tx_isolation=GloMTH->get_variable_string((char *)"default_tx_isolation");
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");
for (int i=0; i<SQL_NAME_LAST; i++) {
if (mysql_thread___default_variables[i]) {
free(mysql_thread___default_variables[i]);
}
char buf[128];
sprintf(buf,"default_%s",mysql_tracked_variables[i].internal_variable_name);
mysql_thread___default_variables[i] = GloMTH->get_variable_string(buf);
}
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);

@ -5,87 +5,6 @@
#include "MySQL_Data_Stream.h"
#include "SpookyV2.h"
int MySQL_Variables::session_by_var[SQL_NAME_LAST] = {
SETTING_SQL_SAFE_UPDATES,
SETTING_SQL_SELECT_LIMIT,
SETTING_SQL_MODE,
SETTING_TIME_ZONE,
SETTING_CHARACTER_SET_RESULTS,
SETTING_ISOLATION_LEVEL,
SETTING_TRANSACTION_READ,
SETTING_SESSION_TRACK_GTIDS,
SETTING_SQL_AUTO_IS_NULL
/* SETTING_COLLATION_CONNECTION,
SETTING_NET_WRITE_TIMEOUT,
SETTING_MAX_JOIN_SIZE*/
};
bool MySQL_Variables::quotes[SQL_NAME_LAST] = {
true, // SQL_SAFE_UPDATES
true, // SQL_SELECT_LIMIT
false, // SQL_MODE
false, // SQL_TIME_ZONE
true, // CHARACTER_SET_RESULTS
false, // ISOLATION_LEVEL
false, // TRANSACTION_READ
true, // SESSION_TRACK_GTIDS
true // SQL_AUTO_IS_NULL
/* false, // COLLATION_CONNECTION
true, // NET_WRITE_TIMEOUT
true // MAX_JOIN_SIZE*/
};
bool MySQL_Variables::set_transaction[SQL_NAME_LAST] = {
false, // SQL_SAFE_UPDATES
false, // SQL_SELECT_LIMIT
false, // SQL_MODE
false, // SQL_TIME_ZONE
false, // CHARACTER_SET_RESULTS
true, // ISOLATION_LEVEL
true, // TRANSACTION_READ
false, // SESSION_TRACK_GTIDS
false // SQL_AUTO_IS_NULL
/* false, // COLLATION_CONNECTION
false, // NET_WRITE_TIMEOUT
false // MAX_JOIN_SIZE */
};
int MySQL_Variables::var_by_session[NONE] = {
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_SQL_MODE,
SQL_TIME_ZONE,
SQL_ISOLATION_LEVEL,
SQL_TRANSACTION_READ,
SQL_CHARACTER_SET_RESULTS,
SQL_SESSION_TRACK_GTIDS,
SQL_SQL_AUTO_IS_NULL,
SQL_SELECT_LIMIT,
SQL_SAFE_UPDATES,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST,
SQL_NAME_LAST
};
MySQL_Variables::MySQL_Variables(MySQL_Session* _session) {
assert(_session);
session = _session;
@ -198,16 +117,25 @@ bool MySQL_Variables::verify_generic_variable(uint32_t *be_int, char **be_var, c
return false;
}
bool MySQL_Variables::update_variable(int &_rc) {
auto idx = MySQL_Variables::var_by_session[session->status];
bool MySQL_Variables::update_variable(session_status status, int &_rc) {
int idx = SQL_NAME_LAST;
for (int i=0; i<SQL_NAME_LAST; i++) {
if (mysql_tracked_variables[i].status == status) {
idx = i;
break;
}
}
assert(idx != SQL_NAME_LAST);
updaters[idx]->update_server_variable(session, idx, _rc);
}
bool MySQL_Variables::verify_variable(int idx) {
int rc = 0;
auto ret = updaters[idx]->verify_variables(session, idx);
if (ret)
update_variable(rc);
if (ret) {
// FIXME
//update_variable(rc);
}
return ret;
}
@ -215,16 +143,19 @@ bool Generic_Updater::verify_variables(MySQL_Session* session, int idx) {
auto ret = session->mysql_variables->verify_generic_variable(
&session->mybe->server_myds->myconn->variables[idx].hash,
&session->mybe->server_myds->myconn->variables[idx].value,
mysql_thread___default_sql_safe_updates,
mysql_thread___default_variables[idx],
&session->client_myds->myconn->variables[idx].hash,
session->client_myds->myconn->variables[idx].value,
static_cast<session_status>(MySQL_Variables::session_by_var[idx])
mysql_tracked_variables[idx].status
);
return ret;
}
bool Generic_Updater::update_server_variable(MySQL_Session* session, int idx, int &_rc) {
bool q = MySQL_Variables::quotes[idx];
bool st = MySQL_Variables::set_transaction[idx];
auto ret = session->handler_again___status_SETTING_GENERIC_VARIABLE(&_rc, Variable::set_name[idx], session->mysql_variables->server_get_value(idx), q, st);
bool no_quote = true;
if (mysql_tracked_variables[idx].quote) no_quote = false;
bool st = mysql_tracked_variables[idx].set_transaction;
const char * set_var_name = mysql_tracked_variables[idx].set_variable_name;
auto ret = session->handler_again___status_SETTING_GENERIC_VARIABLE(&_rc, set_var_name, session->mysql_variables->server_get_value(idx), no_quote, st);
return ret;
}

@ -9,17 +9,12 @@
extern const MARIADB_CHARSET_INFO * proxysql_find_charset_nr(unsigned int nr);
const char Variable::set_name[SQL_NAME_LAST][64] = {"sql_safe_updates", "sql_select_limit", "sql_mode", "time_zone", "character_set_results", "session transaction isolation level",
"session transaction read", "session_track_gtids", "sql_auto_is_null"};
const char Variable::proxysql_internal_session_name[SQL_NAME_LAST][64] = {"sql_safe_updates", "sql_select_limit", "sql_mode", "time_zone", "character_set_results", "isolation_level",
"transaction_read", "session_track_gtids", "sql_auto_is_null"};
void Variable::fill_server_internal_session(json &j, int conn_num, int idx) {
j["backends"][conn_num]["conn"][Variable::proxysql_internal_session_name[idx]] = std::string(value);
j["backends"][conn_num]["conn"][mysql_tracked_variables[idx].internal_variable_name] = std::string(value);
}
void Variable::fill_client_internal_session(json &j, int idx) {
j["conn"][Variable::proxysql_internal_session_name[idx]] = value;
j["conn"][mysql_tracked_variables[idx].internal_variable_name] = value;
}
#define PROXYSQL_USE_RESULT
@ -229,19 +224,19 @@ MySQL_Connection::MySQL_Connection() {
options.no_backslash_escapes=false;
options.init_connect=NULL;
options.init_connect_sent=false;
options.collation_connection = NULL;
options.net_write_timeout = NULL;
options.max_join_size = NULL;
options.collation_connection_sent = false;
options.net_write_timeout_sent = false;
options.max_join_size_sent = false;
// options.collation_connection = NULL;
// options.net_write_timeout = NULL;
// options.max_join_size = NULL;
// options.collation_connection_sent = false;
// options.net_write_timeout_sent = false;
// options.max_join_size_sent = false;
options.ldap_user_variable=NULL;
options.ldap_user_variable_value=NULL;
options.ldap_user_variable_sent=false;
options.sql_log_bin=1; // default #818
options.collation_connection_int=0;
options.net_write_timeout_int=0;
options.max_join_size_int=0;
// options.collation_connection_int=0;
// options.net_write_timeout_int=0;
// options.max_join_size_int=0;
options.charset=0;
options.charset_action=UNKNOWN;
compression_pkt_id=0;
@ -320,6 +315,7 @@ MySQL_Connection::~MySQL_Connection() {
}
}
/*
if (options.collation_connection) {
free(options.collation_connection);
options.collation_connection=NULL;
@ -332,6 +328,7 @@ MySQL_Connection::~MySQL_Connection() {
free(options.max_join_size);
options.max_join_size=NULL;
}
*/
};
bool MySQL_Connection::set_autocommit(bool _ac) {
@ -2158,24 +2155,6 @@ void MySQL_Connection::reset() {
}
}
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;

Loading…
Cancel
Save