This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-4.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-4.0 by this push:
     new 58502521a09 branch-4.0: [chore](code)Remove unnecessary accurate code 
and reduce template parameters #56909 (#56940)
58502521a09 is described below

commit 58502521a0984b6374ef2271188d708ce1a75fe5
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Wed Oct 15 12:38:00 2025 +0800

    branch-4.0: [chore](code)Remove unnecessary accurate code and reduce 
template parameters #56909 (#56940)
    
    Cherry-picked from #56909
    
    Co-authored-by: Mryange <[email protected]>
---
 be/src/vec/core/accurate_comparison.h              | 303 +++------------------
 be/src/vec/core/decimal_comparison.h               |   7 +-
 be/src/vec/functions/functions_comparison.h        |  82 +++---
 be/src/vec/functions/least_greast.cpp              |  37 ++-
 be/test/vec/core/accurate_comparison_test.cpp      |  63 +----
 .../data/correctness/test_compare_float.out        |   8 -
 .../suites/correctness/test_compare_float.groovy   |   2 +-
 7 files changed, 107 insertions(+), 395 deletions(-)

diff --git a/be/src/vec/core/accurate_comparison.h 
b/be/src/vec/core/accurate_comparison.h
index 0d5fd45efec..a074e2abfb6 100644
--- a/be/src/vec/core/accurate_comparison.h
+++ b/be/src/vec/core/accurate_comparison.h
@@ -20,330 +20,109 @@
 
 #pragma once
 
-#include <cmath>
-#include <limits>
-
 #include "common/compare.h"
 #include "runtime/primitive_type.h"
-#include "util/binary_cast.hpp"
-#include "vec/common/nan_utils.h"
 #include "vec/common/string_ref.h"
-#include "vec/common/uint128.h"
-#include "vec/core/decomposed_float.h"
-#include "vec/core/extended_types.h"
 #include "vec/core/types.h"
