Replaced use of the generic write_generic() helper with direct packet construction for selected PostgreSQL protocol messages to reduce overhead and improve performance.

v3.0_refactor_prepared_statement_cache_design_5211
Rahim Kanji 3 months ago
parent e744c2bbb7
commit d84444724a

@ -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<uint32_t>; // Vector of parameter types for prepared statements

@ -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);

@ -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;

@ -638,4 +638,4 @@ const pgsql_variable_validator pgsql_variable_validator_search_path = {
.type = VARIABLE_TYPE_STRING,
.validate = &pgsql_variable_validate_search_path,
.params = {}
};
};

Loading…
Cancel
Save