From d84444724a2e24db73f44bc246cfb2dea1221985 Mon Sep 17 00:00:00 2001 From: Rahim Kanji Date: Mon, 10 Nov 2025 18:43:16 +0500 Subject: [PATCH] Replaced use of the generic write_generic() helper with direct packet construction for selected PostgreSQL protocol messages to reduce overhead and improve performance. --- include/PgSQL_Session.h | 16 --------- lib/PgSQL_Protocol.cpp | 55 +++++++++++++------------------ lib/PgSQL_Session.cpp | 42 ----------------------- lib/PgSQL_Variables_Validator.cpp | 2 +- 4 files changed, 24 insertions(+), 91 deletions(-) diff --git a/include/PgSQL_Session.h b/include/PgSQL_Session.h index a9b42021a..8c391455a 100644 --- a/include/PgSQL_Session.h +++ b/include/PgSQL_Session.h @@ -118,22 +118,6 @@ public: static std::string datestyle_to_string(std::string_view input, const PgSQL_DateStyle_t& default_datestyle); }; -//std::string proxysql_session_type_str(enum proxysql_session_type session_type); - -// these structs will be used for various regex hardcoded -// their initial use will be for sql_log_bin , sql_mode and time_zone -// issues #509 , #815 and #816 -class PgSQL_Session_Regex { -private: - void* opt; - void* re; - char* s; -public: - PgSQL_Session_Regex(char* p); - ~PgSQL_Session_Regex(); - bool match(char* m); -}; - class PgSQL_STMT_Global_info; using Parse_Param_Types = std::vector; // Vector of parameter types for prepared statements diff --git a/lib/PgSQL_Protocol.cpp b/lib/PgSQL_Protocol.cpp index 0355fed84..0aed8033d 100644 --- a/lib/PgSQL_Protocol.cpp +++ b/lib/PgSQL_Protocol.cpp @@ -1612,8 +1612,10 @@ bool PgSQL_Protocol::generate_ready_for_query_packet(bool send, char trx_state, // to avoid memory leak assert(send == true || _ptr); - PG_pkt pgpkt{}; - pgpkt.write_ReadyForQuery(trx_state); + PG_pkt pgpkt(8); + pgpkt.put_char('Z'); + pgpkt.put_uint32(5); + pgpkt.put_char(trx_state); // transaction state auto buff = pgpkt.detach(); if (send == true) { (*myds)->PSarrayOUT->add((void*)buff.first, buff.second); @@ -1696,15 +1698,13 @@ bool PgSQL_Protocol::generate_describe_completion_packet(bool send, bool ready, bool PgSQL_Protocol::generate_close_completion_packet(bool send, bool ready, char trx_state, PtrSize_t* _ptr) { // to avoid memory leak assert(send == true || _ptr); - PG_pkt pgpkt{}; + PG_pkt pgpkt(16); + pgpkt.put_char('3'); + pgpkt.put_uint32(4); if (ready == true) { - pgpkt.set_multi_pkt_mode(true); - } - // Close completion message - pgpkt.write_CloseCompletion(); - if (ready == true) { - pgpkt.write_ReadyForQuery(trx_state); - pgpkt.set_multi_pkt_mode(false); + pgpkt.put_char('Z'); + pgpkt.put_uint32(5); // size of the ReadyForQuery packet + pgpkt.put_char(trx_state); // transaction state } auto buff = pgpkt.detach(); if (send == true) { @@ -1720,15 +1720,13 @@ bool PgSQL_Protocol::generate_close_completion_packet(bool send, bool ready, cha bool PgSQL_Protocol::generate_bind_completion_packet(bool send, bool ready, char trx_state, PtrSize_t* _ptr) { // to avoid memory leak assert(send == true || _ptr); - PG_pkt pgpkt{}; + PG_pkt pgpkt(16); + pgpkt.put_char('2'); + pgpkt.put_uint32(4); if (ready == true) { - pgpkt.set_multi_pkt_mode(true); - } - // Bind completion message - pgpkt.write_BindCompletion(); - if (ready == true) { - pgpkt.write_ReadyForQuery(trx_state); - pgpkt.set_multi_pkt_mode(false); + pgpkt.put_char('Z'); + pgpkt.put_uint32(5); // size of the ReadyForQuery packet + pgpkt.put_char(trx_state); // transaction state } auto buff = pgpkt.detach(); if (send == true) { @@ -1743,7 +1741,7 @@ bool PgSQL_Protocol::generate_bind_completion_packet(bool send, bool ready, char bool PgSQL_Protocol::generate_no_data_packet(bool send, PtrSize_t* _ptr) { // to avoid memory leak assert(send == true || _ptr); - PG_pkt pgpkt(5); + PG_pkt pgpkt(8); pgpkt.put_char('n'); pgpkt.put_uint32(4); // size of the NoData packet (Fixed 4 bytes) auto buff = pgpkt.detach(); @@ -1759,21 +1757,14 @@ bool PgSQL_Protocol::generate_no_data_packet(bool send, PtrSize_t* _ptr) { bool PgSQL_Protocol::generate_parse_completion_packet(bool send, bool ready, char trx_state, PtrSize_t* _ptr) { // to avoid memory leak assert(send == true || _ptr); - - PG_pkt pgpkt{}; - - if (ready == true) { - pgpkt.set_multi_pkt_mode(true); - } - - // Parse completion message - pgpkt.write_ParseCompletion(); - + PG_pkt pgpkt(16); + pgpkt.put_char('1'); + pgpkt.put_uint32(4); if (ready == true) { - pgpkt.write_ReadyForQuery(trx_state); - pgpkt.set_multi_pkt_mode(false); + pgpkt.put_char('Z'); + pgpkt.put_uint32(5); // size of the ReadyForQuery packet + pgpkt.put_char(trx_state); // transaction state } - auto buff = pgpkt.detach(); if (send == true) { (*myds)->PSarrayOUT->add((void*)buff.first, buff.second); diff --git a/lib/PgSQL_Session.cpp b/lib/PgSQL_Session.cpp index 87400028b..46992a941 100644 --- a/lib/PgSQL_Session.cpp +++ b/lib/PgSQL_Session.cpp @@ -98,48 +98,6 @@ extern ClickHouse_Authentication* GloClickHouseAuth; extern ClickHouse_Server* GloClickHouseServer; #endif /* PROXYSQLCLICKHOUSE */ -/* -std::string proxysql_session_type_str(enum proxysql_session_type session_type) { - if (session_type == PROXYSQL_SESSION_MYSQL) { - return "PROXYSQL_SESSION_MYSQL";d: - - } else if (session_type == PROXYSQL_SESSION_ADMIN) { - return "PROXYSQL_SESSION_ADMIN"; - } else if (session_type == PROXYSQL_SESSION_STATS) { - return "PROXYSQL_SESSION_STATS"; - } else if (session_type == PROXYSQL_SESSION_SQLITE) { - return "PROXYSQL_SESSION_SQLITE"; - } else if (session_type == PROXYSQL_SESSION_CLICKHOUSE) { - return "PROXYSQL_SESSION_CLICKHOUSE"; - } else if (session_type == PROXYSQL_SESSION_MYSQL_EMU) { - return "PROXYSQL_SESSION_MYSQL_EMU"; - } else { - return "PROXYSQL_SESSION_NONE"; - } -};*/ - -/* -Session_Regex::Session_Regex(char *p) { - s=strdup(p); - re2::RE2::Options *opt2=new re2::RE2::Options(RE2::Quiet); - opt2->set_case_sensitive(false); - opt=(void *)opt2; - re=(RE2 *)new RE2(s, *opt2); -} - -PgSQL_Session_Regex::~PgSQL_Session_Regex() { - free(s); - delete (RE2 *)re; - delete (re2::RE2::Options *)opt; -} - -bool PgSQL_Session_Regex::match(char *m) { - bool rc=false; - rc=RE2::PartialMatch(m,*(RE2 *)re); - return rc; -} -*/ - extern PgSQL_Query_Processor* GloPgQPro; extern PgSQL_Query_Cache *GloPgQC; extern ProxySQL_Admin* GloAdmin; diff --git a/lib/PgSQL_Variables_Validator.cpp b/lib/PgSQL_Variables_Validator.cpp index ed63cda10..7afe1b94d 100644 --- a/lib/PgSQL_Variables_Validator.cpp +++ b/lib/PgSQL_Variables_Validator.cpp @@ -638,4 +638,4 @@ const pgsql_variable_validator pgsql_variable_validator_search_path = { .type = VARIABLE_TYPE_STRING, .validate = &pgsql_variable_validate_search_path, .params = {} -}; \ No newline at end of file +};