| 587 | // manual implementation of `PartialOrd` |
| 588 | impl PartialOrd for ScalarValue { |
| 589 | fn partial_cmp(&self, other: &Self) -> Option<Ordering> { |
| 590 | use ScalarValue::*; |
| 591 | // This purposely doesn't have a catch-all "(_, _)" so that |
| 592 | // any newly added enum variant will require editing this list |
| 593 | // or else face a compile error |
| 594 | match (self, other) { |
| 595 | (Decimal32(v1, _, s1), Decimal32(v2, _, s2)) => { |
| 596 | if s1.eq(s2) { |
| 597 | // Same scale means the underlying integer values share |
| 598 | // a common interpretation regardless of declared |
| 599 | // precision (arithmetic such as `add_checked` widens |
| 600 | // precision by 1 but does not change the numeric |
| 601 | // meaning). |
| 602 | v1.partial_cmp(v2) |
| 603 | } else { |
| 604 | None |
| 605 | } |
| 606 | } |
| 607 | (Decimal32(_, _, _), _) => None, |
| 608 | (Decimal64(v1, _, s1), Decimal64(v2, _, s2)) => { |
| 609 | if s1.eq(s2) { |
| 610 | v1.partial_cmp(v2) |
| 611 | } else { |
| 612 | None |
| 613 | } |
| 614 | } |
| 615 | (Decimal64(_, _, _), _) => None, |
| 616 | (Decimal128(v1, _, s1), Decimal128(v2, _, s2)) => { |
| 617 | if s1.eq(s2) { |
| 618 | v1.partial_cmp(v2) |
| 619 | } else { |
| 620 | None |
| 621 | } |
| 622 | } |
| 623 | (Decimal128(_, _, _), _) => None, |
| 624 | (Decimal256(v1, _, s1), Decimal256(v2, _, s2)) => { |
| 625 | if s1.eq(s2) { |
| 626 | v1.partial_cmp(v2) |
| 627 | } else { |
| 628 | None |
| 629 | } |
| 630 | } |
| 631 | (Decimal256(_, _, _), _) => None, |
| 632 | (Boolean(v1), Boolean(v2)) => v1.partial_cmp(v2), |
| 633 | (Boolean(_), _) => None, |
| 634 | (Float32(v1), Float32(v2)) => match (v1, v2) { |
| 635 | (Some(f1), Some(f2)) => Some(f1.total_cmp(f2)), |
| 636 | _ => v1.partial_cmp(v2), |
| 637 | }, |
| 638 | (Float16(v1), Float16(v2)) => match (v1, v2) { |
| 639 | (Some(f1), Some(f2)) => Some(f1.total_cmp(f2)), |
| 640 | _ => v1.partial_cmp(v2), |
| 641 | }, |
| 642 | (Float32(_), _) => None, |
| 643 | (Float16(_), _) => None, |
| 644 | (Float64(v1), Float64(v2)) => match (v1, v2) { |
| 645 | (Some(f1), Some(f2)) => Some(f1.total_cmp(f2)), |
| 646 | _ => v1.partial_cmp(v2), |