@@ -187,11 +187,11 @@ impl ScalarUDFImpl for DateBinFunc {
187
187
}
188
188
}
189
189
190
- fn invoke_batch (
190
+ fn invoke_with_args (
191
191
& self ,
192
- args : & [ ColumnarValue ] ,
193
- _number_rows : usize ,
192
+ args : datafusion_expr:: ScalarFunctionArgs ,
194
193
) -> Result < ColumnarValue > {
194
+ let args = & args. args ;
195
195
if args. len ( ) == 2 {
196
196
// Default to unix EPOCH
197
197
let origin = ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond (
@@ -514,10 +514,9 @@ mod tests {
514
514
use chrono:: TimeDelta ;
515
515
516
516
#[ test]
517
- #[ allow( deprecated) ] // TODO migrate UDF invoke from invoke_batch
518
517
fn test_date_bin ( ) {
519
- let res = DateBinFunc :: new ( ) . invoke_batch (
520
- & [
518
+ let mut args = datafusion_expr :: ScalarFunctionArgs {
519
+ args : vec ! [
521
520
ColumnarValue :: Scalar ( ScalarValue :: IntervalDayTime ( Some (
522
521
IntervalDayTime {
523
522
days: 0 ,
@@ -527,14 +526,16 @@ mod tests {
527
526
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
528
527
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
529
528
] ,
530
- 1 ,
531
- ) ;
529
+ number_rows : 1 ,
530
+ return_type : & DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
531
+ } ;
532
+ let res = DateBinFunc :: new ( ) . invoke_with_args ( args) ;
532
533
assert ! ( res. is_ok( ) ) ;
533
534
534
535
let timestamps = Arc :: new ( ( 1 ..6 ) . map ( Some ) . collect :: < TimestampNanosecondArray > ( ) ) ;
535
536
let batch_len = timestamps. len ( ) ;
536
- let res = DateBinFunc :: new ( ) . invoke_batch (
537
- & [
537
+ args = datafusion_expr :: ScalarFunctionArgs {
538
+ args : vec ! [
538
539
ColumnarValue :: Scalar ( ScalarValue :: IntervalDayTime ( Some (
539
540
IntervalDayTime {
540
541
days: 0 ,
@@ -544,12 +545,14 @@ mod tests {
544
545
ColumnarValue :: Array ( timestamps) ,
545
546
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
546
547
] ,
547
- batch_len,
548
- ) ;
548
+ number_rows : batch_len,
549
+ return_type : & DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
550
+ } ;
551
+ let res = DateBinFunc :: new ( ) . invoke_with_args ( args) ;
549
552
assert ! ( res. is_ok( ) ) ;
550
553
551
- let res = DateBinFunc :: new ( ) . invoke_batch (
552
- & [
554
+ args = datafusion_expr :: ScalarFunctionArgs {
555
+ args : vec ! [
553
556
ColumnarValue :: Scalar ( ScalarValue :: IntervalDayTime ( Some (
554
557
IntervalDayTime {
555
558
days: 0 ,
@@ -558,13 +561,15 @@ mod tests {
558
561
) ) ) ,
559
562
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
560
563
] ,
561
- 1 ,
562
- ) ;
564
+ number_rows : 1 ,
565
+ return_type : & DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
566
+ } ;
567
+ let res = DateBinFunc :: new ( ) . invoke_with_args ( args) ;
563
568
assert ! ( res. is_ok( ) ) ;
564
569
565
570
// stride supports month-day-nano
566
- let res = DateBinFunc :: new ( ) . invoke_batch (
567
- & [
571
+ args = datafusion_expr :: ScalarFunctionArgs {
572
+ args : vec ! [
568
573
ColumnarValue :: Scalar ( ScalarValue :: IntervalMonthDayNano ( Some (
569
574
IntervalMonthDayNano {
570
575
months: 0 ,
@@ -575,46 +580,53 @@ mod tests {
575
580
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
576
581
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
577
582
] ,
578
- 1 ,
579
- ) ;
583
+ number_rows : 1 ,
584
+ return_type : & DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
585
+ } ;
586
+ let res = DateBinFunc :: new ( ) . invoke_with_args ( args) ;
580
587
assert ! ( res. is_ok( ) ) ;
581
588
582
589
//
583
590
// Fallible test cases
584
591
//
585
592
586
593
// invalid number of arguments
587
- let res = DateBinFunc :: new ( ) . invoke_batch (
588
- & [ ColumnarValue :: Scalar ( ScalarValue :: IntervalDayTime ( Some (
594
+ args = datafusion_expr :: ScalarFunctionArgs {
595
+ args : vec ! [ ColumnarValue :: Scalar ( ScalarValue :: IntervalDayTime ( Some (
589
596
IntervalDayTime {
590
597
days: 0 ,
591
598
milliseconds: 1 ,
592
599
} ,
593
600
) ) ) ] ,
594
- 1 ,
595
- ) ;
601
+ number_rows : 1 ,
602
+ return_type : & DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
603
+ } ;
604
+ let res = DateBinFunc :: new ( ) . invoke_with_args ( args) ;
596
605
assert_eq ! (
597
606
res. err( ) . unwrap( ) . strip_backtrace( ) ,
598
607
"Execution error: DATE_BIN expected two or three arguments"
599
608
) ;
600
609
601
610
// stride: invalid type
602
- let res = DateBinFunc :: new ( ) . invoke_batch (
603
- & [
611
+ args = datafusion_expr :: ScalarFunctionArgs {
612
+ args : vec ! [
604
613
ColumnarValue :: Scalar ( ScalarValue :: IntervalYearMonth ( Some ( 1 ) ) ) ,
605
614
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
606
615
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
607
616
] ,
608
- 1 ,
609
- ) ;
617
+ number_rows : 1 ,
618
+ return_type : & DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
619
+ } ;
620
+ let res = DateBinFunc :: new ( ) . invoke_with_args ( args) ;
610
621
assert_eq ! (
611
622
res. err( ) . unwrap( ) . strip_backtrace( ) ,
612
623
"Execution error: DATE_BIN expects stride argument to be an INTERVAL but got Interval(YearMonth)"
613
624
) ;
614
625
615
626
// stride: invalid value
616
- let res = DateBinFunc :: new ( ) . invoke_batch (
617
- & [
627
+
628
+ args = datafusion_expr:: ScalarFunctionArgs {
629
+ args : vec ! [
618
630
ColumnarValue :: Scalar ( ScalarValue :: IntervalDayTime ( Some (
619
631
IntervalDayTime {
620
632
days: 0 ,
@@ -624,60 +636,69 @@ mod tests {
624
636
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
625
637
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
626
638
] ,
627
- 1 ,
628
- ) ;
639
+ number_rows : 1 ,
640
+ return_type : & DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
641
+ } ;
642
+
643
+ let res = DateBinFunc :: new ( ) . invoke_with_args ( args) ;
629
644
assert_eq ! (
630
645
res. err( ) . unwrap( ) . strip_backtrace( ) ,
631
646
"Execution error: DATE_BIN stride must be non-zero"
632
647
) ;
633
648
634
649
// stride: overflow of day-time interval
635
- let res = DateBinFunc :: new ( ) . invoke_batch (
636
- & [
650
+ args = datafusion_expr :: ScalarFunctionArgs {
651
+ args : vec ! [
637
652
ColumnarValue :: Scalar ( ScalarValue :: IntervalDayTime ( Some (
638
653
IntervalDayTime :: MAX ,
639
654
) ) ) ,
640
655
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
641
656
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
642
657
] ,
643
- 1 ,
644
- ) ;
658
+ number_rows : 1 ,
659
+ return_type : & DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
660
+ } ;
661
+ let res = DateBinFunc :: new ( ) . invoke_with_args ( args) ;
645
662
assert_eq ! (
646
663
res. err( ) . unwrap( ) . strip_backtrace( ) ,
647
664
"Execution error: DATE_BIN stride argument is too large"
648
665
) ;
649
666
650
667
// stride: overflow of month-day-nano interval
651
- let res = DateBinFunc :: new ( ) . invoke_batch (
652
- & [
668
+ args = datafusion_expr :: ScalarFunctionArgs {
669
+ args : vec ! [
653
670
ColumnarValue :: Scalar ( ScalarValue :: new_interval_mdn( 0 , i32 :: MAX , 1 ) ) ,
654
671
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
655
672
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
656
673
] ,
657
- 1 ,
658
- ) ;
674
+ number_rows : 1 ,
675
+ return_type : & DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
676
+ } ;
677
+ let res = DateBinFunc :: new ( ) . invoke_with_args ( args) ;
659
678
assert_eq ! (
660
679
res. err( ) . unwrap( ) . strip_backtrace( ) ,
661
680
"Execution error: DATE_BIN stride argument is too large"
662
681
) ;
663
682
664
683
// stride: month intervals
665
- let res = DateBinFunc :: new ( ) . invoke_batch (
666
- & [
684
+ args = datafusion_expr :: ScalarFunctionArgs {
685
+ args : vec ! [
667
686
ColumnarValue :: Scalar ( ScalarValue :: new_interval_mdn( 1 , 1 , 1 ) ) ,
668
687
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
669
688
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
670
689
] ,
671
- 1 ,
672
- ) ;
690
+ number_rows : 1 ,
691
+ return_type : & DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
692
+ } ;
693
+ let res = DateBinFunc :: new ( ) . invoke_with_args ( args) ;
673
694
assert_eq ! (
674
695
res. err( ) . unwrap( ) . strip_backtrace( ) ,
675
696
"This feature is not implemented: DATE_BIN stride does not support combination of month, day and nanosecond intervals"
676
697
) ;
677
698
678
699
// origin: invalid type
679
- let res = DateBinFunc :: new ( ) . invoke_batch (
680
- & [
700
+ args = datafusion_expr :: ScalarFunctionArgs {
701
+ args : vec ! [
681
702
ColumnarValue :: Scalar ( ScalarValue :: IntervalDayTime ( Some (
682
703
IntervalDayTime {
683
704
days: 0 ,
@@ -687,15 +708,17 @@ mod tests {
687
708
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
688
709
ColumnarValue :: Scalar ( ScalarValue :: TimestampMicrosecond ( Some ( 1 ) , None ) ) ,
689
710
] ,
690
- 1 ,
691
- ) ;
711
+ number_rows : 1 ,
712
+ return_type : & DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
713
+ } ;
714
+ let res = DateBinFunc :: new ( ) . invoke_with_args ( args) ;
692
715
assert_eq ! (
693
716
res. err( ) . unwrap( ) . strip_backtrace( ) ,
694
717
"Execution error: DATE_BIN expects origin argument to be a TIMESTAMP with nanosecond precision but got Timestamp(Microsecond, None)"
695
718
) ;
696
719
697
- let res = DateBinFunc :: new ( ) . invoke_batch (
698
- & [
720
+ args = datafusion_expr :: ScalarFunctionArgs {
721
+ args : vec ! [
699
722
ColumnarValue :: Scalar ( ScalarValue :: IntervalDayTime ( Some (
700
723
IntervalDayTime {
701
724
days: 0 ,
@@ -705,8 +728,10 @@ mod tests {
705
728
ColumnarValue :: Scalar ( ScalarValue :: TimestampMicrosecond ( Some ( 1 ) , None ) ) ,
706
729
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
707
730
] ,
708
- 1 ,
709
- ) ;
731
+ number_rows : 1 ,
732
+ return_type : & DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
733
+ } ;
734
+ let res = DateBinFunc :: new ( ) . invoke_with_args ( args) ;
710
735
assert ! ( res. is_ok( ) ) ;
711
736
712
737
// unsupported array type for stride
@@ -720,14 +745,16 @@ mod tests {
720
745
} )
721
746
. collect :: < IntervalDayTimeArray > ( ) ,
722
747
) ;
723
- let res = DateBinFunc :: new ( ) . invoke_batch (
724
- & [
748
+ args = datafusion_expr :: ScalarFunctionArgs {
749
+ args : vec ! [
725
750
ColumnarValue :: Array ( intervals) ,
726
751
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
727
752
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
728
753
] ,
729
- 1 ,
730
- ) ;
754
+ number_rows : 1 ,
755
+ return_type : & DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
756
+ } ;
757
+ let res = DateBinFunc :: new ( ) . invoke_with_args ( args) ;
731
758
assert_eq ! (
732
759
res. err( ) . unwrap( ) . strip_backtrace( ) ,
733
760
"This feature is not implemented: DATE_BIN only supports literal values for the stride argument, not arrays"
@@ -736,8 +763,8 @@ mod tests {
736
763
// unsupported array type for origin
737
764
let timestamps = Arc :: new ( ( 1 ..6 ) . map ( Some ) . collect :: < TimestampNanosecondArray > ( ) ) ;
738
765
let batch_len = timestamps. len ( ) ;
739
- let res = DateBinFunc :: new ( ) . invoke_batch (
740
- & [
766
+ args = datafusion_expr :: ScalarFunctionArgs {
767
+ args : vec ! [
741
768
ColumnarValue :: Scalar ( ScalarValue :: IntervalDayTime ( Some (
742
769
IntervalDayTime {
743
770
days: 0 ,
@@ -747,8 +774,10 @@ mod tests {
747
774
ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond ( Some ( 1 ) , None ) ) ,
748
775
ColumnarValue :: Array ( timestamps) ,
749
776
] ,
750
- batch_len,
751
- ) ;
777
+ number_rows : batch_len,
778
+ return_type : & DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
779
+ } ;
780
+ let res = DateBinFunc :: new ( ) . invoke_with_args ( args) ;
752
781
assert_eq ! (
753
782
res. err( ) . unwrap( ) . strip_backtrace( ) ,
754
783
"This feature is not implemented: DATE_BIN only supports literal values for the origin argument, not arrays"
@@ -864,20 +893,22 @@ mod tests {
864
893
. collect :: < TimestampNanosecondArray > ( )
865
894
. with_timezone_opt ( tz_opt. clone ( ) ) ;
866
895
let batch_len = input. len ( ) ;
867
- #[ allow( deprecated) ] // TODO migrate UDF invoke to invoke_batch
868
- let result = DateBinFunc :: new ( )
869
- . invoke_batch (
870
- & [
871
- ColumnarValue :: Scalar ( ScalarValue :: new_interval_dt ( 1 , 0 ) ) ,
872
- ColumnarValue :: Array ( Arc :: new ( input) ) ,
873
- ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond (
874
- Some ( string_to_timestamp_nanos ( origin) . unwrap ( ) ) ,
875
- tz_opt. clone ( ) ,
876
- ) ) ,
877
- ] ,
878
- batch_len,
879
- )
880
- . unwrap ( ) ;
896
+ let args = datafusion_expr:: ScalarFunctionArgs {
897
+ args : vec ! [
898
+ ColumnarValue :: Scalar ( ScalarValue :: new_interval_dt( 1 , 0 ) ) ,
899
+ ColumnarValue :: Array ( Arc :: new( input) ) ,
900
+ ColumnarValue :: Scalar ( ScalarValue :: TimestampNanosecond (
901
+ Some ( string_to_timestamp_nanos( origin) . unwrap( ) ) ,
902
+ tz_opt. clone( ) ,
903
+ ) ) ,
904
+ ] ,
905
+ number_rows : batch_len,
906
+ return_type : & DataType :: Timestamp (
907
+ TimeUnit :: Nanosecond ,
908
+ tz_opt. clone ( ) ,
909
+ ) ,
910
+ } ;
911
+ let result = DateBinFunc :: new ( ) . invoke_with_args ( args) . unwrap ( ) ;
881
912
if let ColumnarValue :: Array ( result) = result {
882
913
assert_eq ! (
883
914
result. data_type( ) ,
0 commit comments