@@ -183,6 +183,11 @@ fn validate_cstring_array<'a>(
183183 Ok ( true )
184184}
185185
186+ #[ pg_extern]
187+ fn int_array_roundtrip ( arr : Array < i32 > ) -> Array < i32 > {
188+ arr
189+ }
190+
186191#[ cfg( any( test, feature = "pg_test" ) ) ]
187192#[ pgrx:: pg_schema]
188193mod tests {
@@ -506,4 +511,85 @@ mod tests {
506511
507512 Ok ( ( ) )
508513 }
514+
515+ #[ pg_test]
516+ fn test_int_array_roundtrip_test ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
517+ let a = Spi :: get_one :: < Vec < i32 > > ( "SELECT int_array_roundtrip(ARRAY[1, 2, 3, 4, 5])" ) ?;
518+
519+ assert_eq ! ( a, Some ( vec![ 1 , 2 , 3 , 4 , 5 ] ) ) ;
520+
521+ Ok ( ( ) )
522+ }
523+
524+ #[ pg_test]
525+ fn test_array_new_from_slice ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
526+ let a = Spi :: get_one :: < Array < i8 > > ( "SELECT ARRAY[1, 2, 3, 4, 5]::\" char\" []" ) ?
527+ . expect ( "spi result was NULL" ) ;
528+ let b = Array :: < i8 > :: new_from_slice ( & [ 1 , 2 , 3 , 4 , 5 ] ) . expect ( "failed to create array" ) ;
529+
530+ assert_eq ! ( a. as_slice( ) ?, b. as_slice( ) ?) ;
531+
532+ let a = Spi :: get_one :: < Array < i16 > > ( "SELECT ARRAY[1, 2, 3, 4, 5]::smallint[]" ) ?
533+ . expect ( "spi result was NULL" ) ;
534+ let b = Array :: < i16 > :: new_from_slice ( & [ 1 , 2 , 3 , 4 , 5 ] ) . expect ( "failed to create array" ) ;
535+
536+ assert_eq ! ( a. as_slice( ) ?, b. as_slice( ) ?) ;
537+
538+ let a = Spi :: get_one :: < Array < i32 > > ( "SELECT ARRAY[1, 2, 3, 4, 5]::integer[]" ) ?
539+ . expect ( "spi result was NULL" ) ;
540+ let b = Array :: < i32 > :: new_from_slice ( & [ 1 , 2 , 3 , 4 , 5 ] ) . expect ( "failed to create array" ) ;
541+
542+ assert_eq ! ( a. as_slice( ) ?, b. as_slice( ) ?) ;
543+
544+ let a = Spi :: get_one :: < Array < i64 > > ( "SELECT ARRAY[1, 2, 3, 4, 5]::bigint[]" ) ?
545+ . expect ( "spi result was NULL" ) ;
546+ let b = Array :: < i64 > :: new_from_slice ( & [ 1 , 2 , 3 , 4 , 5 ] ) . expect ( "failed to create array" ) ;
547+
548+ assert_eq ! ( a. as_slice( ) ?, b. as_slice( ) ?) ;
549+
550+ let a = Spi :: get_one :: < Array < f32 > > ( "SELECT ARRAY[1.0, 2.0, 3.0, 4.0, 5.0]::float4[]" ) ?
551+ . expect ( "spi result was NULL" ) ;
552+ let b = Array :: < f32 > :: new_from_slice ( & [ 1.0 , 2.0 , 3.0 , 4.0 , 5.0 ] )
553+ . expect ( "failed to create array" ) ;
554+
555+ assert_eq ! ( a. as_slice( ) ?, b. as_slice( ) ?) ;
556+
557+ let a = Spi :: get_one :: < Array < f64 > > ( "SELECT ARRAY[1.0, 2.0, 3.0, 4.0, 5.0]::float8[]" ) ?
558+ . expect ( "spi result was NULL" ) ;
559+ let b = Array :: < f64 > :: new_from_slice ( & [ 1.0 , 2.0 , 3.0 , 4.0 , 5.0 ] )
560+ . expect ( "failed to create array" ) ;
561+
562+ assert_eq ! ( a. as_slice( ) ?, b. as_slice( ) ?) ;
563+
564+ Ok ( ( ) )
565+ }
566+
567+ #[ pg_test]
568+ fn test_new_array_with_len ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
569+ let a = Array :: < i8 > :: new_with_len ( 5 ) . expect ( "failed to create array" ) ;
570+
571+ assert_eq ! ( a. as_slice( ) ?, & [ 0 , 0 , 0 , 0 , 0 ] ) ;
572+
573+ let a = Array :: < i16 > :: new_with_len ( 5 ) . expect ( "failed to create array" ) ;
574+
575+ assert_eq ! ( a. as_slice( ) ?, & [ 0 , 0 , 0 , 0 , 0 ] ) ;
576+
577+ let a = Array :: < i32 > :: new_with_len ( 5 ) . expect ( "failed to create array" ) ;
578+
579+ assert_eq ! ( a. as_slice( ) ?, & [ 0 , 0 , 0 , 0 , 0 ] ) ;
580+
581+ let a = Array :: < i64 > :: new_with_len ( 5 ) . expect ( "failed to create array" ) ;
582+
583+ assert_eq ! ( a. as_slice( ) ?, & [ 0 , 0 , 0 , 0 , 0 ] ) ;
584+
585+ let a = Array :: < f32 > :: new_with_len ( 5 ) . expect ( "failed to create array" ) ;
586+
587+ assert_eq ! ( a. as_slice( ) ?, & [ 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ] ) ;
588+
589+ let a = Array :: < f64 > :: new_with_len ( 5 ) . expect ( "failed to create array" ) ;
590+
591+ assert_eq ! ( a. as_slice( ) ?, & [ 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ] ) ;
592+
593+ Ok ( ( ) )
594+ }
509595}
0 commit comments