@@ -46,9 +46,9 @@ use std::{
46
46
net:: { Ipv4Addr , Ipv6Addr } ,
47
47
} ;
48
48
49
+ use super :: errors:: { ProtocolError , UseKeyspaceProtocolError } ;
49
50
use super :: iterator:: RowIterator ;
50
51
use super :: locator:: tablets:: { RawTablet , TabletParsingError } ;
51
- use super :: query_result:: SingleRowTypedError ;
52
52
use super :: session:: AddressTranslator ;
53
53
use super :: topology:: { PeerEndpoint , UntranslatedEndpoint , UntranslatedPeer } ;
54
54
use super :: NodeAddr ;
@@ -299,10 +299,11 @@ impl NonErrorQueryResponse {
299
299
let ( result, paging_state) = self . into_query_result_and_paging_state ( ) ?;
300
300
301
301
if !paging_state. finished ( ) {
302
- let error_msg = "Internal driver API misuse or a server bug: nonfinished paging state\
303
- would be discarded by `NonErrorQueryResponse::into_query_result`";
304
- error ! ( error_msg) ;
305
- return Err ( QueryError :: ProtocolError ( error_msg) ) ;
302
+ error ! (
303
+ "Internal driver API misuse or a server bug: nonfinished paging state\
304
+ would be discarded by `NonErrorQueryResponse::into_query_result`"
305
+ ) ;
306
+ return Err ( ProtocolError :: NonfinishedPagingState . into ( ) ) ;
306
307
}
307
308
308
309
Ok ( result)
@@ -904,7 +905,11 @@ impl Connection {
904
905
// Reprepared statement should keep its id - it's the md5 sum
905
906
// of statement contents
906
907
if reprepared. get_id ( ) != previous_prepared. get_id ( ) {
907
- Err ( UserRequestError :: RepreparedIdChanged )
908
+ Err ( UserRequestError :: RepreparedIdChanged {
909
+ statement : reprepare_query. contents ,
910
+ expected_id : previous_prepared. get_id ( ) . clone ( ) . into ( ) ,
911
+ reprepared_id : reprepared. get_id ( ) . clone ( ) . into ( ) ,
912
+ } )
908
913
} else {
909
914
Ok ( ( ) )
910
915
}
@@ -1284,17 +1289,16 @@ impl Connection {
1284
1289
self . reprepare ( p. get_statement ( ) , p) . await ?;
1285
1290
continue ;
1286
1291
} else {
1287
- return Err ( QueryError :: ProtocolError (
1288
- "The server returned a prepared statement Id that did not exist in the batch" ,
1289
- ) ) ;
1292
+ return Err ( ProtocolError :: RepreparedIdMissingInBatch . into ( ) ) ;
1290
1293
}
1291
1294
}
1292
1295
_ => Err ( err. into ( ) ) ,
1293
1296
} ,
1294
1297
Response :: Result ( _) => Ok ( query_response. into_query_result ( ) ?) ,
1295
- _ => Err ( QueryError :: ProtocolError (
1296
- "BATCH: Unexpected server response" ,
1297
- ) ) ,
1298
+ _ => Err ( ProtocolError :: UnexpectedResponse (
1299
+ query_response. response . to_response_kind ( ) ,
1300
+ )
1301
+ . into ( ) ) ,
1298
1302
} ;
1299
1303
}
1300
1304
}
@@ -1359,23 +1363,40 @@ impl Connection {
1359
1363
} ;
1360
1364
1361
1365
let query_response = self . query_raw_unpaged ( & query, PagingState :: start ( ) ) . await ?;
1366
+ Self :: verify_use_keyspace_result ( keyspace_name, query_response)
1367
+ }
1362
1368
1369
+ fn verify_use_keyspace_result (
1370
+ keyspace_name : & VerifiedKeyspaceName ,
1371
+ query_response : QueryResponse ,
1372
+ ) -> Result < ( ) , QueryError > {
1363
1373
match query_response. response {
1364
1374
Response :: Result ( result:: Result :: SetKeyspace ( set_keyspace) ) => {
1365
- if set_keyspace. keyspace_name . to_lowercase ( )
1366
- != keyspace_name. as_str ( ) . to_lowercase ( )
1375
+ if !set_keyspace
1376
+ . keyspace_name
1377
+ . eq_ignore_ascii_case ( keyspace_name. as_str ( ) )
1367
1378
{
1368
- return Err ( QueryError :: ProtocolError (
1369
- "USE <keyspace_name> returned response with different keyspace name" ,
1370
- ) ) ;
1379
+ let expected_keyspace_name_lowercase = keyspace_name. as_str ( ) . to_lowercase ( ) ;
1380
+ let result_keyspace_name_lowercase = set_keyspace. keyspace_name . to_lowercase ( ) ;
1381
+
1382
+ return Err ( ProtocolError :: UseKeyspace (
1383
+ UseKeyspaceProtocolError :: KeyspaceNameMismatch {
1384
+ expected_keyspace_name_lowercase,
1385
+ result_keyspace_name_lowercase,
1386
+ } ,
1387
+ )
1388
+ . into ( ) ) ;
1371
1389
}
1372
1390
1373
1391
Ok ( ( ) )
1374
1392
}
1375
1393
Response :: Error ( err) => Err ( err. into ( ) ) ,
1376
- _ => Err ( QueryError :: ProtocolError (
1377
- "USE <keyspace_name> returned unexpected response" ,
1378
- ) ) ,
1394
+ _ => Err (
1395
+ ProtocolError :: UseKeyspace ( UseKeyspaceProtocolError :: UnexpectedResponse (
1396
+ query_response. response . to_response_kind ( ) ,
1397
+ ) )
1398
+ . into ( ) ,
1399
+ ) ,
1379
1400
}
1380
1401
}
1381
1402
@@ -1425,17 +1446,7 @@ impl Connection {
1425
1446
. query_unpaged ( LOCAL_VERSION )
1426
1447
. await ?
1427
1448
. single_row_typed ( )
1428
- . map_err ( |err| match err {
1429
- SingleRowTypedError :: RowsExpected ( _) => {
1430
- QueryError :: ProtocolError ( "Version query returned not rows" )
1431
- }
1432
- SingleRowTypedError :: BadNumberOfRows ( _) => {
1433
- QueryError :: ProtocolError ( "system.local query returned a wrong number of rows" )
1434
- }
1435
- SingleRowTypedError :: FromRowError ( _) => {
1436
- QueryError :: ProtocolError ( "Row is not uuid type as it should be" )
1437
- }
1438
- } ) ?;
1449
+ . map_err ( ProtocolError :: SchemaVersionFetch ) ?;
1439
1450
Ok ( version_id)
1440
1451
}
1441
1452
0 commit comments