@@ -805,6 +805,91 @@ async fn test_unnest_typing() {
805805 wait_for_all_pending_handles ( ) . await ;
806806}
807807
808+ #[ tokio:: test( flavor = "multi_thread" ) ]
809+ async fn test_unnest_max_parameters ( ) {
810+ let ( tripwire, tripwire_worker, tripwire_tx) = Tripwire :: new_simple ( ) ;
811+
812+ let ( _ta, server) = setup_pg_test_server ( tripwire, None ) . await ;
813+
814+ let conn_str = format ! (
815+ "host={} port={} user=testuser" ,
816+ server. local_addr. ip( ) ,
817+ server. local_addr. port( )
818+ ) ;
819+
820+ {
821+ let ( client, client_conn) = tokio_postgres:: connect ( & conn_str, NoTls ) . await . unwrap ( ) ;
822+ println ! ( "client is ready!" ) ;
823+ tokio:: spawn ( client_conn) ;
824+
825+ // expected_max_arrays parameters should work
826+ let expected_max_arrays = 32 ;
827+ let per_column = 16 ;
828+ {
829+ let cols = ( 0 ..expected_max_arrays)
830+ . map ( |i| {
831+ ( 0 ..per_column)
832+ . map ( |j| i * 1000 + j as i64 )
833+ . collect :: < Vec < i64 > > ( )
834+ } )
835+ . collect :: < Vec < Vec < i64 > > > ( ) ;
836+ let rets = ( 0 ..expected_max_arrays)
837+ . map ( |i| format ! ( "CAST(value{i} AS int)" ) )
838+ . collect :: < Vec < _ > > ( )
839+ . join ( "," ) ;
840+ let arrs = ( 0 ..expected_max_arrays)
841+ . map ( |i| format ! ( "CAST(${i} AS int[])" ) )
842+ . collect :: < Vec < _ > > ( )
843+ . join ( "," ) ;
844+ let params: Vec < & ( dyn tokio_postgres:: types:: ToSql + Sync ) > = cols
845+ . iter ( )
846+ . map ( |v| v as & ( dyn tokio_postgres:: types:: ToSql + Sync ) )
847+ . collect ( ) ;
848+ let rows = client
849+ . query ( & format ! ( "SELECT {rets} FROM unnest({arrs})" ) , & params)
850+ . await
851+ . unwrap ( ) ;
852+ for ( i, row) in rows. iter ( ) . enumerate ( ) {
853+ for j in 0 ..per_column {
854+ let val: i64 = row. get ( j) ;
855+ assert_eq ! ( val, cols[ i] [ j] ) ;
856+ }
857+ }
858+ }
859+
860+ // but not expected_max_arrays + 1
861+ {
862+ let cols = ( 0 ..expected_max_arrays + 1 )
863+ . map ( |i| {
864+ ( 0 ..per_column)
865+ . map ( |j| i * 1000 + j as i64 )
866+ . collect :: < Vec < i64 > > ( )
867+ } )
868+ . collect :: < Vec < Vec < i64 > > > ( ) ;
869+ let rets = ( 0 ..expected_max_arrays + 1 )
870+ . map ( |i| format ! ( "CAST(value{i} AS int)" ) )
871+ . collect :: < Vec < _ > > ( )
872+ . join ( ", " ) ;
873+ let arrs = ( 0 ..expected_max_arrays + 1 )
874+ . map ( |i| format ! ( "CAST(${i} AS int[])" ) )
875+ . collect :: < Vec < _ > > ( )
876+ . join ( ", " ) ;
877+ let params: Vec < & ( dyn tokio_postgres:: types:: ToSql + Sync ) > = cols
878+ . iter ( )
879+ . map ( |v| v as & ( dyn tokio_postgres:: types:: ToSql + Sync ) )
880+ . collect ( ) ;
881+ assert ! ( client
882+ . query( & format!( "SELECT {rets} FROM unnest({arrs})" ) , & params, )
883+ . await
884+ . is_err( ) ) ;
885+ }
886+ }
887+
888+ tripwire_tx. send ( ( ) ) . await . ok ( ) ;
889+ tripwire_worker. await ;
890+ wait_for_all_pending_handles ( ) . await ;
891+ }
892+
808893#[ tokio:: test( flavor = "multi_thread" ) ]
809894async fn test_unnest_vtab ( ) {
810895 let ( tripwire, tripwire_worker, tripwire_tx) = Tripwire :: new_simple ( ) ;
0 commit comments