Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Support for Notice and Warning Message Processing - v3.0 #4770

Open
wants to merge 8 commits into
base: v3.0
Choose a base branch
from
5 changes: 4 additions & 1 deletion include/PgSQL_Connection.h
Original file line number Diff line number Diff line change
Expand Up @@ -465,7 +465,6 @@ class PgSQL_Connection_Placeholder {
bool AutocommitFalse_AndSavepoint();
bool MultiplexDisabled(bool check_delay_token = true);
bool IsKeepMultiplexEnabledVariables(char *query_digest_text);
void ProcessQueryAndSetStatusFlags(char *query_digest_text);
void optimize();
void close_mysql();

Expand All @@ -491,6 +490,7 @@ class PgSQL_Connection_Placeholder {
bool IsKnownActiveTransaction() { assert(0); return false; }
bool IsActiveTransaction() { assert(0); return false; }
PG_ASYNC_ST handler(short event) { assert(0); return ASYNC_IDLE; }
void ProcessQueryAndSetStatusFlags(char* query_digest_text);
/********* End of remove ******************/
};

Expand Down Expand Up @@ -617,6 +617,7 @@ class PgSQL_Connection : public PgSQL_Connection_Placeholder {
void optimize() {}
void update_bytes_recv(uint64_t bytes_recv);
void update_bytes_sent(uint64_t bytes_sent);
void ProcessQueryAndSetStatusFlags(char* query_digest_text);

inline const PGconn* get_pg_connection() const { return pgsql_conn; }
inline int get_pg_server_version() { return PQserverVersion(pgsql_conn); }
Expand Down Expand Up @@ -665,6 +666,8 @@ class PgSQL_Connection : public PgSQL_Connection_Placeholder {
// Handles the COPY OUT response from the server.
// Returns true if it consumes all buffer data, or false if the threshold for result size is reached
bool handle_copy_out(const PGresult* result, uint64_t* processed_bytes);
static void notice_handler_cb(void* arg, const PGresult* result);
static void unhandled_notice_cb(void* arg, const PGresult* result);
};

#endif /* __CLASS_PGSQL_CONNECTION_H */
17 changes: 10 additions & 7 deletions include/PgSQL_Protocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ class PgSQL_Protocol;
#define PGSQL_QUERY_RESULT_ERROR 0x08
#define PGSQL_QUERY_RESULT_EMPTY 0x10
#define PGSQL_QUERY_RESULT_COPY_OUT 0x20
#define PGSQL_QUERY_RESULT_COPY_IN 0x30
#define PGSQL_QUERY_RESULT_NOTICE 0x40

class PgSQL_Query_Result {
public:
Expand Down Expand Up @@ -471,6 +471,8 @@ class PgSQL_Query_Result {
*/
unsigned int add_copy_out_response_end();

unsigned int add_notice(const PGresult* result);

/**
* @brief Retrieves the query result set and copies it to a PtrSizeArray.
*
Expand Down Expand Up @@ -829,26 +831,27 @@ class PgSQL_Protocol : public MySQL_Protocol {
unsigned int copy_command_completion_to_PgSQL_Query_Result(bool send, PgSQL_Query_Result* pg_query_result, const PGresult* result, bool extract_affected_rows);

/**
* @brief Copies an error message from a PGresult to a PgSQL_Query_Result.
* @brief Copies an error/notice message from a PGresult to a PgSQL_Query_Result.
*
* This function copies an error message from a `PGresult` object (typically
* obtained from libpq) to a `PgSQL_Query_Result` object. The error message
* contains information about an error that occurred during query execution.
* This function copies an error/notice message from a `PGresult` object (typically
* obtained from libpq) to a `PgSQL_Query_Result` object. The message
* contains information about an error/notice that occurred during query execution.
*
* @param send A boolean flag indicating whether to send the generated packet
* immediately or just generate it. (Currently not supported).
* @param pg_query_result A pointer to the `PgSQL_Query_Result` object where the
* error message will be copied.
* @param result A pointer to the `PGresult` object containing the error
* message to be copied.
*
* @param is_error A boolean flag indicating whether the message is an error or a notice.
*
* @return The number of bytes copied to the `PgSQL_Query_Result` object.
*
* @note This function extracts the various error fields (severity, code,
* message, detail, etc.) from the `PGresult` object and copies them
* to the `PgSQL_Query_Result` object.
*/
unsigned int copy_error_to_PgSQL_Query_Result(bool send, PgSQL_Query_Result* pg_query_result, const PGresult* result);
unsigned int copy_error_notice_to_PgSQL_Query_Result(bool send, PgSQL_Query_Result* pg_query_result, const PGresult* result, bool is_error);

/**
* @brief Copies an empty query response from a PGresult to a
Expand Down
4 changes: 4 additions & 0 deletions lib/MySQL_Protocol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1595,6 +1595,10 @@ int MySQL_Protocol::PPHR_1(unsigned char *pkt, unsigned int len, bool& ret, MyPr

// this function was inline in process_pkt_handshake_response() , split for readibility
bool MySQL_Protocol::PPHR_2(unsigned char *pkt, unsigned int len, bool& ret, MyProt_tmp_auth_vars& vars1) { // process_pkt_handshake_response inner 2

// if packet length is less than 4, it's a malformed packet.
if ((len - sizeof(mysql_hdr)) < 4) return false;

vars1.capabilities = CPY4(pkt);
// see bug #2916. If CLIENT_MULTI_STATEMENTS is set by the client
// we enforce setting CLIENT_MULTI_RESULTS, this is the proper and expected
Expand Down
7 changes: 0 additions & 7 deletions lib/MySQL_Session.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3954,13 +3954,6 @@ int MySQL_Session::get_pkts_from_client(bool& wrong_pass, PtrSize_t& pkt) {
client_myds->PSarrayIN->remove_index(0,&pkt);
}

if (pkt.size <= sizeof(mysql_hdr)) {
proxy_debug(PROXY_DEBUG_MYSQL_COM, 5, "Malformed packet received\n");
l_free(pkt.size, pkt.ptr);
handler_ret = -1;
return handler_ret;
}

switch (status) {
case WAITING_CLIENT_DATA:
if (pkt.size==(0xFFFFFF+sizeof(mysql_hdr))) { // we are handling a multi-packet
Expand Down
Loading