@@ -354,6 +354,24 @@ impl Connection {
354354 Ok ( prepared_statement)
355355 }
356356
357+ async fn reprepare (
358+ & self ,
359+ query : impl Into < Query > ,
360+ previous_prepared : & PreparedStatement ,
361+ ) -> Result < ( ) , QueryError > {
362+ let reprepare_query: Query = query. into ( ) ;
363+ let reprepared = self . prepare ( & reprepare_query) . await ?;
364+ // Reprepared statement should keep its id - it's the md5 sum
365+ // of statement contents
366+ if reprepared. get_id ( ) != previous_prepared. get_id ( ) {
367+ Err ( QueryError :: ProtocolError (
368+ "Prepared statement Id changed, md5 sum should stay the same" ,
369+ ) )
370+ } else {
371+ Ok ( ( ) )
372+ }
373+ }
374+
357375 pub async fn authenticate_response (
358376 & self ,
359377 username : Option < String > ,
@@ -550,27 +568,20 @@ impl Connection {
550568 . send_request ( & execute_frame, true , prepared_statement. config . tracing )
551569 . await ?;
552570
553- if let Response :: Error ( err) = & query_response. response {
554- if let DbError :: Unprepared { statement_id } = & err. error {
571+ match & query_response. response {
572+ Response :: Error ( frame:: response:: Error {
573+ error : DbError :: Unprepared { statement_id } ,
574+ ..
575+ } ) => {
555576 debug ! ( "Connection::execute: Got DbError::Unprepared - repreparing statement with id {:?}" , statement_id) ;
556577 // Repreparation of a statement is needed
557- let reprepare_query: Query = prepared_statement. get_statement ( ) . into ( ) ;
558- let reprepared = self . prepare ( & reprepare_query) . await ?;
559- // Reprepared statement should keep its id - it's the md5 sum
560- // of statement contents
561- if reprepared. get_id ( ) != prepared_statement. get_id ( ) {
562- return Err ( QueryError :: ProtocolError (
563- "Prepared statement Id changed, md5 sum should stay the same" ,
564- ) ) ;
565- }
566-
567- return self
568- . send_request ( & execute_frame, true , prepared_statement. config . tracing )
569- . await ;
578+ self . reprepare ( prepared_statement. get_statement ( ) , prepared_statement)
579+ . await ?;
580+ self . send_request ( & execute_frame, true , prepared_statement. config . tracing )
581+ . await
570582 }
583+ _ => Ok ( query_response) ,
571584 }
572-
573- Ok ( query_response)
574585 }
575586
576587 /// Performs execute_single_page multiple times to fetch all available pages
@@ -673,13 +684,7 @@ impl Connection {
673684 _ => None ,
674685 } ) ;
675686 if let Some ( p) = prepared_statement {
676- let reprepare_query: Query = p. get_statement ( ) . into ( ) ;
677- let reprepared = self . prepare ( & reprepare_query) . await ?;
678- if reprepared. get_id ( ) != p. get_id ( ) {
679- return Err ( QueryError :: ProtocolError (
680- "Prepared statement Id changed, md5 sum should stay the same" ,
681- ) ) ;
682- }
687+ self . reprepare ( p. get_statement ( ) , p) . await ?;
683688 continue ;
684689 } else {
685690 return Err ( QueryError :: ProtocolError (
0 commit comments