@@ -74,6 +74,7 @@ use std::cell::{Cell, RefCell};
7474use std:: collections:: { RingBuf , HashMap } ;
7575use std:: io:: { BufferedStream , IoResult } ;
7676use std:: io:: net:: ip:: Port ;
77+ use std:: iter:: IteratorCloneExt ;
7778use std:: mem;
7879use std:: fmt;
7980use std:: result;
@@ -512,9 +513,13 @@ impl InnerConnection {
512513
513514 try!( self . wait_for_ready ( ) ) ;
514515
515- // now that the connection is ready again, get unknown type names
516- try!( self . set_type_names ( param_types. iter_mut ( ) ) ) ;
517- try!( self . set_type_names ( result_desc. iter_mut ( ) . map ( |d| & mut d. ty ) ) ) ;
516+ // now that the connection is ready again, get unknown type names,
517+ // but not if stmt_name is "" since that'll blow away the statement
518+ // and we don't care about result values anyway
519+ if stmt_name != "" {
520+ try!( self . set_type_names ( param_types. iter_mut ( ) ) ) ;
521+ try!( self . set_type_names ( result_desc. iter_mut ( ) . map ( |d| & mut d. ty ) ) ) ;
522+ }
518523
519524 Ok ( ( param_types, result_desc) )
520525 }
@@ -542,15 +547,15 @@ impl InnerConnection {
542547 -> Result < CopyInStatement < ' a > > {
543548 let mut query = vec ! [ ] ;
544549 let _ = write ! ( & mut query, "SELECT " ) ;
545- let _ = util:: comma_join ( & mut query, rows. iter ( ) . map ( | & e| e ) ) ;
550+ let _ = util:: comma_join ( & mut query, rows. iter ( ) . cloned ( ) ) ;
546551 let _ = write ! ( & mut query, " FROM {}" , table) ;
547552 let query = String :: from_utf8 ( query) . unwrap ( ) ;
548553 let ( _, result_desc) = try!( self . raw_prepare ( "" , query[ ] ) ) ;
549554 let column_types = result_desc. into_iter ( ) . map ( |desc| desc. ty ) . collect ( ) ;
550555
551556 let mut query = vec ! [ ] ;
552557 let _ = write ! ( & mut query, "COPY {} (" , table) ;
553- let _ = util:: comma_join ( & mut query, rows. iter ( ) . map ( | & e| e ) ) ;
558+ let _ = util:: comma_join ( & mut query, rows. iter ( ) . cloned ( ) ) ;
554559 let _ = write ! ( & mut query, ") FROM STDIN WITH (FORMAT binary)" ) ;
555560 let query = String :: from_utf8 ( query) . unwrap ( ) ;
556561 let stmt_name = self . make_stmt_name ( ) ;
@@ -839,10 +844,16 @@ impl Connection {
839844 ///
840845 /// On success, returns the number of rows modified or 0 if not applicable.
841846 pub fn execute ( & self , query : & str , params : & [ & ToSql ] ) -> Result < uint > {
842- let stmt = try!( self . prepare ( query) ) ;
843- let out = try!( stmt. execute ( params) ) ;
844- try!( stmt. finish ( ) ) ;
845- Ok ( out)
847+ let ( param_types, result_desc) = try!( self . conn . borrow_mut ( ) . raw_prepare ( "" , query) ) ;
848+ let stmt = Statement {
849+ conn : self ,
850+ name : "" . into_string ( ) ,
851+ param_types : param_types,
852+ result_desc : result_desc,
853+ next_portal_id : Cell :: new ( 0 ) ,
854+ finished : true , // << !!
855+ } ;
856+ stmt. execute ( params)
846857 }
847858
848859 /// Execute a sequence of SQL statements.
@@ -988,10 +999,7 @@ impl<'conn> Transaction<'conn> {
988999
9891000 /// Like `Connection::execute`.
9901001 pub fn execute ( & self , query : & str , params : & [ & ToSql ] ) -> Result < uint > {
991- let stmt = try!( self . prepare ( query) ) ;
992- let out = try!( stmt. execute ( params) ) ;
993- try!( stmt. finish ( ) ) ;
994- Ok ( out)
1002+ self . conn . execute ( query, params)
9951003 }
9961004
9971005 /// Like `Connection::batch_execute`.
0 commit comments