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