@@ -905,34 +905,53 @@ async fn query_typed_one() {
905
905
. batch_execute (
906
906
"
907
907
CREATE TEMPORARY TABLE foo (
908
- name TEXT
908
+ name TEXT,
909
+ age INT
909
910
);
910
- INSERT INTO foo (name) VALUES ('alice'), ('bob'), ('carol');
911
+ INSERT INTO foo (name, age ) VALUES ('alice', 20 ), ('bob', 30 ), ('carol', 40 );
911
912
" ,
912
913
)
913
914
. await
914
915
. unwrap ( ) ;
915
916
916
- client
917
+ // should return exactly one row
918
+ let row = client
917
919
. query_typed_one (
918
- "SELECT* FROM foo WHERE name = $1" ,
919
- & [ ( & "dave " , Type :: TEXT ) ] ,
920
+ "SELECTname, age FROM foo WHERE name = $1 AND age = $2 " ,
921
+ & [ ( & "alice " , Type :: TEXT ) , ( & 20i32 , Type :: INT4 ) ] ,
920
922
)
921
923
. await
922
- . err ( )
923
924
. unwrap ( ) ;
925
+
926
+ assert_eq ! ( row. get:: <_, & str >( 0 ) , "alice" ) ;
927
+ assert_eq ! ( row. get:: <_, i32 >( 1 ) , 20 ) ;
928
+
929
+ // dave doesn't exist, hence should return no row
924
930
client
925
931
. query_typed_one (
926
932
"SELECT * FROM foo WHERE name = $1" ,
927
- & [ ( & "alice " , Type :: TEXT ) ] ,
933
+ & [ ( & "dave " , Type :: TEXT ) ] ,
928
934
)
929
935
. await
936
+ . err ( )
930
937
. unwrap ( ) ;
938
+
939
+ // should return error if the number of rows returned is not exactly one or zero
931
940
client
932
941
. query_typed_one ( "SELECT * FROM foo" , & [ ] )
933
942
. await
934
943
. err ( )
935
944
. unwrap ( ) ;
945
+
946
+ // should be none because no row is returned
947
+ client
948
+ . query_typed_one (
949
+ "INSERT INTO foo (name, age) VALUES ($1, $2)" ,
950
+ & [ ( & "dave" , Type :: TEXT ) , ( & 45i32 , Type :: INT4 ) ] ,
951
+ )
952
+ . await
953
+ . err ( )
954
+ . unwrap ( ) ;
936
955
}
937
956
938
957
#[ tokio:: test]
@@ -967,6 +986,7 @@ async fn query_opt() {
967
986
. err ( )
968
987
. unwrap ( ) ;
969
988
}
989
+
970
990
#[ tokio:: test]
971
991
async fn query_typed_opt ( ) {
972
992
let client =connect ( "user=postgres" ) . await ;
@@ -975,35 +995,54 @@ async fn query_typed_opt() {
975
995
. batch_execute (
976
996
"
977
997
CREATE TEMPORARY TABLE foo (
978
- name TEXT
998
+ name TEXT,
999
+ age INT
979
1000
);
980
- INSERT INTO foo (name) VALUES ('alice'), ('bob'), ('carol');
1001
+ INSERT INTO foo (name, age ) VALUES ('alice', 20 ), ('bob', 30 ), ('carol', 40 );
981
1002
" ,
982
1003
)
983
1004
. await
984
1005
. unwrap ( ) ;
985
1006
986
- assert ! ( client
1007
+ // should return exactly one row
1008
+ let row = client
987
1009
. query_typed_opt (
988
- "SELECT* FROM foo WHERE name = $1" ,
989
- & [ ( & "dave " , Type :: TEXT ) ]
1010
+ "SELECTname, age FROM foo WHERE name = $1 AND age = $2 " ,
1011
+ & [ ( & "alice " , Type :: TEXT ) , ( & 20i32 , Type :: INT4 ) ] ,
990
1012
)
991
1013
. await
992
1014
. unwrap ( )
993
- . is_none( ) ) ;
994
- client
1015
+ . unwrap ( ) ;
1016
+
1017
+ assert_eq ! ( row. get:: <_, & str >( 0 ) , "alice" ) ;
1018
+ assert_eq ! ( row. get:: <_, i32 >( 1 ) , 20 ) ;
1019
+
1020
+ // dave doesn't exist, hence should return no row
1021
+ assert ! ( client
995
1022
. query_typed_opt(
996
1023
"SELECT * FROM foo WHERE name = $1" ,
997
- & [ ( & "alice " , Type :: TEXT ) ] ,
1024
+ & [ ( & "dave " , Type :: TEXT ) ]
998
1025
)
999
1026
. await
1000
1027
. unwrap( )
1001
- . unwrap ( ) ;
1028
+ . is_none( ) ) ;
1029
+
1030
+ // should return error if the number of rows returned is not exactly one or zero
1002
1031
client
1003
- . query_typed_one ( "SELECT * FROM foo" , & [ ] )
1032
+ . query_typed_opt ( "SELECT * FROM foo" , & [ ] )
1004
1033
. await
1005
1034
. err ( )
1006
1035
. unwrap ( ) ;
1036
+
1037
+ // should be none because no row is returned
1038
+ assert ! ( client
1039
+ . query_typed_opt(
1040
+ "INSERT INTO foo (name, age) VALUES ($1, $2)" ,
1041
+ & [ ( & "dave" , Type :: TEXT ) , ( & 45i32 , Type :: INT4 ) ] ,
1042
+ )
1043
+ . await
1044
+ . unwrap( )
1045
+ . is_none( ) ) ;
1007
1046
}
1008
1047
1009
1048
#[ tokio:: test]