@@ -39,6 +39,7 @@ const BATCH_SIZE: usize = 1000;
3939const TS_BOUND : i64 = 2_006_463_600 ;
4040const SEC_DAY : i64 = 86_400 ;
4141const DAYS_SINCE_EPOCH : i64 = TS_BOUND / SEC_DAY ;
42+ const NULL_DENSITY : f64 = 0.1 ;
4243
4344fn generate_timestamp_ns_array ( rng : & mut StdRng ) -> TimestampNanosecondArray {
4445 TimestampNanosecondArray :: from (
@@ -162,6 +163,31 @@ fn generate_duration_nanosecond_array(rng: &mut StdRng) -> DurationNanosecondArr
162163 )
163164}
164165
166+ // Durations under `i32::MAX` nanoseconds (about 2.1 seconds)
167+ fn generate_duration_nanosecond_small_array ( rng : & mut StdRng ) -> DurationNanosecondArray {
168+ DurationNanosecondArray :: from (
169+ ( 0 ..BATCH_SIZE )
170+ . map ( |_| rng. random_range ( 0 ..i32:: MAX as i64 ) )
171+ . collect :: < Vec < _ > > ( ) ,
172+ )
173+ }
174+
175+ fn generate_duration_nanosecond_array_with_nulls (
176+ rng : & mut StdRng ,
177+ ) -> DurationNanosecondArray {
178+ DurationNanosecondArray :: from (
179+ ( 0 ..BATCH_SIZE )
180+ . map ( |_| {
181+ if rng. random_bool ( NULL_DENSITY ) {
182+ None
183+ } else {
184+ Some ( rng. random_range ( 0 ..TS_BOUND * 1_000_000_000 ) )
185+ }
186+ } )
187+ . collect :: < Vec < _ > > ( ) ,
188+ )
189+ }
190+
165191fn bench_date_part (
166192 c : & mut Criterion ,
167193 udf : & Arc < ScalarUDF > ,
@@ -213,6 +239,10 @@ fn criterion_benchmark(c: &mut Criterion) {
213239 let duration_ns = Arc :: new ( generate_duration_nanosecond_array ( & mut rng) ) as ArrayRef ;
214240 let date32 = Arc :: new ( generate_date32_array ( & mut rng) ) as ArrayRef ;
215241 let date64 = Arc :: new ( generate_date64_array ( & mut rng) ) as ArrayRef ;
242+ let duration_ns_small =
243+ Arc :: new ( generate_duration_nanosecond_small_array ( & mut rng) ) as ArrayRef ;
244+ let duration_ns_nulls =
245+ Arc :: new ( generate_duration_nanosecond_array_with_nulls ( & mut rng) ) as ArrayRef ;
216246
217247 let udf = date_part ( ) ;
218248
@@ -322,6 +352,8 @@ fn criterion_benchmark(c: &mut Criterion) {
322352 ( "interval_dt" , & interval_dt) ,
323353 ( "interval_mdn" , & interval_mdn) ,
324354 ( "duration_ns" , & duration_ns) ,
355+ ( "duration_ns_small" , & duration_ns_small) ,
356+ ( "duration_ns_nulls" , & duration_ns_nulls) ,
325357 ] {
326358 bench_date_part (
327359 c,
0 commit comments