@@ -198,6 +198,49 @@ fn insert_select() {
198
198
runtime. block_on ( tests) . unwrap ( ) ;
199
199
}
200
200
201
+ #[ test]
202
+ fn query_portal ( ) {
203
+ let _ = env_logger:: try_init ( ) ;
204
+ let mut runtime = Runtime :: new ( ) . unwrap ( ) ;
205
+
206
+ let handshake = tokio_postgres:: connect (
207
+ "postgres://postgres@localhost:5433" . parse ( ) . unwrap ( ) ,
208
+ TlsMode :: None ,
209
+ ) ;
210
+ let ( mut client, connection) = runtime. block_on ( handshake) . unwrap ( ) ;
211
+ let connection = connection. map_err ( |e| panic ! ( "{}" , e) ) ;
212
+ runtime. handle ( ) . spawn ( connection) . unwrap ( ) ;
213
+
214
+ runtime
215
+ . block_on ( client. batch_execute (
216
+ "CREATE TEMPORARY TABLE foo (id SERIAL, name TEXT);
217
+ INSERT INTO foo (name) VALUES ('alice'), ('bob'), ('charlie');
218
+ BEGIN;" ,
219
+ ) ) . unwrap ( ) ;
220
+
221
+ let statement = runtime
222
+ . block_on ( client. prepare ( "SELECT id, name FROM foo ORDER BY id" ) )
223
+ . unwrap ( ) ;
224
+ let portal = runtime. block_on ( client. bind ( & statement, & [ ] ) ) . unwrap ( ) ;
225
+
226
+ let f1 = client. query_portal ( & portal, 2 ) . collect ( ) ;
227
+ let f2 = client. query_portal ( & portal, 2 ) . collect ( ) ;
228
+ let f3 = client. query_portal ( & portal, 2 ) . collect ( ) ;
229
+ let ( r1, r2, r3) = runtime. block_on ( f1. join3 ( f2, f3) ) . unwrap ( ) ;
230
+
231
+ assert_eq ! ( r1. len( ) , 2 ) ;
232
+ assert_eq ! ( r1[ 0 ] . get:: <_, i32 >( 0 ) , 1 ) ;
233
+ assert_eq ! ( r1[ 0 ] . get:: <_, & str >( 1 ) , "alice" ) ;
234
+ assert_eq ! ( r1[ 1 ] . get:: <_, i32 >( 0 ) , 2 ) ;
235
+ assert_eq ! ( r1[ 1 ] . get:: <_, & str >( 1 ) , "bob" ) ;
236
+
237
+ assert_eq ! ( r2. len( ) , 1 ) ;
238
+ assert_eq ! ( r2[ 0 ] . get:: <_, i32 >( 0 ) , 3 ) ;
239
+ assert_eq ! ( r2[ 0 ] . get:: <_, & str >( 1 ) , "charlie" ) ;
240
+
241
+ assert_eq ! ( r3. len( ) , 0 ) ;
242
+ }
243
+
201
244
#[ test]
202
245
fn cancel_query ( ) {
203
246
let _ = env_logger:: try_init ( ) ;
0 commit comments