@@ -20,6 +20,8 @@ use crate::BenchmarkDataset;
2020use crate :: Engine ;
2121use crate :: Format ;
2222use crate :: Target ;
23+ use crate :: datasets:: DEFAULT_BENCHMARK_RUNNER_ID ;
24+ use crate :: datasets:: normalize_benchmark_runner_id;
2325
2426/// Controls whether queries are benchmarked or explained.
2527pub enum BenchmarkMode {
@@ -66,6 +68,7 @@ pub struct BenchmarkResults {
6668pub struct SqlBenchmarkRunner {
6769 engine : Engine ,
6870 benchmark_dataset : BenchmarkDataset ,
71+ benchmark_runner : String ,
6972 storage : String ,
7073 expected_row_counts : Option < Vec < usize > > ,
7174 /// Deduplicated, preserving insertion order.
@@ -81,19 +84,23 @@ impl SqlBenchmarkRunner {
8184 pub fn new < B : Benchmark + ?Sized > (
8285 benchmark : & B ,
8386 engine : Engine ,
87+ benchmark_runner : String ,
8488 formats : impl IntoIterator < Item = Format > ,
8589 track_memory : bool ,
8690 hide_progress_bar : bool ,
8791 ) -> anyhow:: Result < Self > {
8892 let mut seen = HashSet :: new ( ) ;
8993 let formats: Vec < Format > = formats. into_iter ( ) . filter ( |f| seen. insert ( * f) ) . collect ( ) ;
9094 let storage = url_scheme_to_storage ( benchmark. data_url ( ) ) ?;
95+ let benchmark_runner = normalize_benchmark_runner_id ( & benchmark_runner) ;
96+ validate_benchmark_runner_id ( & benchmark_runner, is_ci ( ) ) ?;
9197
9298 let memory_tracker = track_memory. then ( BenchmarkMemoryTracker :: new) ;
9399
94100 Ok ( Self {
95101 engine,
96102 benchmark_dataset : benchmark. dataset ( ) ,
103+ benchmark_runner,
97104 storage,
98105 expected_row_counts : benchmark. expected_row_counts ( ) . map ( |s| s. to_vec ( ) ) ,
99106 formats,
@@ -168,6 +175,7 @@ impl SqlBenchmarkRunner {
168175 query_idx,
169176 target,
170177 benchmark_dataset : self . benchmark_dataset . clone ( ) ,
178+ benchmark_runner : self . benchmark_runner . clone ( ) ,
171179 storage : self . storage . clone ( ) ,
172180 runs,
173181 } ) ;
@@ -192,6 +200,7 @@ impl SqlBenchmarkRunner {
192200 query_idx,
193201 target,
194202 self . benchmark_dataset . clone ( ) ,
203+ self . benchmark_runner . clone ( ) ,
195204 self . storage . clone ( ) ,
196205 memory_result,
197206 ) ) ;
@@ -411,6 +420,18 @@ impl SqlBenchmarkRunner {
411420 }
412421}
413422
423+ fn is_ci ( ) -> bool {
424+ matches ! ( std:: env:: var( "CI" ) . as_deref( ) , Ok ( "true" ) )
425+ }
426+
427+ fn validate_benchmark_runner_id ( benchmark_runner : & str , is_ci : bool ) -> anyhow:: Result < ( ) > {
428+ anyhow:: ensure!(
429+ !is_ci || benchmark_runner != DEFAULT_BENCHMARK_RUNNER_ID ,
430+ "benchmark runner must not be unknown in CI; pass --runner"
431+ ) ;
432+ Ok ( ( ) )
433+ }
434+
414435pub fn export_results < W : Write > (
415436 queries : Vec < QueryMeasurement > ,
416437 memory : Vec < MemoryMeasurement > ,
@@ -460,3 +481,23 @@ pub fn filter_queries(
460481 } )
461482 . collect ( )
462483}
484+
485+ #[ cfg( test) ]
486+ mod tests {
487+ use super :: * ;
488+
489+ #[ test]
490+ fn ci_rejects_unknown_benchmark_runner ( ) {
491+ assert ! ( validate_benchmark_runner_id( "unknown" , true ) . is_err( ) ) ;
492+ }
493+
494+ #[ test]
495+ fn ci_accepts_explicit_benchmark_runner ( ) {
496+ assert ! ( validate_benchmark_runner_id( "ec2_c6id.8xlarge" , true ) . is_ok( ) ) ;
497+ }
498+
499+ #[ test]
500+ fn local_accepts_unknown_benchmark_runner ( ) {
501+ assert ! ( validate_benchmark_runner_id( "unknown" , false ) . is_ok( ) ) ;
502+ }
503+ }
0 commit comments