-#include "vec/runtime/vdatetime_value.h"
-/** Perceptually-correct number comparisons.
-  * Example: Int8(-1) != UInt8(255)
-*/
-
-namespace accurate {
-
-/** Cases:
-    1) Safe conversion (in case of default C++ operators)
-        a) int vs any int
-        b) uint vs any uint
-        c) float vs any float
-    2) int vs uint
-        a) sizeof(int) <= sizeof(uint). Accurate comparison with MAX_INT 
thresholds
-        b) sizeof(int)  > sizeof(uint). Casting to int
-    3) integral_type vs floating_type
-        a) sizeof(integral_type) <= 4. Comparison via casting arguments to 
Float64
-        b) sizeof(integral_type) == 8. Accurate comparison. Consider 3 sets of 
intervals:
-            1) interval between adjacent floats less or equal 1
-            2) interval between adjacent floats greater then 2
-            3) float is outside [MIN_INT64; MAX_INT64]
-*/
-
-// Case 1. Is pair of floats or pair of ints or pair of uints
-template <typename A, typename B>
-constexpr bool is_safe_conversion =
-        (std::is_floating_point_v<A> && std::is_floating_point_v<B>) ||
-        (IsIntegralV<A> && IsIntegralV<B> && !(IsSignedV<A> ^ IsSignedV<B>)) ||
-        (std::is_same_v<A, doris::vectorized::Int128> &&
-         std::is_same_v<B, doris::vectorized::Int128>) ||
-        (IsIntegralV<A> && std::is_same_v<B, doris::vectorized::Int128>) ||
-        (std::is_same_v<A, doris::vectorized::Int128> && IsIntegralV<B>);
-template <typename A, typename B>
-using bool_if_safe_conversion = std::enable_if_t<is_safe_conversion<A, B>, 
bool>;
-template <typename A, typename B>
-using bool_if_not_safe_conversion = std::enable_if_t<!is_safe_conversion<A, 
B>, bool>;
-
-/* Final realizations */
-
-template <typename A, typename B>
-bool lessOp(A a, B b) {
-    if constexpr (std::is_same_v<A, B>) {
-        return a < b;
-    }
-
-    /// float vs float
-    if constexpr (std::is_floating_point_v<A> && std::is_floating_point_v<B>) {
-        return a < b;
-    }
-
-    /// anything vs NaN
-    if (is_nan(a) || is_nan(b)) {
-        return false;
-    }
-
-    /// int vs int
-    if constexpr (IsIntegralV<A> && IsIntegralV<B>) {
-        /// same signedness
-        if constexpr (IsSignedV<A> == IsSignedV<B>) {
-            return a < b;
-        }
-
-        /// different signedness
-
-        if constexpr (IsSignedV<A> && !IsSignedV<B>) {
-            return a < 0 || static_cast<std::make_unsigned_t<A>>(a) < b;
-        }
-
-        if constexpr (!IsSignedV<A> && IsSignedV<B>) {
-            return b >= 0 && a < static_cast<std::make_unsigned_t<B>>(b);
-        }
-    }
-
-    /// int vs float
-    if constexpr (IsIntegralV<A> && std::is_floating_point_v<B>) {
-        if constexpr (sizeof(A) <= 4) {
-            return static_cast<double>(a) < static_cast<double>(b);
-        }
-
-        return DecomposedFloat<B>(b).greater(a);
-    }
-
-    if constexpr (std::is_floating_point_v<A> && IsIntegralV<B>) {
-        if constexpr (sizeof(B) <= 4) {
-            return static_cast<double>(a) < static_cast<double>(b);
-        }
-
-        return DecomposedFloat<A>(a).less(b);
-    }
-
-    static_assert(IsIntegralV<A> || std::is_floating_point_v<A>);
-    static_assert(IsIntegralV<B> || std::is_floating_point_v<B>);
-    __builtin_unreachable();
-}
-
-template <typename A, typename B>
-bool greaterOp(A a, B b) {
-    return lessOp(b, a);
-}
-
-template <typename A, typename B>
-inline bool_if_not_safe_conversion<A, B> greaterOrEqualsOp(A a, B b) {
-    if (is_nan(a) || is_nan(b)) {
-        return false;
-    }
-
-    return !lessOp(a, b);
-}
-
-template <typename A, typename B>
-inline bool_if_safe_conversion<A, B> greaterOrEqualsOp(A a, B b) {
-    return a >= b;
-}
-
-template <typename A, typename B>
-inline bool_if_not_safe_conversion<A, B> lessOrEqualsOp(A a, B b) {
-    if (is_nan(a) || is_nan(b)) {
-        return false;
-    }
-
-    return !lessOp(b, a);
-}
-
-template <typename A, typename B>
-inline bool_if_safe_conversion<A, B> lessOrEqualsOp(A a, B b) {
-    return a <= b;
-}
-
-template <typename A, typename B>
-bool equalsOp(A a, B b) {
-    if constexpr (std::is_same_v<A, B>) {
-        return a == b;
-    }
-
-    /// float vs float
-    if constexpr (std::is_floating_point_v<A> && std::is_floating_point_v<B>) {
-        return a == b;
-    }
-
-    /// anything vs NaN
-    if (is_nan(a) || is_nan(b)) {
-        return false;
-    }
-
-    /// int vs int
-    if constexpr (IsIntegralV<A> && IsIntegralV<B>) {
-        /// same signedness
-        if constexpr (IsSignedV<A> == IsSignedV<B>) {
-            return a == b;
-        }
-
-        /// different signedness
-
-        if constexpr (IsSignedV<A> && !IsSignedV<B>) {
-            return a >= 0 && static_cast<std::make_unsigned_t<A>>(a) == b;
-        }
-
-        if constexpr (!IsSignedV<A> && IsSignedV<B>) {
-            return b >= 0 && a == static_cast<std::make_unsigned_t<B>>(b);
-        }
-    }
-
-    /// int vs float
-    if constexpr (IsIntegralV<A> && std::is_floating_point_v<B>) {
-        if constexpr (sizeof(A) <= 4) {
-            return static_cast<double>(a) == static_cast<double>(b);
-        }
-
-        return DecomposedFloat<B>(b).equals(a);
-    }
-
-    if constexpr (std::is_floating_point_v<A> && IsIntegralV<B>) {
-        if constexpr (sizeof(B) <= 4) {
-            return static_cast<double>(a) == static_cast<double>(b);
-        }
-
-        return DecomposedFloat<A>(a).equals(b);
-    }
-
-    /// e.g comparing UUID with integer.
-    return false;
-}
-
-template <typename A, typename B>
-bool notEqualsOp(A a, B b) {
-    return !equalsOp(a, b);
-}
-} // namespace accurate
-
 namespace doris::vectorized {
 
-template <PrimitiveType A, PrimitiveType B>
+template <PrimitiveType PT>
+using CompareType =
+        std::conditional_t<PT == TYPE_BOOLEAN, typename 
PrimitiveTypeTraits<PT>::ColumnItemType,
+                           typename PrimitiveTypeTraits<PT>::CppNativeType>;
+
+template <PrimitiveType PT>
 struct EqualsOp {
     /// An operation that gives the same result, if arguments are passed in 
reverse order.
-    using SymmetricOp = EqualsOp<B, A>;
-    using NativeTypeA =
-            std::conditional_t<A == TYPE_BOOLEAN, typename 
PrimitiveTypeTraits<A>::ColumnItemType,
-                               typename PrimitiveTypeTraits<A>::CppNativeType>;
-    using NativeTypeB =
-            std::conditional_t<B == TYPE_BOOLEAN, typename 
PrimitiveTypeTraits<B>::ColumnItemType,
-                               typename PrimitiveTypeTraits<B>::CppNativeType>;
-    static UInt8 apply(NativeTypeA a, NativeTypeB b) { return 
Compare::equal(a, b); }
+    using SymmetricOp = EqualsOp<PT>;
+    using NativeType = CompareType<PT>;
+
+    static UInt8 apply(NativeType a, NativeType b) { return Compare::equal(a, 
b); }
 };
 
 template <>
-struct EqualsOp<TYPE_DECIMALV2, TYPE_DECIMALV2> {
+struct EqualsOp<TYPE_DECIMALV2> {
     static UInt8 apply(const Int128& a, const Int128& b) { return a == b; }
 };
 
 template <>
-struct EqualsOp<TYPE_STRING, TYPE_STRING> {
+struct EqualsOp<TYPE_STRING> {
     static UInt8 apply(const StringRef& a, const StringRef& b) { return a == 
b; }
 };
 
-template <PrimitiveType A, PrimitiveType B>
+template <PrimitiveType PT>
 struct NotEqualsOp {
-    using SymmetricOp = NotEqualsOp<B, A>;
-    using NativeTypeA =
-            std::conditional_t<A == TYPE_BOOLEAN, typename 
PrimitiveTypeTraits<A>::ColumnItemType,
-                               typename PrimitiveTypeTraits<A>::CppNativeType>;
-    using NativeTypeB =
-            std::conditional_t<B == TYPE_BOOLEAN, typename 
PrimitiveTypeTraits<B>::ColumnItemType,
-                               typename PrimitiveTypeTraits<B>::CppNativeType>;
-    static UInt8 apply(NativeTypeA a, NativeTypeB b) { return 
Compare::not_equal(a, b); }
+    using SymmetricOp = NotEqualsOp<PT>;
+    using NativeType = CompareType<PT>;
+    static UInt8 apply(NativeType a, NativeType b) { return 
Compare::not_equal(a, b); }
 };
 
 template <>
-struct NotEqualsOp<TYPE_DECIMALV2, TYPE_DECIMALV2> {
+struct NotEqualsOp<TYPE_DECIMALV2> {
     static UInt8 apply(const DecimalV2Value& a, const DecimalV2Value& b) { 
return a != b; }
 };
 
-template <PrimitiveType A, PrimitiveType B>
+template <PrimitiveType PT>
 struct GreaterOp;
 
-template <PrimitiveType A, PrimitiveType B>
+template <PrimitiveType PT>
 struct LessOp {
-    using SymmetricOp = GreaterOp<B, A>;
-    using NativeTypeA =
-            std::conditional_t<A == TYPE_BOOLEAN, typename 
PrimitiveTypeTraits<A>::ColumnItemType,
-                               typename PrimitiveTypeTraits<A>::CppNativeType>;
-    using NativeTypeB =
-            std::conditional_t<B == TYPE_BOOLEAN, typename 
PrimitiveTypeTraits<B>::ColumnItemType,
-                               typename PrimitiveTypeTraits<B>::CppNativeType>;
-    static UInt8 apply(NativeTypeA a, NativeTypeB b) { return Compare::less(a, 
b); }
+    using SymmetricOp = GreaterOp<PT>;
+    using NativeType = CompareType<PT>;
+    static UInt8 apply(NativeType a, NativeType b) { return Compare::less(a, 
b); }
 };
 
 template <>
-struct LessOp<TYPE_DECIMALV2, TYPE_DECIMALV2> {
+struct LessOp<TYPE_DECIMALV2> {
     static UInt8 apply(Int128 a, Int128 b) { return a < b; }
 };
 
 template <>
-struct LessOp<TYPE_STRING, TYPE_STRING> {
+struct LessOp<TYPE_STRING> {
     static UInt8 apply(StringRef a, StringRef b) { return a < b; }
 };
 
-template <PrimitiveType A, PrimitiveType B>
+template <PrimitiveType PT>
 struct GreaterOp {
-    using SymmetricOp = LessOp<B, A>;
-    using NativeTypeA =
-            std::conditional_t<A == TYPE_BOOLEAN, typename 
PrimitiveTypeTraits<A>::ColumnItemType,
-                               typename PrimitiveTypeTraits<A>::CppNativeType>;
-    using NativeTypeB =
-            std::conditional_t<B == TYPE_BOOLEAN, typename 
PrimitiveTypeTraits<B>::ColumnItemType,
-                               typename PrimitiveTypeTraits<B>::CppNativeType>;
-    static UInt8 apply(NativeTypeA a, NativeTypeB b) { return 
Compare::greater(a, b); }
+    using SymmetricOp = LessOp<PT>;
+    using NativeType = CompareType<PT>;
+    static UInt8 apply(NativeType a, NativeType b) { return 
Compare::greater(a, b); }
 };
 
 template <>
-struct GreaterOp<TYPE_DECIMALV2, TYPE_DECIMALV2> {
+struct GreaterOp<TYPE_DECIMALV2> {
     static UInt8 apply(Int128 a, Int128 b) { return a > b; }
 };
 
 template <>
-struct GreaterOp<TYPE_STRING, TYPE_STRING> {
+struct GreaterOp<TYPE_STRING> {
     static UInt8 apply(StringRef a, StringRef b) { return a > b; }
 };
 
-template <PrimitiveType A, PrimitiveType B>
+template <PrimitiveType PT>
 struct GreaterOrEqualsOp;
 
-template <PrimitiveType A, PrimitiveType B>
+template <PrimitiveType PT>
 struct LessOrEqualsOp {
-    using SymmetricOp = GreaterOrEqualsOp<B, A>;
-    using NativeTypeA =
-            std::conditional_t<A == TYPE_BOOLEAN, typename 
PrimitiveTypeTraits<A>::ColumnItemType,
-                               typename PrimitiveTypeTraits<A>::CppNativeType>;
-    using NativeTypeB =
-            std::conditional_t<B == TYPE_BOOLEAN, typename 
PrimitiveTypeTraits<B>::ColumnItemType,
-                               typename PrimitiveTypeTraits<B>::CppNativeType>;
-    static UInt8 apply(NativeTypeA a, NativeTypeB b) { return 
Compare::less_equal(a, b); }
+    using SymmetricOp = GreaterOrEqualsOp<PT>;
+    using NativeType = CompareType<PT>;
+    static UInt8 apply(NativeType a, NativeType b) { return 
Compare::less_equal(a, b); }
 };
 
 template <>
-struct LessOrEqualsOp<TYPE_DECIMALV2, TYPE_DECIMALV2> {
+struct LessOrEqualsOp<TYPE_DECIMALV2> {
     static UInt8 apply(DecimalV2Value a, DecimalV2Value b) { return a <= b; }
 };
 
-template <PrimitiveType A, PrimitiveType B>
+template <PrimitiveType PT>
 struct GreaterOrEqualsOp {
-    using SymmetricOp = LessOrEqualsOp<B, A>;
-    using NativeTypeA =
-            std::conditional_t<A == TYPE_BOOLEAN, typename 
PrimitiveTypeTraits<A>::ColumnItemType,
-                               typename PrimitiveTypeTraits<A>::CppNativeType>;
-    using NativeTypeB =
-            std::conditional_t<B == TYPE_BOOLEAN, typename 
PrimitiveTypeTraits<B>::ColumnItemType,
-                               typename PrimitiveTypeTraits<B>::CppNativeType>;
-    static UInt8 apply(NativeTypeA a, NativeTypeB b) { return 
Compare::greater_equal(a, b); }
+    using SymmetricOp = LessOrEqualsOp<PT>;
+    using NativeType = CompareType<PT>;
+    static UInt8 apply(NativeType a, NativeType b) { return 
Compare::greater_equal(a, b); }
 };
 
 template <>
-struct GreaterOrEqualsOp<TYPE_DECIMALV2, TYPE_DECIMALV2> {
+struct GreaterOrEqualsOp<TYPE_DECIMALV2> {
     static UInt8 apply(DecimalV2Value a, DecimalV2Value b) { return a >= b; }
 };
 
diff --git a/be/src/vec/core/decimal_comparison.h 
b/be/src/vec/core/decimal_comparison.h
index 6ba4bb6530f..8483f8fe0ef 100644
--- a/be/src/vec/core/decimal_comparison.h
+++ b/be/src/vec/core/decimal_comparison.h
@@ -71,14 +71,13 @@ struct DecCompareInt {
 };
 
 ///
-template <PrimitiveType A, PrimitiveType B,
-          template <PrimitiveType, PrimitiveType> typename Operation, bool 
_check_overflow = true,
-          bool _actual = is_decimal(A) || is_decimal(B)>
+template <PrimitiveType A, PrimitiveType B, template <PrimitiveType> typename 
Operation,
+          bool _check_overflow = true, bool _actual = is_decimal(A) || 
is_decimal(B)>
 class DecimalComparison {
 public:
     static constexpr PrimitiveType CompareIntPType = DecCompareInt<A, B>::Type;
     using CompareInt = typename 
PrimitiveTypeTraits<CompareIntPType>::CppNativeType;
-    using Op = Operation<CompareIntPType, CompareIntPType>;
+    using Op = Operation<CompareIntPType>;
     using ColVecA = typename PrimitiveTypeTraits<A>::ColumnType;
     using ColVecB = typename PrimitiveTypeTraits<B>::ColumnType;
     using ArrayA = typename ColVecA::Container;
diff --git a/be/src/vec/functions/functions_comparison.h 
b/be/src/vec/functions/functions_comparison.h
index 70e51ab98a4..da740f59211 100644
--- a/be/src/vec/functions/functions_comparison.h
+++ b/be/src/vec/functions/functions_comparison.h
@@ -238,11 +238,11 @@ struct StringEqualsImpl {
     }
 };
 
-template <PrimitiveType A, PrimitiveType B>
-struct StringComparisonImpl<EqualsOp<A, B>> : StringEqualsImpl<true> {};
+template <PrimitiveType PT>
+struct StringComparisonImpl<EqualsOp<PT>> : StringEqualsImpl<true> {};
 
-template <PrimitiveType A, PrimitiveType B>
-struct StringComparisonImpl<NotEqualsOp<A, B>> : StringEqualsImpl<false> {};
+template <PrimitiveType PT>
+struct StringComparisonImpl<NotEqualsOp<PT>> : StringEqualsImpl<false> {};
 
 struct NameEquals {
     static constexpr auto name = "eq";
@@ -263,7 +263,7 @@ struct NameGreaterOrEquals {
     static constexpr auto name = "ge";
 };
 
-template <template <PrimitiveType, PrimitiveType> class Op, typename Name>
+template <template <PrimitiveType> class Op, typename Name>
 class FunctionComparison : public IFunction {
 public:
     static constexpr auto name = Name::name;
@@ -281,6 +281,8 @@ private:
         const auto* col_left = assert_cast<const 
ColumnVector<PT>*>(col_left_untype.get());
         const auto* col_right = assert_cast<const 
ColumnVector<PT>*>(col_right_untyped.get());
 
+        DCHECK(!(left_is_const && right_is_const));
+
         if (!left_is_const && !right_is_const) {
             auto col_res = ColumnUInt8::create();
 
@@ -288,8 +290,8 @@ private:
             vec_res.resize(col_left->get_data().size());
             NumComparisonImpl<typename PrimitiveTypeTraits<PT>::ColumnItemType,
                               typename PrimitiveTypeTraits<PT>::ColumnItemType,
-                              Op<PT, PT>>::vector_vector(col_left->get_data(),
-                                                         
col_right->get_data(), vec_res);
+                              Op<PT>>::vector_vector(col_left->get_data(), 
col_right->get_data(),
+                                                     vec_res);
 
             block.replace_by_position(result, std::move(col_res));
         } else if (!left_is_const && right_is_const) {
@@ -299,8 +301,8 @@ private:
             vec_res.resize(col_left->size());
             NumComparisonImpl<typename PrimitiveTypeTraits<PT>::ColumnItemType,
                               typename PrimitiveTypeTraits<PT>::ColumnItemType,
-                              Op<PT, 
PT>>::vector_constant(col_left->get_data(),
-                                                           
col_right->get_element(0), vec_res);
+                              Op<PT>>::vector_constant(col_left->get_data(),
+                                                       
col_right->get_element(0), vec_res);
 
             block.replace_by_position(result, std::move(col_res));
         } else if (left_is_const && !right_is_const) {
@@ -310,20 +312,10 @@ private:
             vec_res.resize(col_right->size());
             NumComparisonImpl<typename PrimitiveTypeTraits<PT>::ColumnItemType,
                               typename PrimitiveTypeTraits<PT>::ColumnItemType,
-                              Op<PT, 
PT>>::constant_vector(col_left->get_element(0),
-                                                           
col_right->get_data(), vec_res);
+                              
Op<PT>>::constant_vector(col_left->get_element(0),
+                                                       col_right->get_data(), 
vec_res);
 
             block.replace_by_position(result, std::move(col_res));
-        } else {
-            UInt8 res = 0;
-            NumComparisonImpl<typename PrimitiveTypeTraits<PT>::ColumnItemType,
-                              typename PrimitiveTypeTraits<PT>::ColumnItemType,
-                              Op<PT, 
PT>>::constant_constant(col_left->get_element(0),
-                                                             
col_right->get_element(0), res);
-
-            block.replace_by_position(
-                    result, 
DataTypeUInt8().create_column_const(col_left->size(),
-                                                                
to_field<TYPE_BOOLEAN>(res)));
         }
         return Status::OK();
     }
@@ -359,12 +351,7 @@ private:
             return Status::NotSupported("Illegal columns {}, {} of argument of 
function {}",
                                         c0->get_name(), c1->get_name(), name);
         }
-
-        if (c0_const && c1_const) {
-            execute_generic_identical_types(block, result, c0, c1);
-            return Status::OK();
-        }
-
+        DCHECK(!(c0_const && c1_const));
         const ColumnString::Chars* c0_const_chars = nullptr;
         const ColumnString::Chars* c1_const_chars = nullptr;
         ColumnString::Offset c0_const_size = 0;
@@ -396,7 +383,7 @@ private:
             }
         }
 
-        using StringImpl = StringComparisonImpl<Op<TYPE_INT, TYPE_INT>>;
+        using StringImpl = StringComparisonImpl<Op<TYPE_INT>>;
 
         auto c_res = ColumnUInt8::create();
         ColumnUInt8::Container& vec_res = c_res->get_data();
@@ -426,26 +413,21 @@ private:
         bool c0_const = is_column_const(*c0);
         bool c1_const = is_column_const(*c1);
 
-        if (c0_const && c1_const) {
-            UInt8 res = 0;
-            GenericComparisonImpl<Op<TYPE_INT, 
TYPE_INT>>::constant_constant(*c0, *c1, res);
-            block.replace_by_position(result, 
DataTypeUInt8().create_column_const(
-                                                      c0->size(), 
to_field<TYPE_BOOLEAN>(res)));
-        } else {
-            auto c_res = ColumnUInt8::create();
-            ColumnUInt8::Container& vec_res = c_res->get_data();
-            vec_res.resize(c0->size());
-
-            if (c0_const) {
-                GenericComparisonImpl<Op<TYPE_INT, 
TYPE_INT>>::constant_vector(*c0, *c1, vec_res);
-            } else if (c1_const) {
-                GenericComparisonImpl<Op<TYPE_INT, 
TYPE_INT>>::vector_constant(*c0, *c1, vec_res);
-            } else {
-                GenericComparisonImpl<Op<TYPE_INT, 
TYPE_INT>>::vector_vector(*c0, *c1, vec_res);
-            }
+        DCHECK(!(c0_const && c1_const));
+
+        auto c_res = ColumnUInt8::create();
+        ColumnUInt8::Container& vec_res = c_res->get_data();
+        vec_res.resize(c0->size());
 
-            block.replace_by_position(result, std::move(c_res));
+        if (c0_const) {
+            GenericComparisonImpl<Op<TYPE_INT>>::constant_vector(*c0, *c1, 
vec_res);
+        } else if (c1_const) {
+            GenericComparisonImpl<Op<TYPE_INT>>::vector_constant(*c0, *c1, 
vec_res);
+        } else {
+            GenericComparisonImpl<Op<TYPE_INT>>::vector_vector(*c0, *c1, 
vec_res);
         }
+
+        block.replace_by_position(result, std::move(c_res));
     }
 
     Status execute_generic(Block& block, uint32_t result, const 
ColumnWithTypeAndName& c0,
@@ -557,11 +539,9 @@ public:
             col_left_untyped == col_right_untyped) {
             /// Always true: =, <=, >=
             // TODO: Return const column in the future. But seems so far to 
do. We need a unified approach for passing const column.
-            if constexpr (std::is_same_v<Op<TYPE_INT, TYPE_INT>, 
EqualsOp<TYPE_INT, TYPE_INT>> ||
-                          std::is_same_v<Op<TYPE_INT, TYPE_INT>,
-                                         LessOrEqualsOp<TYPE_INT, TYPE_INT>> ||
-                          std::is_same_v<Op<TYPE_INT, TYPE_INT>,
-                                         GreaterOrEqualsOp<TYPE_INT, 
TYPE_INT>>) {
+            if constexpr (std::is_same_v<Op<TYPE_INT>, EqualsOp<TYPE_INT>> ||
+                          std::is_same_v<Op<TYPE_INT>, 
LessOrEqualsOp<TYPE_INT>> ||
+                          std::is_same_v<Op<TYPE_INT>, 
GreaterOrEqualsOp<TYPE_INT>>) {
                 block.get_by_position(result).column =
                         DataTypeUInt8()
                                 .create_column_const(input_rows_count,
diff --git a/be/src/vec/functions/least_greast.cpp 
b/be/src/vec/functions/least_greast.cpp
index dfd5ff7a7a6..660a5bf2c9d 100644
--- a/be/src/vec/functions/least_greast.cpp
+++ b/be/src/vec/functions/least_greast.cpp
@@ -49,7 +49,7 @@ class DecimalV2Value;
 
 namespace doris::vectorized {
 
-template <template <PrimitiveType, PrimitiveType> class Op, typename Impl>
+template <template <PrimitiveType> class Op, typename Impl>
 struct CompareMultiImpl {
     static constexpr auto name = Impl::name;
 
@@ -83,8 +83,7 @@ struct CompareMultiImpl {
                 for (int cmp_col = 1; cmp_col < arguments.size(); ++cmp_col) {
                     auto temp_data = assert_cast<const 
ColumnString&>(*cols[cmp_col])
                                              .get_data_at(index_check_const(i, 
col_const[cmp_col]));
-                    str_data = Op<TYPE_STRING, TYPE_STRING>::apply(temp_data, 
str_data) ? temp_data
-                                                                               
         : str_data;
+                    str_data = Op<TYPE_STRING>::apply(temp_data, str_data) ? 
temp_data : str_data;
                 }
                 column_res.insert_data(str_data.data, str_data.size);
             }
@@ -311,8 +310,8 @@ private:
         if constexpr (std::is_same_v<ColumnType, ColumnDecimal128V2>) {
             for (size_t i = 0; i < input_rows_count; ++i) {
                 result_raw_data[i] =
-                        Op<TYPE_DECIMALV2, TYPE_DECIMALV2>::apply(
-                                column_raw_data[index_check_const(i, 
ArgConst)], result_raw_data[i])
+                        
Op<TYPE_DECIMALV2>::apply(column_raw_data[index_check_const(i, ArgConst)],
+                                                  result_raw_data[i])
                                 ? column_raw_data[index_check_const(i, 
ArgConst)]
                                 : result_raw_data[i];
             }
@@ -321,17 +320,17 @@ private:
                              std::is_same_v<ColumnType, ColumnDecimal128V3> ||
                              std::is_same_v<ColumnType, ColumnDecimal256>) {
             for (size_t i = 0; i < input_rows_count; ++i) {
-                result_raw_data[i] = Op<PType, PType>::apply(
-                                             
column_raw_data[index_check_const(i, ArgConst)].value,
-                                             result_raw_data[i].value)
-                                             ? 
column_raw_data[index_check_const(i, ArgConst)]
-                                             : result_raw_data[i];
+                result_raw_data[i] =
+                        Op<PType>::apply(column_raw_data[index_check_const(i, 
ArgConst)].value,
+                                         result_raw_data[i].value)
+                                ? column_raw_data[index_check_const(i, 
ArgConst)]
+                                : result_raw_data[i];
             }
         } else {
             for (size_t i = 0; i < input_rows_count; ++i) {
                 result_raw_data[i] =
-                        Op<PType, 
PType>::apply(column_raw_data[index_check_const(i, ArgConst)],
-                                                result_raw_data[i])
+                        Op<PType>::apply(column_raw_data[index_check_const(i, 
ArgConst)],
+                                         result_raw_data[i])
                                 ? column_raw_data[index_check_const(i, 
ArgConst)]
                                 : result_raw_data[i];
             }
@@ -374,7 +373,7 @@ struct FunctionFieldImpl {
                     auto [column, is_const] = 
unpack_if_const(argument_columns[col]);
                     const auto& temp_data = assert_cast<const 
ColumnString&>(*column).get_data_at(
                             index_check_const(row, is_const));
-                    if (EqualsOp<TYPE_STRING, TYPE_STRING>::apply(temp_data, 
str_data)) {
+                    if (EqualsOp<TYPE_STRING>::apply(temp_data, str_data)) {
                         res_data[row] = col;
                         break;
                     }
@@ -516,22 +515,20 @@ private:
                 assert_cast<const 
ColumnType&>(*argument_column_raw).get_data().data()[0];
         if constexpr (std::is_same_v<ColumnType, ColumnDecimal128V2>) {
             for (size_t i = 0; i < input_rows_count; ++i) {
-                res_data[i] |= (!res_data[i] *
-                                (EqualsOp<TYPE_DECIMALV2, 
TYPE_DECIMALV2>::apply(first_raw_data[i],
-                                                                               
  arg_data)) *
-                                col);
+                res_data[i] |=
+                        (!res_data[i] *
+                         (EqualsOp<TYPE_DECIMALV2>::apply(first_raw_data[i], 
arg_data)) * col);
             }
         } else if constexpr (is_decimal(PType)) {
             for (size_t i = 0; i < input_rows_count; ++i) {
                 res_data[i] |=
                         (!res_data[i] *
-                         (EqualsOp<PType, 
PType>::apply(first_raw_data[i].value, arg_data.value)) *
-                         col);
+                         (EqualsOp<PType>::apply(first_raw_data[i].value, 
arg_data.value)) * col);
             }
         } else {
             for (size_t i = 0; i < input_rows_count; ++i) {
                 res_data[i] |= (!res_data[i] *
-                                (EqualsOp<PType, 
PType>::apply(first_raw_data[i], arg_data)) * col);
+                                (EqualsOp<PType>::apply(first_raw_data[i], 
arg_data)) * col);
             }
         }
     }
diff --git a/be/test/vec/core/accurate_comparison_test.cpp 
b/be/test/vec/core/accurate_comparison_test.cpp
index 967596bc5c9..a59f2007b1f 100644
--- a/be/test/vec/core/accurate_comparison_test.cpp
+++ b/be/test/vec/core/accurate_comparison_test.cpp
@@ -17,58 +17,23 @@
 
 #include "vec/core/accurate_comparison.h"
 
-#include <gtest/gtest-message.h>
-#include <gtest/gtest-test-part.h>
-
-#include <string>
-
-#include "gtest/gtest_pred_impl.h"
-#include "runtime/primitive_type.h"
+#include <gtest/gtest.h>
 
 namespace doris::vectorized {
 TEST(VAccurateComparison, TestsOP) {
-    ASSERT_TRUE(accurate::equalsOp(static_cast<Float32>(123), 
static_cast<UInt64>(123)));
-    ASSERT_TRUE(accurate::lessOp(static_cast<Float32>(123), 
static_cast<UInt64>(124)));
-    ASSERT_TRUE(accurate::lessOp(static_cast<Float32>(-1), 
static_cast<UInt64>(1)));
-    ASSERT_TRUE(accurate::lessOp(static_cast<Int64>(-1), 
static_cast<UInt64>(1)));
-    ASSERT_TRUE(!accurate::equalsOp(static_cast<Int64>(-1), 
static_cast<UInt64>(-1)));
-    ASSERT_TRUE(accurate::equalsOp(-0., 0));
-    ASSERT_TRUE(accurate::lessOp(-0., 1));
-    ASSERT_TRUE(accurate::lessOp(-0.5, 1));
-    ASSERT_TRUE(accurate::lessOp(0.5, 1));
-    ASSERT_TRUE(accurate::equalsOp(1.0, 1));
-    ASSERT_TRUE(accurate::greaterOp(1.1, 1));
-    ASSERT_TRUE(accurate::greaterOp(11.1, 1));
-    ASSERT_TRUE(accurate::greaterOp(11.1, 11));
-    ASSERT_TRUE(accurate::lessOp(-11.1, 11));
-    ASSERT_TRUE(accurate::lessOp(-11.1, -11));
-    ASSERT_TRUE(accurate::lessOp(-1.1, -1));
-    ASSERT_TRUE(accurate::greaterOp(-1.1, -2));
-    ASSERT_TRUE(accurate::greaterOp(1000., 100));
-    ASSERT_TRUE(accurate::greaterOp(-100., -1000));
-    ASSERT_TRUE(accurate::lessOp(100., 1000));
-    ASSERT_TRUE(accurate::lessOp(-1000., -100));
-
-    ASSERT_TRUE(accurate::lessOp(-std::numeric_limits<Float64>::infinity(), 
0));
-    ASSERT_TRUE(accurate::lessOp(-std::numeric_limits<Float64>::infinity(), 
1000));
-    ASSERT_TRUE(accurate::lessOp(-std::numeric_limits<Float64>::infinity(), 
-1000));
-    ASSERT_TRUE(accurate::greaterOp(std::numeric_limits<Float64>::infinity(), 
0));
-    ASSERT_TRUE(accurate::greaterOp(std::numeric_limits<Float64>::infinity(), 
1000));
-    ASSERT_TRUE(accurate::greaterOp(std::numeric_limits<Float64>::infinity(), 
-1000));
-
-    ASSERT_TRUE(accurate::lessOp(1, 1e100));
-    ASSERT_TRUE(accurate::lessOp(-1, 1e100));
-    ASSERT_TRUE(accurate::lessOp(-1e100, 1));
-    ASSERT_TRUE(accurate::lessOp(-1e100, -1));
-
-    ASSERT_TRUE(accurate::equalsOp(static_cast<UInt64>(9223372036854775808ULL),
-                                   
static_cast<Float64>(9223372036854775808ULL)));
-    ASSERT_TRUE(accurate::equalsOp(static_cast<UInt64>(9223372036854775808ULL),
-                                   
static_cast<Float32>(9223372036854775808ULL)));
-    ASSERT_TRUE(accurate::lessOp(static_cast<UInt8>(255), 300));
-    ASSERT_TRUE(accurate::lessOp(static_cast<UInt8>(255), 
static_cast<Int16>(300)));
-    ASSERT_TRUE(accurate::notEqualsOp(static_cast<UInt8>(255), 44));
-    ASSERT_TRUE(accurate::notEqualsOp(static_cast<UInt8>(255), 
static_cast<Int16>(44)));
+    EXPECT_TRUE((EqualsOp<TYPE_INT>::apply(1, 1)));
+    EXPECT_FALSE((EqualsOp<TYPE_INT>::apply(1, 2)));
+    EXPECT_TRUE((NotEqualsOp<TYPE_INT>::apply(1, 2)));
+    EXPECT_FALSE((NotEqualsOp<TYPE_INT>::apply(1, 1)));
+    EXPECT_TRUE((LessOp<TYPE_INT>::apply(1, 2)));
+    EXPECT_FALSE((LessOp<TYPE_INT>::apply(2, 1)));
+    EXPECT_TRUE((GreaterOp<TYPE_INT>::apply(2, 1)));
+    EXPECT_FALSE((GreaterOp<TYPE_INT>::apply(1, 2)));
+    EXPECT_TRUE((LessOrEqualsOp<TYPE_INT>::apply(1, 2)));
+    EXPECT_TRUE((LessOrEqualsOp<TYPE_INT>::apply(1, 1)));
+    EXPECT_FALSE((LessOrEqualsOp<TYPE_INT>::apply(2, 1)));
+    EXPECT_TRUE((GreaterOrEqualsOp<TYPE_INT>::apply(2, 1)));
+    EXPECT_TRUE((GreaterOrEqualsOp<TYPE_INT>::apply(1, 1)));
 }
 
 } // namespace doris::vectorized
diff --git a/regression-test/data/correctness/test_compare_float.out 
b/regression-test/data/correctness/test_compare_float.out
index 78948c17b4d..9cab3a3e06f 100644
--- a/regression-test/data/correctness/test_compare_float.out
+++ b/regression-test/data/correctness/test_compare_float.out
@@ -5,7 +5,6 @@
 3      114514.0
 4      Infinity
 5      -Infinity
-6      -0.0
 7      0.0
 8      NaN
 9      NaN
@@ -13,7 +12,6 @@
 -- !sql1 --
 5      -Infinity
 2      -123.0
-6      -0.0
 7      0.0
 1      123.0
 3      114514.0
@@ -24,7 +22,6 @@
 -- !sql2 --
 -Infinity      true
 -123.0 true
--0.0   true
 0.0    true
 123.0  true
 114514.0       true
@@ -35,7 +32,6 @@ NaN   false
 -- !sql3 --
 -Infinity      true
 -123.0 true
--0.0   true
 0.0    true
 123.0  true
 114514.0       true
@@ -46,7 +42,6 @@ NaN   true
 -- !sql4 --
 -Infinity      false
 -123.0 false
--0.0   false
 0.0    false
 123.0  false
 114514.0       false
@@ -57,7 +52,6 @@ NaN   false
 -- !sql5 --
 -Infinity      false
 -123.0 false
--0.0   false
 0.0    false
 123.0  false
 114514.0       false
@@ -68,7 +62,6 @@ NaN   true
 -- !sql6 --
 -Infinity      false
 -123.0 false
--0.0   false
 0.0    false
 123.0  false
 114514.0       false
@@ -79,7 +72,6 @@ NaN   true
 -- !sql7 --
 -Infinity      true
 -123.0 true
--0.0   true
 0.0    true
 123.0  true
 114514.0       true
diff --git a/regression-test/suites/correctness/test_compare_float.groovy 
b/regression-test/suites/correctness/test_compare_float.groovy
index 3df3b6aa05f..86d2fc6f88c 100644
--- a/regression-test/suites/correctness/test_compare_float.groovy
+++ b/regression-test/suites/correctness/test_compare_float.groovy
@@ -37,7 +37,7 @@ suite("test_compare_float") {
 
 
     sql """
-        insert into sort_float 
values(1,'123'),(2,'-123'),(3,'114514'),(4,'+inf'),(5,'-inf'),(6,'-0'),(7,'+0'),(8,'Nan'),(9,'Nan');
+        insert into sort_float 
values(1,'123'),(2,'-123'),(3,'114514'),(4,'+inf'),(5,'-inf'),(7,'+0'),(8,'Nan'),(9,'Nan');
     """
 
     qt_sql """


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to