@@ -2,7 +2,7 @@ use pretty_assertions::assert_eq;
22use rust_decimal:: Decimal ;
33
44use crate :: {
5- types:: { TimeUnit , ValueRef } ,
5+ types:: { TimeUnit , Type , Value , ValueRef } ,
66 Connection ,
77} ;
88
@@ -21,13 +21,6 @@ fn test_all_types() -> crate::Result<()> {
2121 "small_enum" ,
2222 "medium_enum" ,
2323 "large_enum" ,
24- "int_array" ,
25- "double_array" ,
26- "date_array" ,
27- "timestamp_array" ,
28- "timestamptz_array" ,
29- "varchar_array" ,
30- "nested_int_array" ,
3124 "struct" ,
3225 "struct_of_arrays" ,
3326 "array_of_structs" ,
@@ -57,6 +50,9 @@ fn test_all_types() -> crate::Result<()> {
5750 idx += 1 ;
5851 for column in row. stmt . column_names ( ) {
5952 let value = row. get_ref_unwrap ( row. stmt . column_index ( & column) ?) ;
53+ if idx != 2 {
54+ assert_ne ! ( value. data_type( ) , Type :: Null ) ;
55+ }
6056 test_single ( & mut idx, column, value) ;
6157 }
6258 }
@@ -213,6 +209,122 @@ fn test_single(idx: &mut i32, column: String, value: ValueRef) {
213209 1 => assert_eq ! ( value, ValueRef :: Blob ( & [ 0 , 0 , 0 , 97 ] ) ) ,
214210 _ => assert_eq ! ( value, ValueRef :: Null ) ,
215211 } ,
212+ "int_array" => match idx {
213+ 0 => assert_eq ! ( value. to_owned( ) , Value :: List ( vec![ ] ) ) ,
214+ 1 => assert_eq ! (
215+ value. to_owned( ) ,
216+ Value :: List ( vec![
217+ Value :: Int ( 42 ) ,
218+ Value :: Int ( 999 ) ,
219+ Value :: Null ,
220+ Value :: Null ,
221+ Value :: Int ( -42 ) ,
222+ ] )
223+ ) ,
224+ _ => assert_eq ! ( value, ValueRef :: Null ) ,
225+ } ,
226+ "double_array" => match idx {
227+ 0 => assert_eq ! ( value. to_owned( ) , Value :: List ( vec![ ] ) ) ,
228+ 1 => {
229+ let value = value. to_owned ( ) ;
230+
231+ if let Value :: List ( values) = value {
232+ assert_eq ! ( values. len( ) , 6 ) ;
233+ assert_eq ! ( values[ 0 ] , Value :: Double ( 42.0 ) ) ;
234+ assert ! ( unwrap( & values[ 1 ] ) . is_nan( ) ) ;
235+ let val = unwrap ( & values[ 2 ] ) ;
236+ assert ! ( val. is_infinite( ) && val. is_sign_positive( ) ) ;
237+ let val = unwrap ( & values[ 3 ] ) ;
238+ assert ! ( val. is_infinite( ) && val. is_sign_negative( ) ) ;
239+ assert_eq ! ( values[ 4 ] , Value :: Null ) ;
240+ assert_eq ! ( values[ 5 ] , Value :: Double ( -42.0 ) ) ;
241+ }
242+ }
243+ _ => assert_eq ! ( value, ValueRef :: Null ) ,
244+ } ,
245+ "date_array" => match idx {
246+ 0 => assert_eq ! ( value. to_owned( ) , Value :: List ( vec![ ] ) ) ,
247+ 1 => assert_eq ! (
248+ value. to_owned( ) ,
249+ Value :: List ( vec![
250+ Value :: Date32 ( 0 ) ,
251+ Value :: Date32 ( 2147483647 ) ,
252+ Value :: Date32 ( -2147483647 ) ,
253+ Value :: Null ,
254+ Value :: Date32 ( 19124 ) ,
255+ ] )
256+ ) ,
257+ _ => assert_eq ! ( value, ValueRef :: Null ) ,
258+ } ,
259+ "timestamp_array" => match idx {
260+ 0 => assert_eq ! ( value. to_owned( ) , Value :: List ( vec![ ] ) ) ,
261+ 1 => assert_eq ! (
262+ value. to_owned( ) ,
263+ Value :: List ( vec![
264+ Value :: Timestamp ( TimeUnit :: Microsecond , 0 , ) ,
265+ Value :: Timestamp ( TimeUnit :: Microsecond , 9223372036854775807 , ) ,
266+ Value :: Timestamp ( TimeUnit :: Microsecond , -9223372036854775807 , ) ,
267+ Value :: Null ,
268+ Value :: Timestamp ( TimeUnit :: Microsecond , 1652372625000000 , ) ,
269+ ] , )
270+ ) ,
271+ _ => assert_eq ! ( value, ValueRef :: Null ) ,
272+ } ,
273+ "timestamptz_array" => match idx {
274+ 0 => assert_eq ! ( value. to_owned( ) , Value :: List ( vec![ ] ) ) ,
275+ 1 => assert_eq ! (
276+ value. to_owned( ) ,
277+ Value :: List ( vec![
278+ Value :: Timestamp ( TimeUnit :: Microsecond , 0 , ) ,
279+ Value :: Timestamp ( TimeUnit :: Microsecond , 9223372036854775807 , ) ,
280+ Value :: Timestamp ( TimeUnit :: Microsecond , -9223372036854775807 , ) ,
281+ Value :: Null ,
282+ Value :: Timestamp ( TimeUnit :: Microsecond , 1652397825000000 , ) ,
283+ ] )
284+ ) ,
285+ _ => assert_eq ! ( value, ValueRef :: Null ) ,
286+ } ,
287+ "varchar_array" => match idx {
288+ 0 => assert_eq ! ( value. to_owned( ) , Value :: List ( vec![ ] ) ) ,
289+ 1 => assert_eq ! (
290+ value. to_owned( ) ,
291+ Value :: List ( vec![
292+ Value :: Text ( "🦆🦆🦆🦆🦆🦆" . to_string( ) ) ,
293+ Value :: Text ( "goose" . to_string( ) ) ,
294+ Value :: Null ,
295+ Value :: Text ( "" . to_string( ) ) ,
296+ ] )
297+ ) ,
298+ _ => assert_eq ! ( value, ValueRef :: Null ) ,
299+ } ,
300+ "nested_int_array" => match idx {
301+ 0 => assert_eq ! ( value. to_owned( ) , Value :: List ( vec![ ] ) ) ,
302+ 1 => {
303+ assert_eq ! (
304+ value. to_owned( ) ,
305+ Value :: List ( vec![
306+ Value :: List ( vec![ ] , ) ,
307+ Value :: List ( vec![
308+ Value :: Int ( 42 , ) ,
309+ Value :: Int ( 999 , ) ,
310+ Value :: Null ,
311+ Value :: Null ,
312+ Value :: Int ( -42 , ) ,
313+ ] , ) ,
314+ Value :: Null ,
315+ Value :: List ( vec![ ] , ) ,
316+ Value :: List ( vec![
317+ Value :: Int ( 42 , ) ,
318+ Value :: Int ( 999 , ) ,
319+ Value :: Null ,
320+ Value :: Null ,
321+ Value :: Int ( -42 , ) ,
322+ ] , ) ,
323+ ] , )
324+ )
325+ }
326+ _ => assert_eq ! ( value, ValueRef :: Null ) ,
327+ } ,
216328 "bit" => match idx {
217329 0 => assert_eq ! ( value, ValueRef :: Blob ( & [ 1 , 145 , 46 , 42 , 215 ] ) , ) ,
218330 1 => assert_eq ! ( value, ValueRef :: Blob ( & [ 3 , 245 ] ) ) ,
@@ -240,3 +352,11 @@ fn test_single(idx: &mut i32, column: String, value: ValueRef) {
240352 _ => todo ! ( "{column:?}" ) ,
241353 }
242354}
355+
356+ fn unwrap ( value : & Value ) -> f64 {
357+ if let Value :: Double ( val) = value {
358+ * val
359+ } else {
360+ panic ! ( ) ;
361+ }
362+ }
0 commit comments