Mryange commented on code in PR #53869:
URL: https://github.com/apache/doris/pull/53869#discussion_r2235323343


##########
be/src/vec/functions/cast/cast_to_basic_number_common.h:
##########
@@ -17,18 +17,314 @@
 
 #pragma once
 
+#include <limits>
 #include <type_traits>
 
 #include "cast_base.h"
 #include "common/status.h"
+#include "runtime/define_primitive_type.h"
 #include "runtime/primitive_type.h"
+#include "vec/core/types.h"
 #include "vec/data_types/data_type_decimal.h"
 #include "vec/data_types/data_type_number.h"
 #include "vec/data_types/data_type_string.h"
 
 namespace doris::vectorized {
 #include "common/compile_check_begin.h"
 
+template <typename CppT>
+static inline constexpr const char* int_type_name = std::is_same_v<CppT, 
vectorized::UInt8> ? "bool"
+                                                    : std::is_same_v<CppT, 
int8_t>     ? "tinyint"
+                                                    : std::is_same_v<CppT, 
int16_t>    ? "smallint"
+                                                    : std::is_same_v<CppT, 
int32_t>    ? "int"
+                                                    : std::is_same_v<CppT, 
int64_t>    ? "bigint"
+                                                    : std::is_same_v<CppT, 
__int128_t> ? "largeint"
+                                                                               
        : "unknown";
+
+template <typename CppT>
+constexpr bool IsCppTypeInt =
+        std::is_same_v<CppT, 
PrimitiveTypeTraits<TYPE_TINYINT>::ColumnItemType> ||
+        std::is_same_v<CppT, 
PrimitiveTypeTraits<TYPE_SMALLINT>::ColumnItemType> ||
+        std::is_same_v<CppT, PrimitiveTypeTraits<TYPE_INT>::ColumnItemType> ||
+        std::is_same_v<CppT, PrimitiveTypeTraits<TYPE_BIGINT>::ColumnItemType> 
||
+        std::is_same_v<CppT, 
PrimitiveTypeTraits<TYPE_LARGEINT>::ColumnItemType>;
+
+template <typename CppT>
+constexpr bool IsCppTypeFloat =
+        std::is_same_v<CppT, PrimitiveTypeTraits<TYPE_FLOAT>::ColumnItemType> 
||
+        std::is_same_v<CppT, PrimitiveTypeTraits<TYPE_DOUBLE>::ColumnItemType>;
+
+template <typename CppT>
+constexpr bool IsCppTypeNumberOrTime =
+        std::is_same_v<CppT, 
PrimitiveTypeTraits<TYPE_BOOLEAN>::ColumnItemType> ||
+        IsCppTypeInt<CppT> || IsCppTypeFloat<CppT> ||
+        std::is_same_v<CppT, PrimitiveTypeTraits<TYPE_TIMEV2>::ColumnItemType>;
+
+// cast to int, may overflow if:
+// 1. from wider int to narrower int
+// 2. from float/double to int
+// 3. from time to tinyint, smallint and int
+template <typename FromCppT, typename ToCppT>
+constexpr bool CastToIntFromWiderInt = IsCppTypeInt<FromCppT> && 
IsCppTypeInt<ToCppT> &&
+                                       sizeof(FromCppT) > sizeof(ToCppT);
+
+template <typename FromCppT, typename ToCppT>
+constexpr bool CastToIntFromTimeMayOverflow =
+        std::is_same_v<FromCppT, 
PrimitiveTypeTraits<TYPE_TIMEV2>::ColumnItemType> &&
+        (std::is_same_v<FromCppT, 
PrimitiveTypeTraits<TYPE_INT>::ColumnItemType> ||
+         std::is_same_v<FromCppT, 
PrimitiveTypeTraits<TYPE_SMALLINT>::ColumnItemType> ||
+         std::is_same_v<FromCppT, 
PrimitiveTypeTraits<TYPE_TINYINT>::ColumnItemType>);
+
+template <typename FromCppT, typename ToCppT>
+constexpr bool CastToIntCppTypeMayOverflow =
+        CastToIntFromWiderInt<FromCppT, ToCppT> || IsCppTypeFloat<FromCppT> ||
+        CastToIntFromTimeMayOverflow<FromCppT, ToCppT>;
+
+template <typename CppT>
+constexpr static bool IntAllowCastFromDate =
+        std::is_same_v<CppT, PrimitiveTypeTraits<TYPE_INT>::ColumnItemType> ||
+        std::is_same_v<CppT, PrimitiveTypeTraits<TYPE_BIGINT>::ColumnItemType> 
||
+        std::is_same_v<CppT, 
PrimitiveTypeTraits<TYPE_LARGEINT>::ColumnItemType>;
+
+template <typename CppT>
+constexpr static bool IntAllowCastFromDatetime =
+        std::is_same_v<CppT, PrimitiveTypeTraits<TYPE_BIGINT>::ColumnItemType> 
||
+        std::is_same_v<CppT, 
PrimitiveTypeTraits<TYPE_LARGEINT>::ColumnItemType>;
+
+template <typename CppT>
+constexpr bool IsCppTypeDate = std::is_same_v<CppT, 
PrimitiveTypeTraits<TYPE_DATE>::CppType> ||
+                               std::is_same_v<CppT, 
PrimitiveTypeTraits<TYPE_DATEV2>::CppType>;
+
+template <typename CppT>
+constexpr bool IsCppTypeDateTime =
+        std::is_same_v<CppT, PrimitiveTypeTraits<TYPE_DATETIME>::CppType> ||
+        std::is_same_v<CppT, PrimitiveTypeTraits<TYPE_DATETIMEV2>::CppType>;
+struct CastToInt {
+    template <typename ToCppT>
+        requires(IsCppTypeInt<ToCppT>)
+    static inline bool from_string(const StringRef& from, ToCppT& to, 
CastParameters& params) {
+        return std::visit(
+                [&](auto is_strict_mode) {
+                    if constexpr (is_strict_mode) {
+                        return try_read_int_text<ToCppT, true>(to, from);
+                    } else {
+                        return try_read_int_text<ToCppT, false>(to, from);
+                    }
+                },
+                vectorized::make_bool_variant(params.is_strict));
+    }
+
+    template <typename FromCppT, typename ToCppT>
+        requires(IsCppTypeInt<ToCppT> &&
+                 std::is_same_v<FromCppT, 
PrimitiveTypeTraits<TYPE_BOOLEAN>::ColumnItemType>)
+    static inline bool from_bool(FromCppT from, ToCppT& to, CastParameters& 
params) {
+        CastUtil::static_cast_set(to, from);
+        return true;
+    }
+
+    // from wider int to narrower int, may overflow
+    template <typename FromCppT, typename ToCppT>
+        requires(IsCppTypeInt<ToCppT> && IsCppTypeInt<FromCppT> &&
+                 CastToIntFromWiderInt<FromCppT, ToCppT>)
+    static inline bool from_int(FromCppT from, ToCppT& to, CastParameters& 
params) {
+        constexpr auto min_to_value = std::numeric_limits<ToCppT>::min();
+        constexpr auto max_to_value = std::numeric_limits<ToCppT>::max();
+        return std::visit(

Review Comment:
   这就一个变量就不要用visit了吧



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to