@@ -1953,6 +1953,21 @@ bool MySQL_Session::handler_again___verify_backend_session_track_gtids() {
19531953 return ret;
19541954}
19551955
1956+ bool MySQL_Session::handler_again___verify_backend_session_track_variables () {
1957+ if (mybe->server_myds ->myconn ->options .session_track_variables_sent == false ) {
1958+ mybe->server_myds ->myconn ->options .session_track_variables_sent = true ;
1959+ set_previous_status_mode3 ();
1960+ NEXT_IMMEDIATE_NEW (SETTING_SESSION_TRACK_VARIABLES);
1961+ }
1962+
1963+ if (mybe->server_myds ->myconn ->options .session_track_state_sent == false ) {
1964+ mybe->server_myds ->myconn ->options .session_track_state_sent = true ;
1965+ set_previous_status_mode3 ();
1966+ NEXT_IMMEDIATE_NEW (SETTING_SESSION_TRACK_STATE);
1967+ }
1968+
1969+ return false ;
1970+ }
19561971
19571972bool MySQL_Session::handler_again___verify_multiple_variables (MySQL_Connection* myconn) {
19581973 for (auto i = 0 ; i < SQL_NAME_LAST_LOW_WM; i++) {
@@ -2753,6 +2768,20 @@ bool MySQL_Session::handler_again___status_SETTING_SESSION_TRACK_GTIDS(int *_rc)
27532768 return ret;
27542769}
27552770
2771+ bool MySQL_Session::handler_again___status_SETTING_SESSION_TRACK_VARIABLES (int *_rc) {
2772+ bool ret=false ;
2773+ assert (mybe->server_myds ->myconn );
2774+ ret = handler_again___status_SETTING_GENERIC_VARIABLE (_rc, (char *)" session_track_system_variables" , " *" , false );
2775+ return ret;
2776+ }
2777+
2778+ bool MySQL_Session::handler_again___status_SETTING_SESSION_TRACK_STATE (int *_rc) {
2779+ bool ret=false ;
2780+ assert (mybe->server_myds ->myconn );
2781+ ret = handler_again___status_SETTING_GENERIC_VARIABLE (_rc, (char *)" session_track_state_change" , " ON" , false );
2782+ return ret;
2783+ }
2784+
27562785bool MySQL_Session::handler_again___status_CHANGING_SCHEMA (int *_rc) {
27572786 bool ret=false ;
27582787 // fprintf(stderr,"CHANGING_SCHEMA\n");
@@ -4862,6 +4891,41 @@ void MySQL_Session::handler_rc0_Process_GTID(MySQL_Connection *myconn) {
48624891 }
48634892}
48644893
4894+ void MySQL_Session::handler_rc0_Process_Variables (MySQL_Connection *myconn) {
4895+ std::unordered_map<string, string> var_map;
4896+
4897+ if (myconn->get_variables (var_map)) {
4898+ std::string variable;
4899+ std::string value;
4900+
4901+ for (int idx = 0 ; idx < SQL_NAME_LAST_HIGH_WM ; idx++) {
4902+ variable = mysql_tracked_variables[idx].set_variable_name ;
4903+
4904+ auto itr = var_map.find (variable);
4905+ if (itr != var_map.end ()) {
4906+ value = itr->second ;
4907+ proxy_debug (PROXY_DEBUG_MYSQL_CONNECTION, 7 , " Session=%p, backend=%p. Notification for session_track_system_variables: variable=%s, value=%s\n " , this , this ->mybe , variable.c_str (), value.c_str ());
4908+
4909+ const MARIADB_CHARSET_INFO *ci = NULL ;
4910+ if (variable == " character_set_results" || variable == " character_set_connection" ||
4911+ variable == " character_set_client" || variable == " character_set_database" ) {
4912+ ci = proxysql_find_charset_name (value.c_str ());
4913+ }
4914+ else if (variable == " collation_connection" ) {
4915+ ci = proxysql_find_charset_collate (value.c_str ());
4916+ }
4917+
4918+ if (ci) {
4919+ value = std::to_string (ci->nr );
4920+ }
4921+
4922+ mysql_variables.client_set_value (this , idx, value);
4923+ mysql_variables.server_set_value (this , idx, value.c_str ());
4924+ }
4925+ }
4926+ }
4927+ }
4928+
48654929void MySQL_Session::handler_KillConnectionIfNeeded () {
48664930 if ( // two conditions
48674931 // If the server connection is in a non-idle state (ASYNC_IDLE), and the current time is greater than or equal to mybe->server_myds->wait_until
@@ -5059,6 +5123,10 @@ int MySQL_Session::handler() {
50595123 goto handler_again;
50605124 }
50615125
5126+ if (handler_again___verify_backend_session_track_variables ()) {
5127+ goto handler_again;
5128+ }
5129+
50625130 // Optimize network traffic when we can use 'SET NAMES'
50635131 if (verify_set_names (this )) {
50645132 goto handler_again;
@@ -5139,6 +5207,8 @@ int MySQL_Session::handler() {
51395207
51405208 handler_rc0_Process_GTID (myconn);
51415209
5210+ handler_rc0_Process_Variables (myconn);
5211+
51425212 // if we are locked on hostgroup, the value of autocommit is copied from the backend connection
51435213 // see bug #3549
51445214 if (locked_on_hostgroup >= 0 ) {
@@ -5435,6 +5505,12 @@ bool MySQL_Session::handler_again___multiple_statuses(int *rc) {
54355505 case SETTING_SESSION_TRACK_GTIDS:
54365506 ret = handler_again___status_SETTING_SESSION_TRACK_GTIDS (rc);
54375507 break ;
5508+ case SETTING_SESSION_TRACK_VARIABLES:
5509+ ret = handler_again___status_SETTING_SESSION_TRACK_VARIABLES (rc);
5510+ break ;
5511+ case SETTING_SESSION_TRACK_STATE:
5512+ ret = handler_again___status_SETTING_SESSION_TRACK_STATE (rc);
5513+ break ;
54385514 case SETTING_SET_NAMES:
54395515 ret = handler_again___status_CHANGING_CHARSET (rc);
54405516 break ;
0 commit comments