@@ -765,10 +765,8 @@ impl Session<PgResponseStream> for SessionImpl {
765
765
format : bool ,
766
766
) -> std:: result:: Result < PgResponse < PgResponseStream > , BoxedError > {
767
767
// Parse sql.
768
- let mut stmts = Parser :: parse_sql ( sql) . map_err ( |e| {
769
- tracing:: error!( "failed to parse sql:\n {}:\n {}" , sql, e) ;
770
- e
771
- } ) ?;
768
+ let mut stmts = Parser :: parse_sql ( sql)
769
+ . inspect_err ( |e| tracing:: error!( "failed to parse sql:\n {}:\n {}" , sql, e) ) ?;
772
770
if stmts. is_empty ( ) {
773
771
return Ok ( PgResponse :: empty_result (
774
772
pgwire:: pg_response:: StatementType :: EMPTY ,
@@ -781,10 +779,25 @@ impl Session<PgResponseStream> for SessionImpl {
781
779
) ) ;
782
780
}
783
781
let stmt = stmts. swap_remove ( 0 ) ;
784
- let rsp = handle ( self , stmt, sql, format) . await . map_err ( |e| {
785
- tracing:: error!( "failed to handle sql:\n {}:\n {}" , sql, e) ;
786
- e
787
- } ) ?;
782
+ let rsp = {
783
+ let mut handle_fut = Box :: pin ( handle ( self , stmt, sql, format) ) ;
784
+ if cfg ! ( debug_assertions) {
785
+ // Report the SQL in the log periodically if the query is slow.
786
+ const SLOW_QUERY_LOG_PERIOD : Duration = Duration :: from_secs ( 60 ) ;
787
+ loop {
788
+ match tokio:: time:: timeout ( SLOW_QUERY_LOG_PERIOD , & mut handle_fut) . await {
789
+ Ok ( result) => break result,
790
+ Err ( _) => tracing:: warn!(
791
+ sql,
792
+ "slow query has been running for another {SLOW_QUERY_LOG_PERIOD:?}"
793
+ ) ,
794
+ }
795
+ }
796
+ } else {
797
+ handle_fut. await
798
+ }
799
+ }
800
+ . inspect_err ( |e| tracing:: error!( "failed to handle sql:\n {}:\n {}" , sql, e) ) ?;
788
801
Ok ( rsp)
789
802
}
790
803
@@ -793,10 +806,8 @@ impl Session<PgResponseStream> for SessionImpl {
793
806
sql : & str ,
794
807
) -> std:: result:: Result < Vec < PgFieldDescriptor > , BoxedError > {
795
808
// Parse sql.
796
- let mut stmts = Parser :: parse_sql ( sql) . map_err ( |e| {
797
- tracing:: error!( "failed to parse sql:\n {}:\n {}" , sql, e) ;
798
- e
799
- } ) ?;
809
+ let mut stmts = Parser :: parse_sql ( sql)
810
+ . inspect_err ( |e| tracing:: error!( "failed to parse sql:\n {}:\n {}" , sql, e) ) ?;
800
811
if stmts. is_empty ( ) {
801
812
return Ok ( vec ! [ ] ) ;
802
813
}
@@ -810,10 +821,8 @@ impl Session<PgResponseStream> for SessionImpl {
810
821
// This part refers from src/frontend/handler/ so the Vec<PgFieldDescriptor> is same as
811
822
// result of run_statement().
812
823
let rsp = match stmt {
813
- Statement :: Query ( _) => infer ( self , stmt, sql) . map_err ( |e| {
814
- tracing:: error!( "failed to handle sql:\n {}:\n {}" , sql, e) ;
815
- e
816
- } ) ?,
824
+ Statement :: Query ( _) => infer ( self , stmt, sql)
825
+ . inspect_err ( |e| tracing:: error!( "failed to handle sql:\n {}:\n {}" , sql, e) ) ?,
817
826
Statement :: ShowObjects ( show_object) => match show_object {
818
827
ShowObject :: Columns { table : _ } => {
819
828
vec ! [
0 commit comments