@@ -19,9 +19,9 @@ use crate::plugins::{Intercept, Plugin, PluginOutput, QueryLogger, TableAccess};
19
19
use crate :: pool:: PoolSettings ;
20
20
use crate :: sharding:: Sharder ;
21
21
22
- use std:: cmp;
23
22
use std:: collections:: BTreeSet ;
24
23
use std:: io:: Cursor ;
24
+ use std:: { cmp, mem} ;
25
25
26
26
/// Regexes used to parse custom commands.
27
27
const CUSTOM_SQL_REGEXES : [ & str ; 7 ] = [
@@ -141,6 +141,7 @@ impl QueryRouter {
141
141
let mut message_cursor = Cursor :: new ( message_buffer) ;
142
142
143
143
let code = message_cursor. get_u8 ( ) as char ;
144
+ let len = message_cursor. get_i32 ( ) as usize ;
144
145
145
146
// Check for any sharding regex matches in any queries
146
147
match code as char {
@@ -150,9 +151,13 @@ impl QueryRouter {
150
151
|| self . pool_settings . sharding_key_regex . is_some ( )
151
152
{
152
153
// Check only the first block of bytes configured by the pool settings
153
- let len = message_cursor. get_i32 ( ) as usize ;
154
154
let seg = cmp:: min ( len - 5 , self . pool_settings . regex_search_limit ) ;
155
- let initial_segment = String :: from_utf8_lossy ( & message_buffer[ 0 ..seg] ) ;
155
+
156
+ let query_start_index = mem:: size_of :: < u8 > ( ) + mem:: size_of :: < i32 > ( ) ;
157
+
158
+ let initial_segment = String :: from_utf8_lossy (
159
+ & message_buffer[ query_start_index..query_start_index + seg] ,
160
+ ) ;
156
161
157
162
// Check for a shard_id included in the query
158
163
if let Some ( shard_id_regex) = & self . pool_settings . shard_id_regex {
@@ -192,7 +197,6 @@ impl QueryRouter {
192
197
return None ;
193
198
}
194
199
195
- let _len = message_cursor. get_i32 ( ) as usize ;
196
200
let query = message_cursor. read_string ( ) . unwrap ( ) ;
197
201
198
202
let regex_set = match CUSTOM_SQL_REGEX_SET . get ( ) {
@@ -1291,6 +1295,11 @@ mod test {
1291
1295
// Shard should start out unset
1292
1296
assert_eq ! ( qr. active_shard, None ) ;
1293
1297
1298
+ // Don't panic when short query eg. ; is sent
1299
+ let q0 = simple_query ( ";" ) ;
1300
+ assert ! ( qr. try_execute_command( & q0) == None ) ;
1301
+ assert_eq ! ( qr. active_shard, None ) ;
1302
+
1294
1303
// Make sure setting it works
1295
1304
let q1 = simple_query ( "/* shard_id: 1 */ select 1 from foo;" ) ;
1296
1305
assert ! ( qr. try_execute_command( & q1) == None ) ;
0 commit comments