@@ -197,8 +197,7 @@ impl fmt::Display for Type {
197
197
#[ cfg( test) ]
198
198
mod test {
199
199
use super :: Value ;
200
- use crate :: { params, Connection , Error , Result , Statement } ;
201
- use std:: os:: raw:: { c_double, c_int} ;
200
+ use crate :: { Connection , Result } ;
202
201
203
202
fn checked_memory_handle ( ) -> Result < Connection > {
204
203
let db = Connection :: open_in_memory ( ) ?;
@@ -298,69 +297,6 @@ mod test {
298
297
Ok ( ( ) )
299
298
}
300
299
301
- #[ test]
302
- #[ allow( clippy:: cognitive_complexity) ]
303
- #[ ignore = "duckdb doesn't support this" ]
304
- fn test_mismatched_types ( ) -> Result < ( ) > {
305
- fn is_invalid_column_type ( err : Error ) -> bool {
306
- matches ! ( err, Error :: InvalidColumnType ( ..) )
307
- }
308
-
309
- let db = checked_memory_handle ( ) ?;
310
-
311
- db. execute ( "INSERT INTO foo(b, t, i, f) VALUES (X'0102', 'text', 1, 1.5)" , [ ] ) ?;
312
-
313
- let mut stmt = db. prepare ( "SELECT b, t, i, f, n FROM foo" ) ?;
314
- let mut rows = stmt. query ( [ ] ) ?;
315
- let row = rows. next ( ) ?. unwrap ( ) ;
316
-
317
- // check the correct types come back as expected
318
- assert_eq ! ( vec![ 1 , 2 ] , row. get:: <_, Vec <u8 >>( 0 ) ?) ;
319
- assert_eq ! ( "text" , row. get:: <_, String >( 1 ) ?) ;
320
- assert_eq ! ( 1 , row. get:: <_, c_int>( 2 ) ?) ;
321
- assert ! ( ( 1.5 - row. get:: <_, c_double>( 3 ) ?) . abs( ) < f64 :: EPSILON ) ;
322
- assert_eq ! ( row. get:: <_, Option <c_int>>( 4 ) ?, None ) ;
323
- assert_eq ! ( row. get:: <_, Option <c_double>>( 4 ) ?, None ) ;
324
- assert_eq ! ( row. get:: <_, Option <String >>( 4 ) ?, None ) ;
325
-
326
- // check some invalid types
327
-
328
- // 0 is actually a blob (Vec<u8>)
329
- assert ! ( is_invalid_column_type( row. get:: <_, c_int>( 0 ) . err( ) . unwrap( ) ) ) ;
330
- assert ! ( is_invalid_column_type( row. get:: <_, c_int>( 0 ) . err( ) . unwrap( ) ) ) ;
331
- assert ! ( is_invalid_column_type( row. get:: <_, i64 >( 0 ) . err( ) . unwrap( ) ) ) ;
332
- assert ! ( is_invalid_column_type( row. get:: <_, c_double>( 0 ) . err( ) . unwrap( ) ) ) ;
333
- assert ! ( is_invalid_column_type( row. get:: <_, String >( 0 ) . err( ) . unwrap( ) ) ) ;
334
- assert ! ( is_invalid_column_type( row. get:: <_, Option <c_int>>( 0 ) . err( ) . unwrap( ) ) ) ;
335
-
336
- // 1 is actually a text (String)
337
- assert ! ( is_invalid_column_type( row. get:: <_, c_int>( 1 ) . err( ) . unwrap( ) ) ) ;
338
- assert ! ( is_invalid_column_type( row. get:: <_, i64 >( 1 ) . err( ) . unwrap( ) ) ) ;
339
- assert ! ( is_invalid_column_type( row. get:: <_, c_double>( 1 ) . err( ) . unwrap( ) ) ) ;
340
- assert ! ( is_invalid_column_type( row. get:: <_, Vec <u8 >>( 1 ) . err( ) . unwrap( ) ) ) ;
341
- assert ! ( is_invalid_column_type( row. get:: <_, Option <c_int>>( 1 ) . err( ) . unwrap( ) ) ) ;
342
-
343
- // 2 is actually an integer
344
- assert ! ( is_invalid_column_type( row. get:: <_, String >( 2 ) . err( ) . unwrap( ) ) ) ;
345
- assert ! ( is_invalid_column_type( row. get:: <_, Vec <u8 >>( 2 ) . err( ) . unwrap( ) ) ) ;
346
- assert ! ( is_invalid_column_type( row. get:: <_, Option <String >>( 2 ) . err( ) . unwrap( ) ) ) ;
347
-
348
- // 3 is actually a float (c_double)
349
- assert ! ( is_invalid_column_type( row. get:: <_, c_int>( 3 ) . err( ) . unwrap( ) ) ) ;
350
- assert ! ( is_invalid_column_type( row. get:: <_, i64 >( 3 ) . err( ) . unwrap( ) ) ) ;
351
- assert ! ( is_invalid_column_type( row. get:: <_, String >( 3 ) . err( ) . unwrap( ) ) ) ;
352
- assert ! ( is_invalid_column_type( row. get:: <_, Vec <u8 >>( 3 ) . err( ) . unwrap( ) ) ) ;
353
- assert ! ( is_invalid_column_type( row. get:: <_, Option <c_int>>( 3 ) . err( ) . unwrap( ) ) ) ;
354
-
355
- // 4 is actually NULL
356
- assert ! ( is_invalid_column_type( row. get:: <_, c_int>( 4 ) . err( ) . unwrap( ) ) ) ;
357
- assert ! ( is_invalid_column_type( row. get:: <_, i64 >( 4 ) . err( ) . unwrap( ) ) ) ;
358
- assert ! ( is_invalid_column_type( row. get:: <_, c_double>( 4 ) . err( ) . unwrap( ) ) ) ;
359
- assert ! ( is_invalid_column_type( row. get:: <_, String >( 4 ) . err( ) . unwrap( ) ) ) ;
360
- assert ! ( is_invalid_column_type( row. get:: <_, Vec <u8 >>( 4 ) . err( ) . unwrap( ) ) ) ;
361
- Ok ( ( ) )
362
- }
363
-
364
300
#[ test]
365
301
fn test_dynamic_type ( ) -> Result < ( ) > {
366
302
use super :: Value ;
@@ -383,91 +319,4 @@ mod test {
383
319
assert_eq ! ( Value :: Null , row. get:: <_, Value >( 4 ) ?) ;
384
320
Ok ( ( ) )
385
321
}
386
-
387
- macro_rules! test_conversion {
388
- ( $db_etc: ident, $insert_value: expr, $get_type: ty, expect $expected_value: expr) => {
389
- $db_etc. insert_statement. execute( params![ $insert_value] ) ?;
390
- let res = $db_etc
391
- . query_statement
392
- . query_row( [ ] , |row| row. get:: <_, $get_type>( 0 ) ) ;
393
- assert_eq!( res?, $expected_value) ;
394
- $db_etc. delete_statement. execute( [ ] ) ?;
395
- } ;
396
- ( $db_etc: ident, $insert_value: expr, $get_type: ty, expect_from_sql_error) => {
397
- $db_etc. insert_statement. execute( params![ $insert_value] ) ?;
398
- let res = $db_etc
399
- . query_statement
400
- . query_row( [ ] , |row| row. get:: <_, $get_type>( 0 ) ) ;
401
- res. unwrap_err( ) ;
402
- $db_etc. delete_statement. execute( [ ] ) ?;
403
- } ;
404
- ( $db_etc: ident, $insert_value: expr, $get_type: ty, expect_to_sql_error) => {
405
- $db_etc
406
- . insert_statement
407
- . execute( params![ $insert_value] )
408
- . unwrap_err( ) ;
409
- } ;
410
- }
411
-
412
- #[ test]
413
- #[ ignore = "duckdb doesn't support this" ]
414
- fn test_numeric_conversions ( ) -> Result < ( ) > {
415
- #![ allow( clippy:: float_cmp) ]
416
-
417
- // Test what happens when we store an f32 and retrieve an i32 etc.
418
- let db = Connection :: open_in_memory ( ) ?;
419
- db. execute_batch ( "CREATE TABLE foo (x)" ) ?;
420
-
421
- // DuckDB actually ignores the column types, so we just need to test
422
- // different numeric values.
423
-
424
- struct DbEtc < ' conn > {
425
- insert_statement : Statement < ' conn > ,
426
- query_statement : Statement < ' conn > ,
427
- delete_statement : Statement < ' conn > ,
428
- }
429
-
430
- let mut db_etc = DbEtc {
431
- insert_statement : db. prepare ( "INSERT INTO foo VALUES (?1)" ) ?,
432
- query_statement : db. prepare ( "SELECT x FROM foo" ) ?,
433
- delete_statement : db. prepare ( "DELETE FROM foo" ) ?,
434
- } ;
435
-
436
- // Basic non-converting test.
437
- test_conversion ! ( db_etc, 0u8 , u8 , expect 0u8 ) ;
438
-
439
- // In-range integral conversions.
440
- test_conversion ! ( db_etc, 100u8 , i8 , expect 100i8 ) ;
441
- test_conversion ! ( db_etc, 200u8 , u8 , expect 200u8 ) ;
442
- test_conversion ! ( db_etc, 100u16 , i8 , expect 100i8 ) ;
443
- test_conversion ! ( db_etc, 200u16 , u8 , expect 200u8 ) ;
444
- test_conversion ! ( db_etc, u32 :: MAX , u64 , expect u32 :: MAX as u64 ) ;
445
- test_conversion ! ( db_etc, i64 :: MIN , i64 , expect i64 :: MIN ) ;
446
- test_conversion ! ( db_etc, i64 :: MAX , i64 , expect i64 :: MAX ) ;
447
- test_conversion ! ( db_etc, i64 :: MAX , u64 , expect i64 :: MAX as u64 ) ;
448
- test_conversion ! ( db_etc, 100usize , usize , expect 100usize ) ;
449
- test_conversion ! ( db_etc, 100u64 , u64 , expect 100u64 ) ;
450
- test_conversion ! ( db_etc, i64 :: MAX as u64 , u64 , expect i64 :: MAX as u64 ) ;
451
-
452
- // Out-of-range integral conversions.
453
- test_conversion ! ( db_etc, 200u8 , i8 , expect_from_sql_error) ;
454
- test_conversion ! ( db_etc, 400u16 , i8 , expect_from_sql_error) ;
455
- test_conversion ! ( db_etc, 400u16 , u8 , expect_from_sql_error) ;
456
- test_conversion ! ( db_etc, -1i8 , u8 , expect_from_sql_error) ;
457
- test_conversion ! ( db_etc, i64 :: MIN , u64 , expect_from_sql_error) ;
458
- test_conversion ! ( db_etc, u64 :: MAX , i64 , expect_to_sql_error) ;
459
- test_conversion ! ( db_etc, u64 :: MAX , u64 , expect_to_sql_error) ;
460
- test_conversion ! ( db_etc, i64 :: MAX as u64 + 1 , u64 , expect_to_sql_error) ;
461
-
462
- // FromSql integer to float, always works.
463
- test_conversion ! ( db_etc, i64 :: MIN , f32 , expect i64 :: MIN as f32 ) ;
464
- test_conversion ! ( db_etc, i64 :: MAX , f32 , expect i64 :: MAX as f32 ) ;
465
- test_conversion ! ( db_etc, i64 :: MIN , f64 , expect i64 :: MIN as f64 ) ;
466
- test_conversion ! ( db_etc, i64 :: MAX , f64 , expect i64 :: MAX as f64 ) ;
467
-
468
- // FromSql float to int conversion, never works even if the actual value
469
- // is an integer.
470
- test_conversion ! ( db_etc, 0f64 , i64 , expect_from_sql_error) ;
471
- Ok ( ( ) )
472
- }
473
322
}
0 commit comments