@@ -197,8 +197,7 @@ impl fmt::Display for Type {
197197#[ cfg( test) ]
198198mod test {
199199 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 } ;
202201
203202 fn checked_memory_handle ( ) -> Result < Connection > {
204203 let db = Connection :: open_in_memory ( ) ?;
@@ -298,69 +297,6 @@ mod test {
298297 Ok ( ( ) )
299298 }
300299
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-
364300 #[ test]
365301 fn test_dynamic_type ( ) -> Result < ( ) > {
366302 use super :: Value ;
@@ -383,91 +319,4 @@ mod test {
383319 assert_eq ! ( Value :: Null , row. get:: <_, Value >( 4 ) ?) ;
384320 Ok ( ( ) )
385321 }
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- }
473322}
0 commit comments