@@ -31,8 +31,8 @@ use itertools::Itertools;
3131use log:: Level :: Info ;
3232use log:: { info, log_enabled} ;
3333use sqllogictest:: {
34- parse_file, strict_column_validator, AsyncDB , Condition , Normalizer , Record ,
35- Validator ,
34+ parse_file, strict_column_validator, AsyncDB , Condition , MakeConnection , Normalizer ,
35+ Record , Validator ,
3636} ;
3737
3838#[ cfg( feature = "postgres" ) ]
@@ -50,6 +50,7 @@ const TEST_DIRECTORY: &str = "test_files/";
5050const DATAFUSION_TESTING_TEST_DIRECTORY : & str = "../../datafusion-testing/data/" ;
5151const PG_COMPAT_FILE_PREFIX : & str = "pg_compat_" ;
5252const SQLITE_PREFIX : & str = "sqlite" ;
53+ const ERRS_PER_FILE_LIMIT : usize = 10 ;
5354
5455pub fn main ( ) -> Result < ( ) > {
5556 tokio:: runtime:: Builder :: new_multi_thread ( )
@@ -234,15 +235,45 @@ async fn run_test_file(
234235 runner. with_column_validator ( strict_column_validator) ;
235236 runner. with_normalizer ( value_normalizer) ;
236237 runner. with_validator ( validator) ;
238+ let result = run_file_in_runner ( path, runner) . await ;
239+ pb. finish_and_clear ( ) ;
240+ result
241+ }
237242
238- let res = runner
239- . run_file_async ( path)
240- . await
241- . map_err ( |e| DataFusionError :: External ( Box :: new ( e) ) ) ;
243+ async fn run_file_in_runner < D : AsyncDB , M : MakeConnection < Conn = D > > (
244+ path : PathBuf ,
245+ mut runner : sqllogictest:: Runner < D , M > ,
246+ ) -> Result < ( ) > {
247+ let path = path. canonicalize ( ) ?;
248+ let records =
249+ parse_file ( & path) . map_err ( |e| DataFusionError :: External ( Box :: new ( e) ) ) ?;
250+ let mut errs = vec ! [ ] ;
251+ for record in records. into_iter ( ) {
252+ if let Record :: Halt { .. } = record {
253+ break ;
254+ }
255+ if let Err ( err) = runner. run_async ( record) . await {
256+ errs. push ( format ! ( "{err}" ) ) ;
257+ }
258+ }
242259
243- pb. finish_and_clear ( ) ;
260+ if !errs. is_empty ( ) {
261+ let mut msg = format ! ( "{} errors in file {}\n \n " , errs. len( ) , path. display( ) ) ;
262+ for ( i, err) in errs. iter ( ) . enumerate ( ) {
263+ if i >= ERRS_PER_FILE_LIMIT {
264+ msg. push_str ( & format ! (
265+ "... other {} errors in {} not shown ...\n \n " ,
266+ errs. len( ) - ERRS_PER_FILE_LIMIT ,
267+ path. display( )
268+ ) ) ;
269+ break ;
270+ }
271+ msg. push_str ( & format ! ( "{}. {err}\n \n " , i + 1 ) ) ;
272+ }
273+ return Err ( DataFusionError :: External ( msg. into ( ) ) ) ;
274+ }
244275
245- res
276+ Ok ( ( ) )
246277}
247278
248279fn get_record_count ( path : & PathBuf , label : String ) -> u64 {
@@ -308,14 +339,9 @@ async fn run_test_file_with_postgres(
308339 runner. with_column_validator ( strict_column_validator) ;
309340 runner. with_normalizer ( value_normalizer) ;
310341 runner. with_validator ( validator) ;
311- runner
312- . run_file_async ( path)
313- . await
314- . map_err ( |e| DataFusionError :: External ( Box :: new ( e) ) ) ?;
315-
342+ let result = run_file_in_runner ( path, runner) . await ;
316343 pb. finish_and_clear ( ) ;
317-
318- Ok ( ( ) )
344+ result
319345}
320346
321347#[ cfg( not( feature = "postgres" ) ) ]
0 commit comments