Skip to content

Commit

Permalink
Merge pull request #4770 from sysown/v3.0_notice_support
Browse files Browse the repository at this point in the history
Add Support for Notice and Warning Message Processing - v3.0
  • Loading branch information
renecannao authored Jan 16, 2025
2 parents 6cf02da + 9e62cf6 commit c1c9f16
Show file tree
Hide file tree
Showing 11 changed files with 597 additions and 189 deletions.
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

0 comments on commit c1c9f16

Please sign in to comment.