@@ -488,6 +488,20 @@ macro_rules! typed_min_max {
488
488
} } ;
489
489
}
490
490
491
+ macro_rules! typed_min_max_float {
492
+ ( $VALUE: expr, $DELTA: expr, $SCALAR: ident, $OP: ident) => { {
493
+ ScalarValue :: $SCALAR( match ( $VALUE, $DELTA) {
494
+ ( None , None ) => None ,
495
+ ( Some ( a) , None ) => Some ( * a) ,
496
+ ( None , Some ( b) ) => Some ( * b) ,
497
+ ( Some ( a) , Some ( b) ) => match a. total_cmp( b) {
498
+ choose_min_max!( $OP) => Some ( * b) ,
499
+ _ => Some ( * a) ,
500
+ } ,
501
+ } )
502
+ } } ;
503
+ }
504
+
491
505
// min/max of two scalar string values.
492
506
macro_rules! typed_min_max_string {
493
507
( $VALUE: expr, $DELTA: expr, $SCALAR: ident, $OP: ident) => { {
@@ -500,7 +514,7 @@ macro_rules! typed_min_max_string {
500
514
} } ;
501
515
}
502
516
503
- macro_rules! cmp_choose_min_max {
517
+ macro_rules! choose_min_max {
504
518
( min) => {
505
519
std:: cmp:: Ordering :: Greater
506
520
} ;
@@ -509,11 +523,10 @@ macro_rules! cmp_choose_min_max {
509
523
} ;
510
524
}
511
525
512
- // Use ScalarValue::partial_cmp to compare the values
513
- macro_rules! cmp_min_max {
526
+ macro_rules! interval_min_max {
514
527
( $OP: tt, $LHS: expr, $RHS: expr) => { {
515
528
match $LHS. partial_cmp( & $RHS) {
516
- Some ( cmp_choose_min_max !( $OP) ) => $RHS. clone( ) ,
529
+ Some ( choose_min_max !( $OP) ) => $RHS. clone( ) ,
517
530
Some ( _) => $LHS. clone( ) ,
518
531
None => {
519
532
return internal_err!( "Comparison error while computing interval min/max" )
@@ -555,11 +568,11 @@ macro_rules! min_max {
555
568
( ScalarValue :: Boolean ( lhs) , ScalarValue :: Boolean ( rhs) ) => {
556
569
typed_min_max!( lhs, rhs, Boolean , $OP)
557
570
}
558
- ( ScalarValue :: Float64 ( _ ) , ScalarValue :: Float64 ( _ ) ) => {
559
- cmp_min_max! ( $OP , $VALUE , $DELTA )
571
+ ( ScalarValue :: Float64 ( lhs ) , ScalarValue :: Float64 ( rhs ) ) => {
572
+ typed_min_max_float! ( lhs , rhs , Float64 , $OP )
560
573
}
561
- ( ScalarValue :: Float32 ( _ ) , ScalarValue :: Float32 ( _ ) ) => {
562
- cmp_min_max! ( $OP , $VALUE , $DELTA )
574
+ ( ScalarValue :: Float32 ( lhs ) , ScalarValue :: Float32 ( rhs ) ) => {
575
+ typed_min_max_float! ( lhs , rhs , Float32 , $OP )
563
576
}
564
577
( ScalarValue :: UInt64 ( lhs) , ScalarValue :: UInt64 ( rhs) ) => {
565
578
typed_min_max!( lhs, rhs, UInt64 , $OP)
@@ -691,7 +704,7 @@ macro_rules! min_max {
691
704
ScalarValue :: IntervalDayTime ( _) ,
692
705
ScalarValue :: IntervalMonthDayNano ( _) ,
693
706
) => {
694
- cmp_min_max !( $OP, $VALUE, $DELTA)
707
+ interval_min_max !( $OP, $VALUE, $DELTA)
695
708
}
696
709
(
697
710
ScalarValue :: DurationSecond ( lhs) ,
0 commit comments