diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index bce678fc3..1f05d1b1a 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -4014,6 +4014,39 @@ void admin_session_handler(MySQL_Session *sess, void *_pa, PtrSize_t *pkt) { goto __run_query; } + // trivial implementation for 'connection_id()' to support 'mycli'. See #3247 + if (!strncasecmp("select connection_id()", query_no_space, strlen("select connection_id()"))) { + char buf[32]; + // 'connection_id()' is always forced to be '0' + sprintf(buf, "%lu", static_cast(0)); + uint16_t setStatus = 0; + MySQL_Data_Stream* myds=sess->client_myds; + MySQL_Protocol* myprot=&sess->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 *)"", + (char *)"CONNECTION_ID()", (char *)"", 63, 31, MYSQL_TYPE_LONGLONG, 161, 0, false, 0, NULL + ); + sid++; + myds->DSS=STATE_COLUMN_DEFINITION; + 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; + myprot->generate_pkt_EOF(true,NULL,NULL,sid,0, setStatus); sid++; + myds->DSS=STATE_SLEEP; + run_query=false; + free(l); + free(p); + goto __run_query; + } + if (query_no_space_length==SELECT_DB_USER_LEN) { if (!strncasecmp(SELECT_DB_USER, query_no_space, query_no_space_length)) { l_free(query_length,query);