From b3beb35ae1ee37ff0ce2068fded112cfc638b147 Mon Sep 17 00:00:00 2001 From: Valentin Rakush Date: Thu, 7 May 2020 06:44:06 +0000 Subject: [PATCH] generate regexp for mysql variables --- include/MySQL_Variables.h | 3 +++ lib/MySQL_Thread.cpp | 6 +++++- lib/MySQL_Variables.cpp | 42 +++++++++++++++------------------------ 3 files changed, 24 insertions(+), 27 deletions(-) diff --git a/include/MySQL_Variables.h b/include/MySQL_Variables.h index 674ee4220..79b98b827 100644 --- a/include/MySQL_Variables.h +++ b/include/MySQL_Variables.h @@ -28,6 +28,9 @@ class MySQL_Variables { static verify_var verifiers[SQL_NAME_LAST]; static update_var updaters[SQL_NAME_LAST]; +public: + std::string variables_regexp; + public: MySQL_Variables(); diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index 4bc3e7fbd..133b71f17 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -3373,7 +3373,11 @@ bool MySQL_Thread::init() { match_regexes=(Session_Regex **)malloc(sizeof(Session_Regex *)*4); 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|TIME_ZONE|CHARACTER_SET_RESULTS|CHARACTER_SET_CLIENT|CHARACTER_SET_DATABASE|SESSION_TRACK_GTIDS|SQL_AUTO_IS_NULL|SQL_SELECT_LIMIT|SQL_SAFE_UPDATES|COLLATION_CONNECTION|CHARACTER_SET_CONNECTION|NET_WRITE_TIMEOUT|WSREP_SYNC_WAIT|TX_ISOLATION|GROUP_CONCAT_MAX_LEN|MAX_JOIN_SIZE( *)(:|)=( *))"); + + std::stringstream ss; + ss << "^SET (|SESSION |@@|@@session.)(" << mysql_variables.variables_regexp << "SESSION_TRACK_GTIDS|TX_ISOLATION( *)(:|)=( *))"; + match_regexes[1]=new Session_Regex((char *)ss.str().c_str()); + match_regexes[2]=new Session_Regex((char *)"^SET(?: +)(|SESSION +)TRANSACTION(?: +)(?:(?:(ISOLATION(?: +)LEVEL)(?: +)(REPEATABLE(?: +)READ|READ(?: +)COMMITTED|READ(?: +)UNCOMMITTED|SERIALIZABLE))|(?:(READ)(?: +)(WRITE|ONLY)))"); match_regexes[3]=new Session_Regex((char *)"^(set)(?: +)((charset)|(character +set))(?: )"); diff --git a/lib/MySQL_Variables.cpp b/lib/MySQL_Variables.cpp index 54f5ca7e0..5a90fcd92 100644 --- a/lib/MySQL_Variables.cpp +++ b/lib/MySQL_Variables.cpp @@ -20,33 +20,22 @@ update_var MySQL_Variables::updaters[SQL_NAME_LAST]; MySQL_Variables::MySQL_Variables() { + variables_regexp = ""; for (auto i = 0; i < SQL_NAME_LAST; i++) { - switch(i) { - case SQL_SAFE_UPDATES: - case SQL_SELECT_LIMIT: - case SQL_SQL_MODE: - case SQL_TIME_ZONE: - case SQL_CHARACTER_SET_RESULTS: - case SQL_CHARACTER_SET_CONNECTION: - case SQL_CHARACTER_SET_CLIENT: - case SQL_CHARACTER_SET_DATABASE: - case SQL_ISOLATION_LEVEL: - case SQL_TRANSACTION_READ: - case SQL_SQL_AUTO_IS_NULL: - case SQL_COLLATION_CONNECTION: - case SQL_NET_WRITE_TIMEOUT: - case SQL_MAX_JOIN_SIZE: - case SQL_WSREP_SYNC_WAIT: - case SQL_GROUP_CONCAT_MAX_LEN: - MySQL_Variables::verifiers[i] = verify_server_variable; - MySQL_Variables::updaters[i] = update_server_variable; - break; - case SQL_LOG_BIN: - MySQL_Variables::verifiers[i] = verify_server_variable; - MySQL_Variables::updaters[i] = logbin_update_server_variable; - break; - default: - MySQL_Variables::updaters[i] = NULL; + if (i == SQL_CHARACTER_SET || i == SQL_CHARACTER_ACTION || i == SQL_SET_NAMES) { + MySQL_Variables::updaters[i] = NULL; + MySQL_Variables::verifiers[i] = NULL; + } + else if (i == SQL_LOG_BIN) { + MySQL_Variables::verifiers[i] = verify_server_variable; + MySQL_Variables::updaters[i] = logbin_update_server_variable; + } else { + MySQL_Variables::verifiers[i] = verify_server_variable; + MySQL_Variables::updaters[i] = update_server_variable; + } + if (mysql_tracked_variables[i].status == SETTING_VARIABLE) { + variables_regexp += mysql_tracked_variables[i].set_variable_name; + variables_regexp += "|"; } } } @@ -535,3 +524,4 @@ bool MySQL_Variables::parse_variable_number(MySQL_Session *sess, int idx, string } return true; } +