From df287b2024763a286649a640860643fa31142d5b Mon Sep 17 00:00:00 2001 From: Yashwant Sahu <yashwant@proxysql.com> Date: Thu, 27 Mar 2025 14:43:16 +0530 Subject: [PATCH 1/3] Added handling of SELECT @@version and SELECT VERSION() without backend --- lib/MySQL_Session.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 93a243a77..65bad1f07 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -56,6 +56,12 @@ using json = nlohmann::json; #define SELECT_VARIABLE_IDENTITY_LEN 17 #define SELECT_VARIABLE_IDENTITY_LIMIT1 "SELECT @@IDENTITY LIMIT 1" #define SELECT_VARIABLE_IDENTITY_LIMIT1_LEN 25 +#define SELECT_MYSQL_VERSION "SELECT @@version" +#define SELECT_MYSQL_VERSION_LEN 16 +#define SELECT_MYSQL_VERSION_FUNC "SELECT VERSION()" +#define SELECT_MYSQL_VERSION_FUNC_LEN 16 + +#define BACKEND_SERVER_VERSION "8.0.0" #define EXPMARIA @@ -6806,6 +6812,53 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C } } + // handle case, about SELECT_MYSQL_VERSION or SELECT VERSION() + if ((pkt->size==SELECT_MYSQL_VERSION_LEN+5 && *((char *)(pkt->ptr)+4)==(char)0x03 && strncasecmp((char *)SELECT_MYSQL_VERSION,(char *)pkt->ptr+5,pkt->size-5)==0) || + (pkt->size==SELECT_MYSQL_VERSION_FUNC_LEN+5 && *((char *)(pkt->ptr)+4)==(char)0x03 && strncasecmp((char *)SELECT_MYSQL_VERSION_FUNC,(char *)pkt->ptr+5,pkt->size-5)==0)) { + char buf[32]; + sprintf(buf, "%s", BACKEND_SERVER_VERSION); + char buf2[32]; + int l0=0; + if (pkt->size == SELECT_MYSQL_VERSION_LEN+5) + l0 = strlen(SELECT_MYSQL_VERSION); + else + l0 = strlen(SELECT_MYSQL_VERSION_FUNC); + memcpy(buf2, (char *)pkt->ptr + 5, l0); + buf2[l0]=0; + unsigned int nTrx=NumActiveTransactions(); + uint16_t setStatus = (nTrx ? SERVER_STATUS_IN_TRANS : 0 ); + if (autocommit) setStatus |= SERVER_STATUS_AUTOCOMMIT; + MySQL_Data_Stream *myds=client_myds; + MySQL_Protocol *myprot=&client_myds->myprot; + myds->DSS=STATE_QUERY_SENT_DS; + int sid=1; + myprot->generate_pkt_column_count(true,NULL,NULL,sid,1); sid++; + myprot->generate_pkt_field(true,NULL,NULL,sid,(char *)"",(char *)"",(char *)"",buf2,(char *)"",33,31,MYSQL_TYPE_VAR_STRING,0,0,false,0,NULL); sid++; + myds->DSS=STATE_COLUMN_DEFINITION; + + bool deprecate_eof_active = myds->myconn->options.client_flag & CLIENT_DEPRECATE_EOF; + if (!deprecate_eof_active) { + myprot->generate_pkt_EOF(true,NULL,NULL,sid,0, setStatus); sid++; + } + char **p=(char **)malloc(sizeof(char*)*1); + unsigned long *l=(unsigned long *)malloc(sizeof(unsigned long *)*1); + l[0]=strlen(buf); + p[0]=buf; + myprot->generate_pkt_row(true,NULL,NULL,sid,1,l,p); sid++; + myds->DSS=STATE_ROW; + if (deprecate_eof_active) { + myprot->generate_pkt_OK(true,NULL,NULL,sid,0,0,setStatus,0,NULL,true); sid++; + } else { + myprot->generate_pkt_EOF(true,NULL,NULL,sid,0, setStatus); sid++; + } + myds->DSS=STATE_SLEEP; + RequestEnd(NULL); + l_free(pkt->size,pkt->ptr); + free(p); + free(l); + return true; + } + // handle command KILL #860 //if (prepared == false) { if (handle_command_query_kill(pkt)) { From b589e58de6aab4d123de1900333f791d200606c2 Mon Sep 17 00:00:00 2001 From: Yashwant Sahu <yashwant@proxysql.com> Date: Wed, 2 Apr 2025 18:15:16 +0530 Subject: [PATCH 2/3] Using global mysql version --- lib/MySQL_Session.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 65bad1f07..1c0744038 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -61,7 +61,6 @@ using json = nlohmann::json; #define SELECT_MYSQL_VERSION_FUNC "SELECT VERSION()" #define SELECT_MYSQL_VERSION_FUNC_LEN 16 -#define BACKEND_SERVER_VERSION "8.0.0" #define EXPMARIA @@ -6816,7 +6815,7 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C if ((pkt->size==SELECT_MYSQL_VERSION_LEN+5 && *((char *)(pkt->ptr)+4)==(char)0x03 && strncasecmp((char *)SELECT_MYSQL_VERSION,(char *)pkt->ptr+5,pkt->size-5)==0) || (pkt->size==SELECT_MYSQL_VERSION_FUNC_LEN+5 && *((char *)(pkt->ptr)+4)==(char)0x03 && strncasecmp((char *)SELECT_MYSQL_VERSION_FUNC,(char *)pkt->ptr+5,pkt->size-5)==0)) { char buf[32]; - sprintf(buf, "%s", BACKEND_SERVER_VERSION); + sprintf(buf, "%s", mysql_thread___server_version); char buf2[32]; int l0=0; if (pkt->size == SELECT_MYSQL_VERSION_LEN+5) From 2b5bd110a1e85aaabe4ae78d99bdc37aa4bf6b62 Mon Sep 17 00:00:00 2001 From: Yashwant Sahu <yashwant@proxysql.com> Date: Thu, 3 Apr 2025 19:32:35 +0530 Subject: [PATCH 3/3] Using mysql_thread___server_version directly --- lib/MySQL_Session.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 1c0744038..f2992ceb7 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -6814,8 +6814,6 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C // handle case, about SELECT_MYSQL_VERSION or SELECT VERSION() if ((pkt->size==SELECT_MYSQL_VERSION_LEN+5 && *((char *)(pkt->ptr)+4)==(char)0x03 && strncasecmp((char *)SELECT_MYSQL_VERSION,(char *)pkt->ptr+5,pkt->size-5)==0) || (pkt->size==SELECT_MYSQL_VERSION_FUNC_LEN+5 && *((char *)(pkt->ptr)+4)==(char)0x03 && strncasecmp((char *)SELECT_MYSQL_VERSION_FUNC,(char *)pkt->ptr+5,pkt->size-5)==0)) { - char buf[32]; - sprintf(buf, "%s", mysql_thread___server_version); char buf2[32]; int l0=0; if (pkt->size == SELECT_MYSQL_VERSION_LEN+5) @@ -6841,8 +6839,8 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C } char **p=(char **)malloc(sizeof(char*)*1); unsigned long *l=(unsigned long *)malloc(sizeof(unsigned long *)*1); - l[0]=strlen(buf); - p[0]=buf; + l[0]= strlen(mysql_thread___server_version); + p[0]=mysql_thread___server_version; myprot->generate_pkt_row(true,NULL,NULL,sid,1,l,p); sid++; myds->DSS=STATE_ROW; if (deprecate_eof_active) {