@@ -76,6 +76,7 @@ use url::Url;
7676pub use error:: { Error , ConnectError , SqlState , DbError , ErrorPosition } ;
7777#[ doc( inline) ]
7878pub use types:: { Oid , Type , Kind , ToSql , FromSql } ;
79+ use types:: IsNull ;
7980#[ doc( inline) ]
8081pub use types:: Slice ;
8182use io:: { InternalStream , Timeout } ;
@@ -727,12 +728,17 @@ impl InnerConnection {
727728 }
728729
729730 // Ew @ doing this manually :(
731+ let mut buf = vec ! [ ] ;
732+ let value = match try!( oid. to_sql_checked ( & Type :: Oid , & mut buf) ) {
733+ IsNull :: Yes => None ,
734+ IsNull :: No => Some ( buf) ,
735+ } ;
730736 try!( self . write_messages ( & [
731737 Bind {
732738 portal : "" ,
733739 statement : TYPEINFO_QUERY ,
734740 formats : & [ 1 ] ,
735- values : & [ try! ( oid . to_sql ( & Type :: Oid ) ) ] ,
741+ values : & [ value ] ,
736742 result_formats : & [ 1 ]
737743 } ,
738744 Execute {
@@ -1319,7 +1325,11 @@ impl<'conn> Statement<'conn> {
13191325 params. len( ) ) ;
13201326 let mut values = vec ! [ ] ;
13211327 for ( param, ty) in params. iter ( ) . zip ( self . param_types . iter ( ) ) {
1322- values. push ( try!( param. to_sql ( ty) ) ) ;
1328+ let mut buf = vec ! [ ] ;
1329+ match try!( param. to_sql_checked ( ty, & mut buf) ) {
1330+ IsNull :: Yes => values. push ( None ) ,
1331+ IsNull :: No => values. push ( Some ( buf) ) ,
1332+ }
13231333 } ;
13241334
13251335 try!( conn. write_messages ( & [
@@ -2054,13 +2064,14 @@ impl<'a> CopyInStatement<'a> {
20542064 loop {
20552065 match ( row. next ( ) , types. next ( ) ) {
20562066 ( Some ( val) , Some ( ty) ) => {
2057- match val. to_sql ( ty) {
2058- Ok ( None ) => {
2067+ let mut inner_buf = vec ! [ ] ;
2068+ match val. to_sql_checked ( ty, & mut inner_buf) {
2069+ Ok ( IsNull :: Yes ) => {
20592070 let _ = buf. write_be_i32 ( -1 ) ;
20602071 }
2061- Ok ( Some ( val ) ) => {
2062- let _ = buf. write_be_i32 ( val . len ( ) as i32 ) ;
2063- let _ = buf. write_all ( & val ) ;
2072+ Ok ( IsNull :: No ) => {
2073+ let _ = buf. write_be_i32 ( inner_buf . len ( ) as i32 ) ;
2074+ let _ = buf. write_all ( & inner_buf ) ;
20642075 }
20652076 Err ( err) => {
20662077 // FIXME this is not the right way to handle this
0 commit comments