diff --git a/include/proxysql_structs.h b/include/proxysql_structs.h index 84a950768..4a6f8c810 100644 --- a/include/proxysql_structs.h +++ b/include/proxysql_structs.h @@ -244,7 +244,7 @@ enum mysql_variable_name { }; /* NOTE: - make special ATTENTION that the order in mysql_variable_name + make special ATTENTION that the order in pgsql_variable_name and pgsql_tracked_variables[] is THE SAME */ enum pgsql_variable_name { @@ -337,8 +337,6 @@ struct pgsql_variable_st { enum session_status status; // what status should be changed after setting this variables const char* set_variable_name; // what variable name (or string) will be used when setting it to backend const char* internal_variable_name; // variable name as displayed in admin , WITHOUT "default_" - // Also used in INTERNAL SESSION - // if NULL , MySQL_Variables::MySQL_Variables will set it to set_variable_name during initialization const char* default_value; // default value uint8_t options; // options const pgsql_variable_validator* validator; // validate value @@ -1814,6 +1812,7 @@ pgsql_variable_st pgsql_tracked_variables[]{ { PGSQL_MAINTENANCE_WORK_MEM, SETTING_VARIABLE, "maintenance_work_mem", "maintenance_work_mem", "64MB", (PGTRACKED_VAR_OPT_QUOTE), &pgsql_variable_validator_maintenance_work_mem, nullptr }, { PGSQL_SYNCHRONOUS_COMMIT, SETTING_VARIABLE, "synchronous_commit", "synchronous_commit", "on", (PGTRACKED_VAR_OPT_QUOTE), &pgsql_variable_validator_synchronous_commit, nullptr}, }; + #endif //EXCLUDE_TRACKING_VARAIABLES #else diff --git a/lib/PgSQL_Protocol.cpp b/lib/PgSQL_Protocol.cpp index 13ed7a3e6..3dd2b79cf 100644 --- a/lib/PgSQL_Protocol.cpp +++ b/lib/PgSQL_Protocol.cpp @@ -403,7 +403,7 @@ bool PgSQL_Protocol::generate_pkt_initial_handshake(bool send, void** _ptr, unsi if (RAND_bytes((*myds)->tmp_login_salt, sizeof((*myds)->tmp_login_salt)) != 1) { // Fallback method: using a basic pseudo-random generator srand((unsigned int)time(NULL)); - for (int i = 0; i < sizeof((*myds)->tmp_login_salt); i++) { + for (size_t i = 0; i < sizeof((*myds)->tmp_login_salt); i++) { (*myds)->tmp_login_salt[i] = rand() % 256; } } @@ -632,11 +632,11 @@ unsigned int get_string(const char* data, unsigned int len, const char** dst_p) bool PgSQL_Protocol::load_conn_parameters(pgsql_hdr* pkt) { - int32_t offset = 0; + uint32_t offset = 0; while (offset < pkt->data.size) { char* nameptr = (char*)pkt->data.ptr + offset; - int32_t valoffset; + uint32_t valoffset; char* valptr; if (*nameptr == '\0') diff --git a/lib/PgSQL_Session.cpp b/lib/PgSQL_Session.cpp index 42ef7896a..e3c429972 100644 --- a/lib/PgSQL_Session.cpp +++ b/lib/PgSQL_Session.cpp @@ -4201,7 +4201,7 @@ bool PgSQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C int idx = PGSQL_NAME_LAST_HIGH_WM; for (int i = 0; i < PGSQL_NAME_LAST_HIGH_WM; i++) { if (variable_name_exists(pgsql_tracked_variables[i], var.c_str()) == true) { - idx = pgsql_tracked_variables[i].idx; + idx = i; break; } } @@ -4252,8 +4252,8 @@ bool PgSQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C proxy_debug(PROXY_DEBUG_MYSQL_COM, 8, "Changing connection %s to %s\n", var.c_str(), value1.c_str()); uint32_t var_hash_int = SpookyHash::Hash32(value1.c_str(), value1.length(), 10); - if (pgsql_variables.client_get_hash(this, pgsql_tracked_variables[idx].idx) != var_hash_int) { - if (!pgsql_variables.client_set_value(this, pgsql_tracked_variables[idx].idx, value1.c_str(), true)) { + if (pgsql_variables.client_get_hash(this, idx) != var_hash_int) { + if (!pgsql_variables.client_set_value(this, idx, value1.c_str(), true)) { return false; } if (idx == PGSQL_DATESTYLE) { @@ -4631,8 +4631,8 @@ bool PgSQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C proxy_debug(PROXY_DEBUG_MYSQL_COM, 8, "Changing connection %s to %s\n", name, value); uint32_t var_hash_int = SpookyHash::Hash32(value, strlen(value), 10); - if (pgsql_variables.client_get_hash(this, pgsql_tracked_variables[idx].idx) != var_hash_int) { - if (!pgsql_variables.client_set_value(this, pgsql_tracked_variables[idx].idx, value, false)) { + if (pgsql_variables.client_get_hash(this, idx) != var_hash_int) { + if (!pgsql_variables.client_set_value(this, idx, value, false)) { return false; } if (IS_PGTRACKED_VAR_OPTION_SET_PARAM_STATUS(pgsql_tracked_variables[idx])) { @@ -4647,8 +4647,8 @@ bool PgSQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C const char* value = get_default_session_variable((enum pgsql_variable_name)idx); proxy_debug(PROXY_DEBUG_MYSQL_COM, 8, "Changing connection %s to %s\n", name, value); uint32_t var_hash_int = SpookyHash::Hash32(value, strlen(value), 10); - if (pgsql_variables.client_get_hash(this, pgsql_tracked_variables[idx].idx) != var_hash_int) { - if (!pgsql_variables.client_set_value(this, pgsql_tracked_variables[idx].idx, value, false)) { + if (pgsql_variables.client_get_hash(this, idx) != var_hash_int) { + if (!pgsql_variables.client_set_value(this, idx, value, false)) { return false; } if (IS_PGTRACKED_VAR_OPTION_SET_PARAM_STATUS(pgsql_tracked_variables[idx])) { @@ -4683,8 +4683,8 @@ bool PgSQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C const char* value = get_default_session_variable((enum pgsql_variable_name)idx); uint32_t var_hash_int = SpookyHash::Hash32(value, strlen(value), 10); - if (pgsql_variables.client_get_hash(this, pgsql_tracked_variables[idx].idx) != var_hash_int) { - if (!pgsql_variables.client_set_value(this, pgsql_tracked_variables[idx].idx, value, true)) { + if (pgsql_variables.client_get_hash(this, idx) != var_hash_int) { + if (!pgsql_variables.client_set_value(this, idx, value, true)) { return false; } if (IS_PGTRACKED_VAR_OPTION_SET_PARAM_STATUS(pgsql_tracked_variables[idx])) { diff --git a/lib/PgSQL_Variables.cpp b/lib/PgSQL_Variables.cpp index af1f5ba6a..7285436c6 100644 --- a/lib/PgSQL_Variables.cpp +++ b/lib/PgSQL_Variables.cpp @@ -19,32 +19,32 @@ PgSQL_Variables::PgSQL_Variables() { // NOTE: This variable has been temporarily ignored. Check issues #3442 and #3441. //ignore_vars.push_back("session_track_schema"); variables_regexp = ""; + + /* + NOTE: + make special ATTENTION that the order in pgsql_variable_name + and pgsqll_tracked_variables[] is THE SAME + NOTE: + PgSQL_Variables::PgSQL_Variables() has a built-in check to make sure that the order is correct, + and that variables are in alphabetical order + */ for (auto i = 0; i < PGSQL_NAME_LAST_HIGH_WM; i++) { + //Array index and enum value (idx) should be same + assert(i == pgsql_tracked_variables[i].idx); + + if (i > PGSQL_NAME_LAST_LOW_WM + 1) { + assert(strcmp(pgsql_tracked_variables[i].set_variable_name, pgsql_tracked_variables[i - 1].set_variable_name) > 0); + } + // we initialized all the internal_variable_name if set to NULL if (pgsql_tracked_variables[i].internal_variable_name == NULL) { pgsql_tracked_variables[i].internal_variable_name = pgsql_tracked_variables[i].set_variable_name; } - } -/* - NOTE: - make special ATTENTION that the order in pgsql_variable_name - and pgsqll_tracked_variables[] is THE SAME - NOTE: - PgSQL_Variables::PgSQL_Variables() has a built-in check to make sure that the order is correct, - and that variables are in alphabetical order -*/ - for (int i = PGSQL_NAME_LAST_LOW_WM; i < PGSQL_NAME_LAST_HIGH_WM; i++) { - assert(i == pgsql_tracked_variables[i].idx); - if (i > PGSQL_NAME_LAST_LOW_WM+1) { - assert(strcmp(pgsql_tracked_variables[i].set_variable_name, pgsql_tracked_variables[i-1].set_variable_name) > 0); - } - } - for (auto i = 0; i < PGSQL_NAME_LAST_HIGH_WM; i++) { PgSQL_Variables::verifiers[i] = verify_server_variable; PgSQL_Variables::updaters[i] = update_server_variable; - - if (pgsql_tracked_variables[i].status == SETTING_VARIABLE) { + + if (pgsql_tracked_variables[i].status == SETTING_VARIABLE) { variables_regexp += pgsql_tracked_variables[i].set_variable_name; variables_regexp += "|"; @@ -56,6 +56,7 @@ PgSQL_Variables::PgSQL_Variables() { } } } + for (std::vector::iterator it=ignore_vars.begin(); it != ignore_vars.end(); it++) { variables_regexp += *it; variables_regexp += "|";