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

panxiaolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new ea1b7fabe66 [refine](DECIMALV2)Only DECIMALV2 has the member variables 
original_precision and original_scale. (#56913)
ea1b7fabe66 is described below

commit ea1b7fabe66f9528377330a8dff33edef6fd9ee7
Author: Mryange <[email protected]>
AuthorDate: Thu Oct 16 17:24:37 2025 +0800

    [refine](DECIMALV2)Only DECIMALV2 has the member variables 
original_precision and original_scale. (#56913)
    
    
    
    Copilot said: The variables original_precision and original_scale are
    only
    The variables original_precision and original_scale are only needed for
    DECIMALV2; DECIMALV3 does not require these member variables.
---
 be/src/vec/data_types/data_type_decimal.h | 195 ++++++++++++++++++------------
 1 file changed, 119 insertions(+), 76 deletions(-)

diff --git a/be/src/vec/data_types/data_type_decimal.h 
b/be/src/vec/data_types/data_type_decimal.h
index 59da8de61a6..8163198eb2d 100644
--- a/be/src/vec/data_types/data_type_decimal.h
+++ b/be/src/vec/data_types/data_type_decimal.h
@@ -104,6 +104,90 @@ DataTypePtr 
get_data_type_with_default_argument(DataTypePtr type);
 
 DataTypePtr create_decimal(UInt64 precision, UInt64 scale, bool use_v2);
 
+template <PrimitiveType T>
+class DecimalScaleInfoBase {
+public:
+    static void check_type_precision(const UInt32 precision) {
+        if (precision > max_decimal_precision<T>() || precision < 1) {
+            throw Exception(ErrorCode::INTERNAL_ERROR,
+                            "meet invalid precision: real_precision={}, 
max_decimal_precision={}, "
+                            "min_decimal_precision=1",
+                            precision, max_decimal_precision<T>());
+        }
+    }
+
+    static void check_type_scale(const UInt32 scale) {
+        if (scale > max_decimal_precision<T>()) {
+            throw Exception(ErrorCode::INTERNAL_ERROR,
+                            "meet invalid scale: real_scale={}, 
max_decimal_precision={}", scale,
+                            max_decimal_precision<T>());
+        }
+    }
+
+    DecimalScaleInfoBase(UInt32 precision, UInt32 scale) : 
precision(precision), scale(scale) {
+        check_type_precision(precision);
+        check_type_scale(scale);
+        if (scale > precision) {
+            throw Exception(ErrorCode::INVALID_ARGUMENT, "scale({}) is greater 
than precision({})",
+                            scale, precision);
+        }
+    }
+
+    const UInt32 precision;
+    const UInt32 scale;
+};
+
+template <PrimitiveType T>
+class DecimalScaleInfo : public DecimalScaleInfoBase<T> {
+protected:
+    DecimalScaleInfo(UInt32 arg_precision, UInt32 arg_scale, UInt32, UInt32)
+            : DecimalScaleInfoBase<T>(arg_precision, arg_scale) {}
+    DecimalScaleInfo(DecimalScaleInfo const& rhs)
+            : DecimalScaleInfoBase<T>(rhs.precision, rhs.scale) {}
+};
+
+template <>
+class DecimalScaleInfo<TYPE_DECIMALV2> : public 
DecimalScaleInfoBase<TYPE_DECIMALV2> {
+protected:
+    DecimalScaleInfo(UInt32 arg_precision, UInt32 arg_scale, UInt32 
arg_original_precision,
+                     UInt32 arg_original_scale)
+            : DecimalScaleInfoBase<TYPE_DECIMALV2>(arg_precision, arg_scale),
+              original_precision(arg_original_precision),
+              original_scale(arg_original_scale) {
+        if (UINT32_MAX != original_precision) {
+            check_type_precision(original_precision);
+        }
+        if (UINT32_MAX != original_scale) {
+            check_type_scale(original_scale);
+        }
+        if (original_scale > original_precision) {
+            throw Exception(ErrorCode::INVALID_ARGUMENT,
+                            "original_scale({}) is greater than 
original_precision({})",
+                            original_scale, original_precision);
+        }
+    }
+
+    DecimalScaleInfo(DecimalScaleInfo const& rhs)
+            : DecimalScaleInfoBase<TYPE_DECIMALV2>(rhs.precision, rhs.scale),
+              original_precision(rhs.original_precision),
+              original_scale(rhs.original_scale) {}
+    // For decimalv2 only, record the original(schema) precision and scale.
+    // UINT32_MAX means original precision and scale are unknown.
+    // Decimalv2 will be converted to Decimal(27, 9) in memory when doing any 
calculations,
+    // but when casting decimalv2 to string, it's better to keep the presion 
and
+    // scale of it's original value in schema.
+    const UInt32 original_precision = UINT32_MAX;
+    const UInt32 original_scale = UINT32_MAX;
+
+public:
+    [[nodiscard]] UInt32 get_original_precision() const {
+        return UINT32_MAX == original_precision ? precision : 
original_precision;
+    }
+    [[nodiscard]] UInt32 get_original_scale() const { return 
get_format_scale(); }
+    [[nodiscard]] UInt32 get_format_scale() const {
+        return UINT32_MAX == original_scale ? scale : original_scale;
+    }
+};
 /// Implements Decimal(P, S), where P is precision, S is scale.
 /// Maximum precisions for underlying types are:
 /// Int32    9
@@ -113,52 +197,28 @@ DataTypePtr create_decimal(UInt64 precision, UInt64 
scale, bool use_v2);
 ///     P is one of (9, 18, 38); equals to the maximum precision for the 
biggest underlying type of operands.
 ///     S is maximum scale of operands. The allowed values are [0, precision]
 template <PrimitiveType T>
-class DataTypeDecimal final : public IDataType {
+class DataTypeDecimal final : public IDataType, public DecimalScaleInfo<T> {
     static_assert(is_decimal(T));
 
 public:
     using ColumnType = typename PrimitiveTypeTraits<T>::ColumnType;
     using FieldType = typename PrimitiveTypeTraits<T>::ColumnItemType;
     static constexpr PrimitiveType PType = T;
+    using DecimalScaleInfo<T>::scale;
+    using DecimalScaleInfo<T>::precision;
 
     static constexpr bool is_parametric = true;
 
     static constexpr size_t max_precision() { return 
max_decimal_precision<T>(); }
 
-    DataTypeDecimal(UInt32 precision = max_decimal_precision<T>(),
-                    UInt32 scale = default_decimal_scale<T>(),
+    DataTypeDecimal(UInt32 arg_precision = max_decimal_precision<T>(),
+                    UInt32 arg_scale = default_decimal_scale<T>(),
                     UInt32 arg_original_precision = UINT32_MAX,
                     UInt32 arg_original_scale = UINT32_MAX)
-            : precision(precision),
-              scale(scale),
-              original_precision(arg_original_precision),
-              original_scale(arg_original_scale) {
-        check_type_precision(precision);
-        check_type_scale(scale);
-        if (scale > precision) {
-            throw Exception(ErrorCode::INVALID_ARGUMENT, "scale({}) is greater 
than precision({})",
-                            scale, precision);
-        }
-        if constexpr (T == TYPE_DECIMALV2) {
-            if (UINT32_MAX != original_precision) {
-                check_type_precision(original_precision);
-            }
-            if (UINT32_MAX != original_scale) {
-                check_type_scale(scale);
-            }
-            if (original_scale > original_precision) {
-                throw Exception(ErrorCode::INVALID_ARGUMENT,
-                                "original_scale({}) is greater than 
original_precision({})",
-                                original_scale, original_precision);
-            }
-        }
-    }
+            : DecimalScaleInfo<T>(arg_precision, arg_scale, 
arg_original_precision,
+                                  arg_original_scale) {}
 
-    DataTypeDecimal(const DataTypeDecimal& rhs)
-            : precision(rhs.precision),
-              scale(rhs.scale),
-              original_precision(rhs.original_precision),
-              original_scale(rhs.original_scale) {}
+    DataTypeDecimal(const DataTypeDecimal& rhs) : DecimalScaleInfo<T>(rhs) {}
 
     const std::string get_family_name() const override { return 
type_to_string(T); }
     std::string do_get_name() const override;
@@ -239,12 +299,12 @@ public:
 
     [[nodiscard]] UInt32 get_precision() const override { return precision; }
     [[nodiscard]] UInt32 get_scale() const override { return scale; }
-    [[nodiscard]] UInt32 get_original_precision() const {
-        return UINT32_MAX == original_precision ? precision : 
original_precision;
-    }
-    [[nodiscard]] UInt32 get_original_scale() const { return 
get_format_scale(); }
     [[nodiscard]] UInt32 get_format_scale() const {
-        return UINT32_MAX == original_scale ? scale : original_scale;
+        if constexpr (T == TYPE_DECIMALV2) {
+            return DecimalScaleInfo<T>::get_format_scale();
+        } else {
+            return scale;
+        }
     }
     FieldType::NativeType get_scale_multiplier() const { return 
get_scale_multiplier(scale); }
     void to_protobuf(PTypeDesc* ptype, PTypeNode* node, PScalarType* 
scalar_type) const override {
@@ -272,35 +332,6 @@ public:
 
     FieldWithDataType get_field_with_data_type(const IColumn& column,
                                                size_t row_num) const override;
-
-    static void check_type_precision(const UInt32 precision) {
-        if (precision > max_decimal_precision<T>() || precision < 1) {
-            throw Exception(ErrorCode::INTERNAL_ERROR,
-                            "meet invalid precision: real_precision={}, 
max_decimal_precision={}, "
-                            "min_decimal_precision=1",
-                            precision, max_decimal_precision<T>());
-        }
-    }
-
-    static void check_type_scale(const UInt32 scale) {
-        if (scale > max_decimal_precision<T>()) {
-            throw Exception(ErrorCode::INTERNAL_ERROR,
-                            "meet invalid scale: real_scale={}, 
max_decimal_precision={}", scale,
-                            max_decimal_precision<T>());
-        }
-    }
-
-private:
-    const UInt32 precision;
-    const UInt32 scale;
-
-    // For decimalv2 only, record the original(schema) precision and scale.
-    // UINT32_MAX means original precision and scale are unknown.
-    // Decimalv2 will be converted to Decimal(27, 9) in memory when doing any 
calculations,
-    // but when casting decimalv2 to string, it's better to keep the presion 
and
-    // scale of it's original value in schema.
-    UInt32 original_precision = UINT32_MAX;
-    UInt32 original_scale = UINT32_MAX;
 };
 
 using DataTypeDecimal32 = DataTypeDecimal<TYPE_DECIMAL32>;
@@ -311,32 +342,32 @@ using DataTypeDecimal256 = 
DataTypeDecimal<TYPE_DECIMAL256>;
 
 template <>
 constexpr Decimal32::NativeType 
DataTypeDecimal<TYPE_DECIMAL32>::get_scale_multiplier(
-        UInt32 scale) {
-    return common::exp10_i32(scale);
+        UInt32 arg_scale) {
+    return common::exp10_i32(arg_scale);
 }
 
 template <>
 constexpr Decimal64::NativeType 
DataTypeDecimal<TYPE_DECIMAL64>::get_scale_multiplier(
-        UInt32 scale) {
-    return common::exp10_i64(scale);
+        UInt32 arg_scale) {
+    return common::exp10_i64(arg_scale);
 }
 
 template <>
 constexpr Decimal128V2::NativeType 
DataTypeDecimal<TYPE_DECIMALV2>::get_scale_multiplier(
-        UInt32 scale) {
-    return common::exp10_i128(scale);
+        UInt32 arg_scale) {
+    return common::exp10_i128(arg_scale);
 }
 
 template <>
 constexpr Decimal128V3::NativeType 
DataTypeDecimal<TYPE_DECIMAL128I>::get_scale_multiplier(
-        UInt32 scale) {
-    return common::exp10_i128(scale);
+        UInt32 arg_scale) {
+    return common::exp10_i128(arg_scale);
 }
 
 template <>
 constexpr Decimal256::NativeType 
DataTypeDecimal<TYPE_DECIMAL256>::get_scale_multiplier(
-        UInt32 scale) {
-    return common::exp10_i256(scale);
+        UInt32 arg_scale) {
+    return common::exp10_i256(arg_scale);
 }
 
 template <>
@@ -481,5 +512,17 @@ typename PrimitiveTypeTraits<T>::CppNativeType 
min_decimal_value(UInt32 precisio
            DataTypeDecimal<T>::get_scale_multiplier(
                    (UInt32)(max_decimal_precision<T>() - precision));
 }
+
+template <typename T>
+concept has_original_precision_and_scale = requires(T t) {
+    { t.get_original_precision() };
+    { t.get_original_scale() };
+};
+static_assert(has_original_precision_and_scale<DataTypeDecimalV2>);
+static_assert(!has_original_precision_and_scale<DataTypeDecimal32>);
+static_assert(!has_original_precision_and_scale<DataTypeDecimal64>);
+static_assert(!has_original_precision_and_scale<DataTypeDecimal128>);
+static_assert(!has_original_precision_and_scale<DataTypeDecimal256>);
+
 #include "common/compile_check_end.h"
 } // namespace doris::vectorized


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

Reply via email to