@@ -1308,6 +1308,33 @@ gboolean sql_is_write(GPtrArray *tokens) {
1308
1308
return TRUE;
1309
1309
}
1310
1310
1311
+ /**
1312
+ * for GUI tools compatibility, who send 'use xxxx' than com_init_db to change database
1313
+ * return COM_INIT_DB packets or origin packets
1314
+ */
1315
+ GString * convert_use_database2com_init_db (char type , GString * origin_packets , GPtrArray * tokens ) {
1316
+ if (type == COM_QUERY ) {
1317
+ sql_token * * ts = (sql_token * * )(tokens -> pdata );
1318
+ guint tokens_len = tokens -> len ;
1319
+ if (tokens_len > 1 ) {
1320
+ guint i = 1 ;
1321
+ sql_token_id token_id = ts [i ]-> token_id ;
1322
+
1323
+ while (token_id == TK_COMMENT && ++ i < tokens_len ) {
1324
+ token_id = ts [i ]-> token_id ;
1325
+ }
1326
+
1327
+ if (token_id == TK_SQL_USE && (i + 1 ) < tokens_len && ts [i + 1 ]-> token_id == TK_LITERAL ) {
1328
+ g_string_truncate (origin_packets , 0 );
1329
+ g_string_append_c (origin_packets , COM_INIT_DB );
1330
+ g_string_append_printf (origin_packets , "%s" , ts [i + 1 ]-> text -> str );
1331
+ }
1332
+ }
1333
+ }
1334
+
1335
+ return origin_packets ;
1336
+ }
1337
+
1311
1338
/**
1312
1339
* gets called after a query has been read
1313
1340
*
@@ -1357,6 +1384,7 @@ NETWORK_MYSQLD_PLUGIN_PROTO(proxy_read_query) {
1357
1384
sqls = sql_parse (con , tokens );
1358
1385
}
1359
1386
1387
+ packets = convert_use_database2com_init_db (type , packets , tokens );
1360
1388
gboolean is_write = sql_is_write (tokens );
1361
1389
1362
1390
ret = PROXY_SEND_INJECTION ;
@@ -1802,6 +1830,7 @@ NETWORK_MYSQLD_PLUGIN_PROTO(proxy_read_query_result) {
1802
1830
} else if (inj -> id == 7 ) {
1803
1831
log_sql (con , inj );
1804
1832
1833
+
1805
1834
merge_res_t * merge_res = con -> merge_res ;
1806
1835
if (inj -> qstat .query_status == MYSQLD_PACKET_OK && merge_res -> rows -> len < merge_res -> limit ) merge_rows (con , inj );
1807
1836
0 commit comments