9191 if columns. is_empty ( ) {
9292 // Empty, but not yet consumed result set.
9393 self . conn . set_pending_result ( None ) ;
94- return Ok ( None ) ;
9594 } else {
9695 // Not yet consumed non-empty result set.
9796 let packet = match self . conn . read_packet ( ) . await {
@@ -106,7 +105,6 @@ where
106105 if P :: is_last_result_set_packet ( self . conn . capabilities ( ) , & packet) {
107106 // `packet` is a result set terminator.
108107 self . conn . set_pending_result ( None ) ;
109- return Ok ( None ) ;
110108 } else {
111109 // `packet` is a result set row.
112110 return Ok ( Some ( P :: read_result_set_row ( & packet, columns) ?) ) ;
@@ -118,8 +116,8 @@ where
118116 if self . conn . more_results_exists ( ) {
119117 // More data will follow.
120118 self . conn . sync_seq_id ( ) ;
121- self . conn . read_result_set :: < P > ( ) . await ?;
122- continue ;
119+ self . conn . read_result_set :: < P > ( false ) . await ?;
120+ return Ok ( None ) ;
123121 } else {
124122 // The end of a query result.
125123 return Ok ( None ) ;
@@ -329,11 +327,26 @@ where
329327
330328impl crate :: Conn {
331329 /// Will read result set and write pending result into `self` (if any).
332- pub ( crate ) async fn read_result_set < P > ( & mut self ) -> Result < ( ) >
330+ pub ( crate ) async fn read_result_set < P > ( & mut self , is_first_result_set : bool ) -> Result < ( ) >
333331 where
334332 P : Protocol ,
335333 {
336- let packet = self . read_packet ( ) . await ?;
334+ let packet = match self . read_packet ( ) . await {
335+ Ok ( packet) => packet,
336+ Err ( err @ Error :: Server ( _) ) if is_first_result_set => {
337+ // shortcut to emit an error right to the caller of a query/execute
338+ return Err ( err) ;
339+ }
340+ Err ( Error :: Server ( error) ) => {
341+ // error will be consumed as a part of a multi-result set
342+ self . set_pending_result ( Some ( ResultSetMeta :: Error ( error) ) ) ;
343+ return Ok ( ( ) ) ;
344+ }
345+ Err ( err) => {
346+ // non-server errors are fatal
347+ return Err ( err) ;
348+ }
349+ } ;
337350
338351 match packet. get ( 0 ) {
339352 Some ( 0x00 ) => self . set_pending_result ( Some ( P :: result_set_meta ( Arc :: from (
0 commit comments