You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2022/12/14 03:35:44 UTC

[doris] 02/03: [test](decimalv3) add regression test cases for decimalv3 (#14672)

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

morningman pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 70430c8a05c4c951646ca0175386f0d71c419c46
Author: Gabriel <ga...@gmail.com>
AuthorDate: Thu Dec 1 15:18:40 2022 +0800

    [test](decimalv3) add regression test cases for decimalv3 (#14672)
---
 .../segment_v2/bloom_filter_index_writer.cpp       |  60 ++----
 .../aggregate_function_stddev.cpp                  |   2 +-
 be/src/vec/data_types/data_type_decimal.cpp        |  24 ---
 be/src/vec/data_types/data_type_decimal.h          |  33 +++-
 be/src/vec/exec/scan/vscan_node.cpp                |   4 +-
 be/src/vec/io/io_helper.h                          |  15 +-
 .../apache/doris/analysis/FunctionCallExpr.java    |   4 +
 .../java/org/apache/doris/analysis/TypeDef.java    |   8 +-
 .../apache/doris/datasource/InternalCatalog.java   |   2 +-
 .../test_create_table_with_bloom_filter.out        |   8 +-
 .../correctness_p0/test_select_variance_agg.out    |  11 +-
 .../decimalv3/test_agg_tab_decimalv3.out           |  84 ++++++++
 .../decimalv3/test_dup_tab_decimalv3.out           | 213 +++++++++++++++++++++
 .../decimalv3/test_uniq_tab_decimalv3.out          |  87 +++++++++
 .../data/ddl_p0/test_ctas_decimalv3.out            |  13 ++
 .../test_agg_keys_schema_change_decimalv3.out      |  31 +++
 .../test_create_table_with_bloom_filter.groovy     |  25 ++-
 .../correctness_p0/test_select_variance_agg.groovy |  11 +-
 .../decimalv3/test_agg_tab_decimalv3.groovy        |  91 +++++++++
 .../decimalv3/test_dup_tab_decimalv3.groovy        |  91 +++++++++
 .../decimalv3/test_uniq_tab_decimalv3.groovy       |  91 +++++++++
 .../suites/ddl_p0/test_ctas_decimalv3.groovy       |  66 +++++++
 .../test_agg_keys_schema_change_decimalv3.groovy   | 209 ++++++++++++++++++++
 23 files changed, 1088 insertions(+), 95 deletions(-)

diff --git a/be/src/olap/rowset/segment_v2/bloom_filter_index_writer.cpp b/be/src/olap/rowset/segment_v2/bloom_filter_index_writer.cpp
index 3e57a1db90..5542a6068d 100644
--- a/be/src/olap/rowset/segment_v2/bloom_filter_index_writer.cpp
+++ b/be/src/olap/rowset/segment_v2/bloom_filter_index_writer.cpp
@@ -176,47 +176,27 @@ Status BloomFilterIndexWriter::create(const BloomFilterOptions& bf_options,
                                       std::unique_ptr<BloomFilterIndexWriter>* res) {
     FieldType type = type_info->type();
     switch (type) {
-    case OLAP_FIELD_TYPE_SMALLINT:
-        res->reset(new BloomFilterIndexWriterImpl<OLAP_FIELD_TYPE_SMALLINT>(bf_options, type_info));
-        break;
-    case OLAP_FIELD_TYPE_INT:
-        res->reset(new BloomFilterIndexWriterImpl<OLAP_FIELD_TYPE_INT>(bf_options, type_info));
-        break;
-    case OLAP_FIELD_TYPE_UNSIGNED_INT:
-        res->reset(new BloomFilterIndexWriterImpl<OLAP_FIELD_TYPE_UNSIGNED_INT>(bf_options,
-                                                                                type_info));
-        break;
-    case OLAP_FIELD_TYPE_BIGINT:
-        res->reset(new BloomFilterIndexWriterImpl<OLAP_FIELD_TYPE_BIGINT>(bf_options, type_info));
-        break;
-    case OLAP_FIELD_TYPE_LARGEINT:
-        res->reset(new BloomFilterIndexWriterImpl<OLAP_FIELD_TYPE_LARGEINT>(bf_options, type_info));
-        break;
-    case OLAP_FIELD_TYPE_CHAR:
-        res->reset(new BloomFilterIndexWriterImpl<OLAP_FIELD_TYPE_CHAR>(bf_options, type_info));
-        break;
-    case OLAP_FIELD_TYPE_VARCHAR:
-        res->reset(new BloomFilterIndexWriterImpl<OLAP_FIELD_TYPE_VARCHAR>(bf_options, type_info));
-        break;
-    case OLAP_FIELD_TYPE_STRING:
-        res->reset(new BloomFilterIndexWriterImpl<OLAP_FIELD_TYPE_STRING>(bf_options, type_info));
-        break;
-    case OLAP_FIELD_TYPE_DATE:
-        res->reset(new BloomFilterIndexWriterImpl<OLAP_FIELD_TYPE_DATE>(bf_options, type_info));
-        break;
-    case OLAP_FIELD_TYPE_DATETIME:
-        res->reset(new BloomFilterIndexWriterImpl<OLAP_FIELD_TYPE_DATETIME>(bf_options, type_info));
-        break;
-    case OLAP_FIELD_TYPE_DECIMAL:
-        res->reset(new BloomFilterIndexWriterImpl<OLAP_FIELD_TYPE_DECIMAL>(bf_options, type_info));
-        break;
-    case OLAP_FIELD_TYPE_DATEV2:
-        res->reset(new BloomFilterIndexWriterImpl<OLAP_FIELD_TYPE_DATEV2>(bf_options, type_info));
-        break;
-    case OLAP_FIELD_TYPE_DATETIMEV2:
-        res->reset(
-                new BloomFilterIndexWriterImpl<OLAP_FIELD_TYPE_DATETIMEV2>(bf_options, type_info));
+#define M(TYPE)                                                                  \
+    case TYPE:                                                                   \
+        res->reset(new BloomFilterIndexWriterImpl<TYPE>(bf_options, type_info)); \
         break;
+        M(OLAP_FIELD_TYPE_SMALLINT)
+        M(OLAP_FIELD_TYPE_INT)
+        M(OLAP_FIELD_TYPE_UNSIGNED_INT)
+        M(OLAP_FIELD_TYPE_BIGINT)
+        M(OLAP_FIELD_TYPE_LARGEINT)
+        M(OLAP_FIELD_TYPE_CHAR)
+        M(OLAP_FIELD_TYPE_VARCHAR)
+        M(OLAP_FIELD_TYPE_STRING)
+        M(OLAP_FIELD_TYPE_DATE)
+        M(OLAP_FIELD_TYPE_DATETIME)
+        M(OLAP_FIELD_TYPE_DECIMAL)
+        M(OLAP_FIELD_TYPE_DATEV2)
+        M(OLAP_FIELD_TYPE_DATETIMEV2)
+        M(OLAP_FIELD_TYPE_DECIMAL32)
+        M(OLAP_FIELD_TYPE_DECIMAL64)
+        M(OLAP_FIELD_TYPE_DECIMAL128I)
+#undef M
     default:
         return Status::NotSupported("unsupported type for bitmap index: {}", std::to_string(type));
     }
diff --git a/be/src/vec/aggregate_functions/aggregate_function_stddev.cpp b/be/src/vec/aggregate_functions/aggregate_function_stddev.cpp
index f1510dd568..b83c9043bd 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_stddev.cpp
+++ b/be/src/vec/aggregate_functions/aggregate_function_stddev.cpp
@@ -60,7 +60,7 @@ static IAggregateFunction* create_function_single_value(const String& name,
     }
     if (which.is_decimal128i()) {
         return new AggregateFunctionTemplate<
-                NameData<Data<Decimal128, BaseDatadecimal<Decimal128, is_stddev>>>, is_nullable>(
+                NameData<Data<Decimal128I, BaseDatadecimal<Decimal128I, is_stddev>>>, is_nullable>(
                 argument_types);
     }
     DCHECK(false) << "with unknowed type, failed in  create_aggregate_function_stddev_variance";
diff --git a/be/src/vec/data_types/data_type_decimal.cpp b/be/src/vec/data_types/data_type_decimal.cpp
index 075469d42e..aa1da12e4d 100644
--- a/be/src/vec/data_types/data_type_decimal.cpp
+++ b/be/src/vec/data_types/data_type_decimal.cpp
@@ -202,30 +202,6 @@ Decimal128I DataTypeDecimal<Decimal128I>::get_scale_multiplier(UInt32 scale) {
     return common::exp10_i128(scale);
 }
 
-template <typename T>
-void convert_to_decimal(T* from_value, T* to_value, int32_t from_scale, int32_t to_scale,
-                        bool* loss_accuracy) {
-    if (from_scale == to_scale) {
-        *to_value = *from_value;
-        return;
-    }
-    if (from_scale > to_scale) {
-        *to_value =
-                (*from_value) / static_cast<T>(DataTypeDecimal<Decimal<T>>::get_scale_multiplier(
-                                        from_scale - to_scale));
-        *loss_accuracy =
-                ((*from_value) % static_cast<T>(DataTypeDecimal<Decimal<T>>::get_scale_multiplier(
-                                         from_scale - to_scale))) != 0;
-    } else {
-        if (common::mul_overflow(*from_value,
-                                 static_cast<T>(DataTypeDecimal<Decimal<T>>::get_scale_multiplier(
-                                         to_scale - from_scale)),
-                                 *to_value)) {
-            LOG(WARNING) << "Decimal convert overflow";
-        }
-    }
-}
-
 template <typename T>
 typename T::NativeType max_decimal_value(UInt32 precision) {
     return 0;
diff --git a/be/src/vec/data_types/data_type_decimal.h b/be/src/vec/data_types/data_type_decimal.h
index d07db5f2ef..1ccce064cf 100644
--- a/be/src/vec/data_types/data_type_decimal.h
+++ b/be/src/vec/data_types/data_type_decimal.h
@@ -337,6 +337,9 @@ convert_decimals(const typename FromDataType::FieldType& value, UInt32 scale_fro
         if (common::mul_overflow(static_cast<MaxNativeType>(value), converted_value,
                                  converted_value)) {
             LOG(WARNING) << "Decimal convert overflow";
+            return converted_value < 0
+                           ? std::numeric_limits<typename ToFieldType::NativeType>::min()
+                           : std::numeric_limits<typename ToFieldType::NativeType>::max();
         }
     } else {
         converted_value =
@@ -344,9 +347,13 @@ convert_decimals(const typename FromDataType::FieldType& value, UInt32 scale_fro
     }
 
     if constexpr (sizeof(FromFieldType) > sizeof(ToFieldType)) {
-        if (converted_value < std::numeric_limits<typename ToFieldType::NativeType>::min() ||
-            converted_value > std::numeric_limits<typename ToFieldType::NativeType>::max()) {
+        if (converted_value < std::numeric_limits<typename ToFieldType::NativeType>::min()) {
             LOG(WARNING) << "Decimal convert overflow";
+            return std::numeric_limits<typename ToFieldType::NativeType>::min();
+        }
+        if (converted_value > std::numeric_limits<typename ToFieldType::NativeType>::max()) {
+            LOG(WARNING) << "Decimal convert overflow";
+            return std::numeric_limits<typename ToFieldType::NativeType>::max();
         }
     }
 
@@ -373,9 +380,13 @@ convert_from_decimal(const typename FromDataType::FieldType& value, UInt32 scale
         if constexpr (sizeof(FromFieldType) > sizeof(ToFieldType) ||
                       !std::numeric_limits<ToFieldType>::is_signed) {
             if constexpr (std::numeric_limits<ToFieldType>::is_signed) {
-                if (converted_value < std::numeric_limits<ToFieldType>::min() ||
-                    converted_value > std::numeric_limits<ToFieldType>::max()) {
+                if (converted_value < std::numeric_limits<ToFieldType>::min()) {
+                    LOG(WARNING) << "Decimal convert overflow";
+                    return std::numeric_limits<ToFieldType>::min();
+                }
+                if (converted_value > std::numeric_limits<ToFieldType>::max()) {
                     LOG(WARNING) << "Decimal convert overflow";
+                    return std::numeric_limits<ToFieldType>::max();
                 }
             } else {
                 using CastIntType =
@@ -385,6 +396,7 @@ convert_from_decimal(const typename FromDataType::FieldType& value, UInt32 scale
                     converted_value >
                             static_cast<CastIntType>(std::numeric_limits<ToFieldType>::max())) {
                     LOG(WARNING) << "Decimal convert overflow";
+                    return std::numeric_limits<ToFieldType>::max();
                 }
             }
         }
@@ -402,13 +414,19 @@ convert_to_decimal(const typename FromDataType::FieldType& value, UInt32 scale)
     if constexpr (std::is_floating_point_v<FromFieldType>) {
         if (!std::isfinite(value)) {
             LOG(WARNING) << "Decimal convert overflow. Cannot convert infinity or NaN to decimal";
+            return value < 0 ? std::numeric_limits<ToNativeType>::min()
+                             : std::numeric_limits<ToNativeType>::max();
         }
 
         FromFieldType out;
         out = value * ToDataType::get_scale_multiplier(scale);
-        if (out <= static_cast<FromFieldType>(std::numeric_limits<ToNativeType>::min()) ||
-            out >= static_cast<FromFieldType>(std::numeric_limits<ToNativeType>::max())) {
+        if (out <= static_cast<FromFieldType>(std::numeric_limits<ToNativeType>::min())) {
             LOG(WARNING) << "Decimal convert overflow. Float is out of Decimal range";
+            return std::numeric_limits<ToNativeType>::min();
+        }
+        if (out >= static_cast<FromFieldType>(std::numeric_limits<ToNativeType>::max())) {
+            LOG(WARNING) << "Decimal convert overflow. Float is out of Decimal range";
+            return std::numeric_limits<ToNativeType>::max();
         }
         return out;
     } else {
@@ -421,9 +439,6 @@ convert_to_decimal(const typename FromDataType::FieldType& value, UInt32 scale)
     }
 }
 
-template <typename T>
-void convert_to_decimal(T* from_value, T* to_value, int32_t from_scale, int32_t to_scale,
-                        bool* loss_accuracy);
 template <typename T>
 typename T::NativeType max_decimal_value(UInt32 precision);
 
diff --git a/be/src/vec/exec/scan/vscan_node.cpp b/be/src/vec/exec/scan/vscan_node.cpp
index cda9cb6197..870e81d1ed 100644
--- a/be/src/vec/exec/scan/vscan_node.cpp
+++ b/be/src/vec/exec/scan/vscan_node.cpp
@@ -544,7 +544,9 @@ bool VScanNode::_is_predicate_acting_on_slot(
     }
     *slot_desc = entry->second.first;
     DCHECK(child_contains_slot != nullptr);
-    if (child_contains_slot->type().type != (*slot_desc)->type().type) {
+    if (child_contains_slot->type().type != (*slot_desc)->type().type ||
+        child_contains_slot->type().precision != (*slot_desc)->type().precision ||
+        child_contains_slot->type().scale != (*slot_desc)->type().scale) {
         if (!ignore_cast(*slot_desc, child_contains_slot)) {
             // the type of predicate not match the slot's type
             return false;
diff --git a/be/src/vec/io/io_helper.h b/be/src/vec/io/io_helper.h
index 0da73a5416..990b67fd62 100644
--- a/be/src/vec/io/io_helper.h
+++ b/be/src/vec/io/io_helper.h
@@ -71,7 +71,9 @@ template <typename T>
 void write_text(Decimal<T> value, UInt32 scale, std::ostream& ostr) {
     if (value < Decimal<T>(0)) {
         value *= Decimal<T>(-1);
-        ostr << '-';
+        if (value > Decimal<T>(0)) {
+            ostr << '-';
+        }
     }
 
     using Type = std::conditional_t<std::is_same_v<T, Int128I>, int128_t, T>;
@@ -88,7 +90,16 @@ void write_text(Decimal<T> value, UInt32 scale, std::ostream& ostr) {
     if (scale) {
         ostr << '.';
         String str_fractional(scale, '0');
-        for (Int32 pos = scale - 1; pos >= 0; --pos, value /= 10) {
+        Int32 pos = scale - 1;
+        if (value < Decimal<T>(0) && pos >= 0) {
+            // Reach here iff this value is a min value of a signed numeric type. It means min<int>()
+            // which is -2147483648 multiply -1 is still -2147483648.
+            str_fractional[pos] += (value / 10 * 10) - value;
+            pos--;
+            value /= 10;
+            value *= Decimal<T>(-1);
+        }
+        for (; pos >= 0; --pos, value /= 10) {
             str_fractional[pos] += value % 10;
         }
         ostr.write(str_fractional.data(), scale);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
index 29f76a471c..02e7b6a979 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
@@ -1157,6 +1157,10 @@ public class FunctionCallExpr extends Expr {
             System.arraycopy(childTypes, 0, newChildTypes, 0, newChildTypes.length);
             fn = getBuiltinFunction(fnName.getFunction(), newChildTypes,
                     Function.CompareMode.IS_NONSTRICT_SUPERTYPE_OF);
+        } else if (STDDEV_FUNCTION_SET.contains(fnName.getFunction().toLowerCase()) && children.size() == 1
+                && collectChildReturnTypes()[0].isDecimalV3()) {
+            fn = getBuiltinFunction(fnName.getFunction(), new Type[] {Type.DOUBLE},
+                    Function.CompareMode.IS_NONSTRICT_SUPERTYPE_OF);
         } else {
             // now first find table function in table function sets
             if (isTableFnCall) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/TypeDef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/TypeDef.java
index bf641f4db1..df00ef62b5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/TypeDef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/TypeDef.java
@@ -177,7 +177,7 @@ public class TypeDef implements ParseNode {
                             "Scale of decimal must between 0 and 9." + " Scale was set to: " + scale + ".");
                 }
                 // scale < precision
-                if (scale >= precision) {
+                if (scale > precision) {
                     throw new AnalysisException("Scale of decimal must be smaller than precision."
                             + " Scale is " + scale + " and precision is " + precision);
                 }
@@ -196,7 +196,7 @@ public class TypeDef implements ParseNode {
                             "Scale of decimal must not be less than 0." + " Scale was set to: " + decimal32Scale + ".");
                 }
                 // scale < precision
-                if (decimal32Scale >= decimal32Precision) {
+                if (decimal32Scale > decimal32Precision) {
                     throw new AnalysisException("Scale of decimal must be smaller than precision."
                             + " Scale is " + decimal32Scale + " and precision is " + decimal32Precision);
                 }
@@ -215,7 +215,7 @@ public class TypeDef implements ParseNode {
                             "Scale of decimal must not be less than 0." + " Scale was set to: " + decimal64Scale + ".");
                 }
                 // scale < precision
-                if (decimal64Scale >= decimal64Precision) {
+                if (decimal64Scale > decimal64Precision) {
                     throw new AnalysisException("Scale of decimal must be smaller than precision."
                             + " Scale is " + decimal64Scale + " and precision is " + decimal64Precision);
                 }
@@ -234,7 +234,7 @@ public class TypeDef implements ParseNode {
                             + decimal128Scale + ".");
                 }
                 // scale < precision
-                if (decimal128Scale >= decimal128Precision) {
+                if (decimal128Scale > decimal128Precision) {
                     throw new AnalysisException("Scale of decimal must be smaller than precision."
                             + " Scale is " + decimal128Scale + " and precision is " + decimal128Precision);
                 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
index 31b1893e7f..c28ed27bc3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
@@ -1218,7 +1218,7 @@ public class InternalCatalog implements CatalogIf<Database> {
                 } else if (resultType.isDecimalV2() && resultType.equals(ScalarType.DECIMALV2)) {
                     typeDef = new TypeDef(ScalarType.createDecimalType(27, 9));
                 } else if (resultType.isDecimalV3()) {
-                    typeDef = new TypeDef(ScalarType.createDecimalType(resultType.getPrecision(),
+                    typeDef = new TypeDef(ScalarType.createDecimalV3Type(resultType.getPrecision(),
                             ((ScalarType) resultType).getScalarScale()));
                 } else {
                     typeDef = new TypeDef(resultExpr.getType());
diff --git a/regression-test/data/bloom_filter_p0/test_create_table_with_bloom_filter.out b/regression-test/data/bloom_filter_p0/test_create_table_with_bloom_filter.out
index 266c5df0a7..070fd800bc 100644
--- a/regression-test/data/bloom_filter_p0/test_create_table_with_bloom_filter.out
+++ b/regression-test/data/bloom_filter_p0/test_create_table_with_bloom_filter.out
@@ -1,6 +1,6 @@
 -- This file is automatically generated. You should know what you did if you want to edit this
 -- !select_tb --
-1	2	4	8	50string	500varchar	c	65535varchar	0	123456789012345678.123456789	2013-12-01	1900-01-01T00:00	2013-12-01	1900-01-01T00:00	1900-01-01T00:00:00.111	1900-01-01T00:00:00.111111	1	2	4	8	50string	500varchar_replace	c	65535varchar	12345678901234.123456	123456789012345678.123456789	1900-01-01	1900-01-01	1900-01-01	1900-01-01T00:00	1900-01-01T00:00	1900-01-01T00:00	2013-12-01	2013-12-01	2013-12-01	1900-01-01T00:00	1900-01-01T00:00	1900-01-01T00:00	1900-01-01T00:00:00.111	1900-01-01T00:00: [...]
+1	2	4	8	50string	500varchar	c	65535varchar	0.000000	123456789012345678.123456789	111.1	11222323232.1	11345643534234231.1	2013-12-01	1900-01-01T00:00	2013-12-01	1900-01-01T00:00	1900-01-01T00:00:00.111	1900-01-01T00:00:00.111111	1	2	4	8	50string	500varchar_replace	c	65535varchar	12345678901234.123456	123456789012345678.123456789	111.1	11222323232.1	11345643534234231.1	1900-01-01	1900-01-01	1900-01-01	1900-01-01T00:00	1900-01-01T00:00	1900-01-01T00:00	2013-12-01	2013-12-01	2013-12-01	1900- [...]
 
 -- !desc_tb --
 tinyint_key	TINYINT	No	true	\N	
@@ -13,6 +13,9 @@ char_key	CHAR(1)	No	true	\N	BLOOM_FILTER
 character_most_key	VARCHAR(65533)	No	true	\N	BLOOM_FILTER
 decimal_key	DECIMAL(20,6)	No	true	\N	BLOOM_FILTER
 decimal_most_key	DECIMAL(27,9)	No	true	\N	BLOOM_FILTER
+decimal32_key	DECIMALV3(5,1)	No	true	\N	BLOOM_FILTER
+decimal64_key	DECIMALV3(14,1)	No	true	\N	BLOOM_FILTER
+decimal128_key	DECIMALV3(38,1)	No	true	\N	BLOOM_FILTER
 date_key	DATE	No	true	\N	BLOOM_FILTER
 datetime_key	DATETIME	No	true	\N	BLOOM_FILTER
 datev2_key	DATEV2	No	true	\N	BLOOM_FILTER
@@ -29,6 +32,9 @@ char_value	CHAR(1)	No	false	\N	REPLACE
 character_most_value	VARCHAR(65533)	No	false	\N	REPLACE
 decimal_value	DECIMAL(20,6)	No	false	\N	SUM
 decimal_most_value	DECIMAL(27,9)	No	false	\N	SUM
+decimal32_value	DECIMALV3(5,1)	No	false	\N	SUM
+decimal64_value	DECIMALV3(14,1)	No	false	\N	SUM
+decimal128_value	DECIMALV3(38,1)	No	false	\N	SUM
 date_value_max	DATE	No	false	\N	MAX
 date_value_replace	DATE	No	false	\N	REPLACE
 date_value_min	DATE	No	false	\N	MIN
diff --git a/regression-test/data/correctness_p0/test_select_variance_agg.out b/regression-test/data/correctness_p0/test_select_variance_agg.out
index 66ad4d8c9e..5360845d02 100644
--- a/regression-test/data/correctness_p0/test_select_variance_agg.out
+++ b/regression-test/data/correctness_p0/test_select_variance_agg.out
@@ -3,5 +3,14 @@
 31200.0
 
 -- !select_default2 --
-564.666666667
+564.666667
+
+-- !select_decimal32 --
+1.6674
+
+-- !select_decimal64 --
+1.3290205760164607E11
+
+-- !select_decimal128 --
+564.666667
 
diff --git a/regression-test/data/datatype_p0/decimalv3/test_agg_tab_decimalv3.out b/regression-test/data/datatype_p0/decimalv3/test_agg_tab_decimalv3.out
new file mode 100644
index 0000000000..11d9c99f11
--- /dev/null
+++ b/regression-test/data/datatype_p0/decimalv3/test_agg_tab_decimalv3.out
@@ -0,0 +1,84 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !select_all --
+\N	\N	\N	\N	\N	\N
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+2.10000	1.20000	1.30000	4.20000	1.21000	1.23420
+
+-- !select_pred_decimal32_key --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+
+-- !select_pred_decimal32_key --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+
+-- !select_pred_decimal32_value --
+
+-- !select_pred_decimal32_value --
+
+-- !select_pred_decimal64_key --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+2.10000	1.20000	1.30000	4.20000	1.21000	1.23420
+
+-- !select_pred_decimal64_key --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+2.10000	1.20000	1.30000	4.20000	1.21000	1.23420
+
+-- !select_pred_decimal64_value --
+
+-- !select_pred_decimal64_value --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+2.10000	1.20000	1.30000	4.20000	1.21000	1.23420
+
+-- !select_pred_decimal128_key --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+2.10000	1.20000	1.30000	4.20000	1.21000	1.23420
+
+-- !select_pred_decimal128_key --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+2.10000	1.20000	1.30000	4.20000	1.21000	1.23420
+
+-- !select_pred_decimal128_value --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+
+-- !select_pred_decimal128_value --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+2.10000	1.20000	1.30000	4.20000	1.21000	1.23420
+
+-- !select_between_pred_decimal32_key --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+
+-- !select_in_pred_decimal32_key1 --
+
+-- !select_in_pred_decimal32_key2 --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+
+-- !select_in_pred_decimal32_key3 --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+
+-- !select_between_pred_decimal64_key --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+2.10000	1.20000	1.30000	4.20000	1.21000	1.23420
+
+-- !select_in_pred_decimal64_key1 --
+
+-- !select_in_pred_decimal64_key2 --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+2.10000	1.20000	1.30000	4.20000	1.21000	1.23420
+
+-- !select_in_pred_decimal64_key3 --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+2.10000	1.20000	1.30000	4.20000	1.21000	1.23420
+
+-- !select_between_pred_decimal128_key --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+2.10000	1.20000	1.30000	4.20000	1.21000	1.23420
+
+-- !select_in_pred_decimal128_key1 --
+
+-- !select_in_pred_decimal128_key2 --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+2.10000	1.20000	1.30000	4.20000	1.21000	1.23420
+
+-- !select_in_pred_decimal128_key3 --
+1.10000	1.20000	1.30000	7.00000	1.34400	1.60000
+2.10000	1.20000	1.30000	4.20000	1.21000	1.23420
+
diff --git a/regression-test/data/datatype_p0/decimalv3/test_dup_tab_decimalv3.out b/regression-test/data/datatype_p0/decimalv3/test_dup_tab_decimalv3.out
new file mode 100644
index 0000000000..119ce2a68c
--- /dev/null
+++ b/regression-test/data/datatype_p0/decimalv3/test_dup_tab_decimalv3.out
@@ -0,0 +1,213 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !select_all --
+\N	\N	\N	\N	\N	\N
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_pred_decimal32_key --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_pred_decimal32_key --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_pred_decimal32_value --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_pred_decimal32_value --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_pred_decimal64_key --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_pred_decimal64_key --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_pred_decimal64_value --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_pred_decimal64_value --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_pred_decimal128_key --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_pred_decimal128_key --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_pred_decimal128_value --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_pred_decimal128_value --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_between_pred_decimal32_key --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_in_pred_decimal32_key1 --
+
+-- !select_in_pred_decimal32_key2 --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_in_pred_decimal32_key3 --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_between_pred_decimal64_key --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_in_pred_decimal64_key1 --
+
+-- !select_in_pred_decimal64_key2 --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_in_pred_decimal64_key3 --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_between_pred_decimal128_key --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_in_pred_decimal128_key1 --
+
+-- !select_in_pred_decimal128_key2 --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
+-- !select_in_pred_decimal128_key3 --
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+1.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+2.10000	1.20000	1.30000	1.40000	1.50000	1.60000
+
diff --git a/regression-test/data/datatype_p0/decimalv3/test_uniq_tab_decimalv3.out b/regression-test/data/datatype_p0/decimalv3/test_uniq_tab_decimalv3.out
new file mode 100644
index 0000000000..1595a8c5b5
--- /dev/null
+++ b/regression-test/data/datatype_p0/decimalv3/test_uniq_tab_decimalv3.out
@@ -0,0 +1,87 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !select_all --
+\N	\N	\N	\N	\N	\N
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+2.10000	1.20000	1.30000	1.40000	1.21000	1.12300
+
+-- !select_pred_decimal32_key --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+
+-- !select_pred_decimal32_key --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+
+-- !select_pred_decimal32_value --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+2.10000	1.20000	1.30000	1.40000	1.21000	1.12300
+
+-- !select_pred_decimal32_value --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+2.10000	1.20000	1.30000	1.40000	1.21000	1.12300
+
+-- !select_pred_decimal64_key --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+2.10000	1.20000	1.30000	1.40000	1.21000	1.12300
+
+-- !select_pred_decimal64_key --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+2.10000	1.20000	1.30000	1.40000	1.21000	1.12300
+
+-- !select_pred_decimal64_value --
+
+-- !select_pred_decimal64_value --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+2.10000	1.20000	1.30000	1.40000	1.21000	1.12300
+
+-- !select_pred_decimal128_key --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+2.10000	1.20000	1.30000	1.40000	1.21000	1.12300
+
+-- !select_pred_decimal128_key --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+2.10000	1.20000	1.30000	1.40000	1.21000	1.12300
+
+-- !select_pred_decimal128_value --
+
+-- !select_pred_decimal128_value --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+2.10000	1.20000	1.30000	1.40000	1.21000	1.12300
+
+-- !select_between_pred_decimal32_key --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+
+-- !select_in_pred_decimal32_key1 --
+
+-- !select_in_pred_decimal32_key2 --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+
+-- !select_in_pred_decimal32_key3 --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+
+-- !select_between_pred_decimal64_key --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+2.10000	1.20000	1.30000	1.40000	1.21000	1.12300
+
+-- !select_in_pred_decimal64_key1 --
+
+-- !select_in_pred_decimal64_key2 --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+2.10000	1.20000	1.30000	1.40000	1.21000	1.12300
+
+-- !select_in_pred_decimal64_key3 --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+2.10000	1.20000	1.30000	1.40000	1.21000	1.12300
+
+-- !select_between_pred_decimal128_key --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+2.10000	1.20000	1.30000	1.40000	1.21000	1.12300
+
+-- !select_in_pred_decimal128_key1 --
+
+-- !select_in_pred_decimal128_key2 --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+2.10000	1.20000	1.30000	1.40000	1.21000	1.12300
+
+-- !select_in_pred_decimal128_key3 --
+1.10000	1.20000	1.30000	1.40000	1.45600	1.34543
+2.10000	1.20000	1.30000	1.40000	1.21000	1.12300
+
diff --git a/regression-test/data/ddl_p0/test_ctas_decimalv3.out b/regression-test/data/ddl_p0/test_ctas_decimalv3.out
new file mode 100644
index 0000000000..c0f7a1e12a
--- /dev/null
+++ b/regression-test/data/ddl_p0/test_ctas_decimalv3.out
@@ -0,0 +1,13 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !select --
+1.1	1.20000	1.3	1.400000	1.500000	1.600000
+1.1	1.20000	1.3	1.400000	1.500000	1.600000
+2.1	2.20000	2.3	2.400000	2.500000	2.600000
+2.1	2.20000	2.3	2.400000	2.500000	2.600000
+
+-- !select --
+1.1	1.20000	1.3	1.400000	1.500000	1.600000
+1.1	1.20000	1.3	1.400000	1.500000	1.600000
+2.1	2.20000	2.3	2.400000	2.500000	2.600000
+2.1	2.20000	2.3	2.400000	2.500000	2.600000
+
diff --git a/regression-test/data/schema_change_p0/decimalv3/test_agg_keys_schema_change_decimalv3.out b/regression-test/data/schema_change_p0/decimalv3/test_agg_keys_schema_change_decimalv3.out
new file mode 100644
index 0000000000..1b9f52fd5e
--- /dev/null
+++ b/regression-test/data/schema_change_p0/decimalv3/test_agg_keys_schema_change_decimalv3.out
@@ -0,0 +1,31 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !sql --
+0.11111111111111111111111111111111100000	11111111111111111111111111111.110	0.11111111111111111111111111111111100000	11111111111111111111111111111.110
+
+-- !sql --
+0.11111111111111111111111111111111100000	11111111111111111111111111111.110	\N	0.11111111111111111111111111111111100000	11111111111111111111111111111.110
+
+-- !sql --
+0.11111111111111111111111111111111100000	11111111111111111111111111111.110	\N	0.11111111111111111111111111111111100000	11111111111111111111111111111.110
+
+-- !sql --
+0.11111111111111111111111111111111100000	11111111111111111111111111111.110	0.11111111111111111111111111111111100000	11111111111111111111111111111.110
+
+-- !sql --
+0.11111111111111111111111111111111100000	11111111111111111111111111111.110	0.11111111111111111111111111111111100000	11111111111111111111111111111.110
+
+-- !sql --
+0.11111111111111111111111111111111100000	11111111111111111111111111111.1100000000	0.11111111111111111111111111111111100000	11111111111111111111111111111.110
+
+-- !sql --
+0.11111111111111111111111111111111100000	9223372036854775.807	0.11111111111111111111111111111111100000	11111111111111111111111111111.110
+
+-- !sql --
+0.11111111111111111111111111111111100000	-9223.372036854775808	0.11111111111111111111111111111111100000	11111111111111111111111111111.110
+
+-- !sql --
+0.11111111111111111111111111111111100000	-9223	0.11111111111111111111111111111111100000	11111111111111111111111111111.110
+
+-- !sql --
+0.11111111111111111111111111111111100000	-2147.483648	0.11111111111111111111111111111111100000	11111111111111111111111111111.110
+
diff --git a/regression-test/suites/bloom_filter_p0/test_create_table_with_bloom_filter.groovy b/regression-test/suites/bloom_filter_p0/test_create_table_with_bloom_filter.groovy
index 09a6967684..c95b131d0e 100644
--- a/regression-test/suites/bloom_filter_p0/test_create_table_with_bloom_filter.groovy
+++ b/regression-test/suites/bloom_filter_p0/test_create_table_with_bloom_filter.groovy
@@ -28,8 +28,11 @@ suite("test_create_table_with_bloom_filter") {
             char_key CHAR NOT NULL, 
             character_most_key VARCHAR(65533) NOT NULL, 
             decimal_key DECIMAL(20, 6) NOT NULL, 
-            decimal_most_key DECIMAL(27, 9) NOT NULL, 
-            date_key DATE NOT NULL, 
+            decimal_most_key DECIMAL(27, 9) NOT NULL,
+            decimal32_key DECIMALV3(5, 1) NOT NULL,
+            decimal64_key DECIMALV3(14, 1) NOT NULL,
+            decimal128_key DECIMALV3(38, 1) NOT NULL,
+            date_key DATE NOT NULL,
             datetime_key DATETIME NOT NULL,
             datev2_key DATEV2 NOT NULL,
             datetimev2_key_1 DATETIMEV2 NOT NULL,
@@ -44,7 +47,10 @@ suite("test_create_table_with_bloom_filter") {
             char_value CHAR REPLACE NOT NULL, 
             character_most_value VARCHAR(65533) REPLACE NOT NULL, 
             decimal_value DECIMAL(20, 6) SUM NOT NULL, 
-            decimal_most_value DECIMAL(27, 9) SUM NOT NULL, 
+            decimal_most_value DECIMAL(27, 9) SUM NOT NULL,
+            decimal32_value DECIMALV3(5, 1) SUM NOT NULL,
+            decimal64_value DECIMALV3(14, 1) SUM NOT NULL,
+            decimal128_value DECIMALV3(38, 1) SUM NOT NULL,
             date_value_max DATE MAX NOT NULL, 
             date_value_replace DATE REPLACE NOT NULL, 
             date_value_min DATE MIN NOT NULL, 
@@ -76,6 +82,9 @@ suite("test_create_table_with_bloom_filter") {
             character_most_key,
             decimal_key,
             decimal_most_key,
+            decimal32_key,
+            decimal64_key,
+            decimal128_key,
             date_key,
             datetime_key,
             datev2_key,
@@ -85,19 +94,21 @@ suite("test_create_table_with_bloom_filter") {
         DISTRIBUTED BY HASH(tinyint_key) BUCKETS 5 
         PROPERTIES ( 
             "bloom_filter_columns"="smallint_key,int_key,bigint_key,char_50_key,character_key,
-                                    char_key,character_most_key,decimal_key,decimal_most_key,
-                                    date_key,datetime_key,datev2_key, datetimev2_key_1, datetimev2_key_2, datetimev2_key_3",
+                                    char_key,character_most_key,decimal_key,decimal_most_key, decimal32_key,
+                                    decimal64_key, decimal128_key, date_key,datetime_key,datev2_key, datetimev2_key_1,
+                                    datetimev2_key_2, datetimev2_key_3",
             "replication_num" = "1"
         )
         """
     sql """
             INSERT INTO test_bloom_filter VALUES 
                 ('1', '2', '4', '8', '50string', '500varchar', 'c', '65535varchar', 
-                 '0', '123456789012345678.123456789', '2013-12-01', '1900-01-01 00:00:00',
+                 '0', '123456789012345678.123456789', '111.1', '11222323232.1', '11345643534234231.1',
+                 '2013-12-01', '1900-01-01 00:00:00',
                  '2013-12-01', '1900-01-01 00:00:00.111111',
                  '1900-01-01 00:00:00.111111', '1900-01-01 00:00:00.111111',
                  '1', '2', '4', '8', '50string', '500varchar_replace',
-                 'c', '65535varchar', '12345678901234.123456', '123456789012345678.123456789',
+                 'c', '65535varchar', '12345678901234.123456', '123456789012345678.123456789', '111.1', '11222323232.1', '11345643534234231.1',
                  '1900-01-01', '1900-01-01', '1900-01-01', '1900-01-01 00:00:00', '1900-01-01 00:00:00',
                  '1900-01-01 00:00:00', '2013-12-01', '2013-12-01', '2013-12-01', '1900-01-01 00:00:00.111111',
                  '1900-01-01 00:00:00.111111', '1900-01-01 00:00:00.111111', '1900-01-01 00:00:00.111111',
diff --git a/regression-test/suites/correctness_p0/test_select_variance_agg.groovy b/regression-test/suites/correctness_p0/test_select_variance_agg.groovy
index f07898c23e..190ac65e2d 100644
--- a/regression-test/suites/correctness_p0/test_select_variance_agg.groovy
+++ b/regression-test/suites/correctness_p0/test_select_variance_agg.groovy
@@ -21,15 +21,15 @@
 
      sql """ DROP TABLE IF EXISTS ${tableName} """
      sql """
-         CREATE TABLE IF NOT EXISTS ${tableName} ( `aa` int NULL COMMENT "", `bb` decimal(27,9) NULL COMMENT "" ) 
+         CREATE TABLE IF NOT EXISTS ${tableName} ( `aa` int NULL COMMENT "", `bb` decimal(27,9), `decimal32_col` decimalv3(5,2), `decimal64_col` decimalv3(15,9), `decimal128_col` decimal(27,9) NULL COMMENT "" )
          ENGINE=OLAP UNIQUE KEY(`aa`) DISTRIBUTED BY HASH(`aa`) BUCKETS 3 
          PROPERTIES ( "replication_allocation" = "tag.location.default: 1", "in_memory" = "false", "storage_format" = "V2" );
      """
 
      sql """ INSERT INTO ${tableName} VALUES 
-         (123,34),
-         (423,78),
-         (3,23); """
+         (123,34, 1.22,6666.6666,34),
+         (423,78,2.33,777777.7777,78),
+         (3,23,4.34,2222.2222,23); """
 
      // test_vectorized
      sql """ set enable_vectorized_engine = true; """
@@ -39,5 +39,8 @@
      // doris decimal variance implementation have deviation,
      // use round to check result
      qt_select_default2 """ select round(variance(bb), 6) from ${tableName}; """
+     qt_select_decimal32 """ select round(variance(decimal32_col), 6) from ${tableName}; """
+     qt_select_decimal64 """ select round(variance(decimal64_col), 6) from ${tableName}; """
+     qt_select_decimal128 """ select round(variance(decimal128_col), 6) from ${tableName}; """
 
  }
\ No newline at end of file
diff --git a/regression-test/suites/datatype_p0/decimalv3/test_agg_tab_decimalv3.groovy b/regression-test/suites/datatype_p0/decimalv3/test_agg_tab_decimalv3.groovy
new file mode 100644
index 0000000000..1869e19373
--- /dev/null
+++ b/regression-test/suites/datatype_p0/decimalv3/test_agg_tab_decimalv3.groovy
@@ -0,0 +1,91 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_agg_tab_decimalv3") {
+
+    def table1 = "test_agg_tab_decimalv3"
+
+    sql "drop table if exists ${table1}"
+
+    sql """
+    CREATE TABLE IF NOT EXISTS `${table1}` (
+      `decimal32_key` decimalv3(8, 5) NULL COMMENT "",
+      `decimal64_key` decimalv3(16, 5) NULL COMMENT "",
+      `decimal128_key` decimalv3(38, 5) NULL COMMENT "",
+      `decimal32_value` decimalv3(8, 5) SUM NULL COMMENT "",
+      `decimal64_value` decimalv3(16, 5) MIN NULL COMMENT "",
+      `decimal128_value` decimalv3(38, 5) MAX NULL COMMENT ""
+    ) ENGINE=OLAP
+    AGGREGATE KEY(`decimal32_key`, `decimal64_key`, `decimal128_key`)
+    COMMENT "OLAP"
+    DISTRIBUTED BY HASH(`decimal32_key`, `decimal64_key`, `decimal128_key`) BUCKETS 8
+    PROPERTIES (
+    "replication_allocation" = "tag.location.default: 1",
+    "in_memory" = "false",
+    "storage_format" = "V2"
+    )
+    """
+    sql "set enable_vectorized_engine = true"
+
+    sql """insert into ${table1} values(1.1,1.2,1.3,1.4,1.5,1.6),
+            (1.1,1.2,1.3,1.4,1.56,1.234),
+            (1.1,1.2,1.3,1.4,1.66,1.534654),
+            (1.1,1.2,1.3,1.4,1.344,1.32432),
+            (1.1,1.2,1.3,1.4,1.456,1.345435),
+            (2.1,1.2,1.3,1.4,1.5,1.234),
+            (2.1,1.2,1.3,1.4,1.66,1.2342),
+            (2.1,1.2,1.3,1.4,1.21,1.123),
+            (NULL, NULL, NULL, NULL, NULL, NULL)
+    """
+    qt_select_all "select * from ${table1} order by decimal32_key"
+
+    qt_select_pred_decimal32_key "select * from ${table1} where decimal32_key = 1.1 order by decimal32_key"
+    qt_select_pred_decimal32_key "select * from ${table1} where decimal32_key < 1.1111111111111111111 order by decimal32_key"
+
+    qt_select_pred_decimal32_value "select * from ${table1} where decimal32_value = 1.4 order by decimal32_key"
+    qt_select_pred_decimal32_value "select * from ${table1} where decimal32_value < 1.444444444444444 order by decimal32_key"
+
+    qt_select_pred_decimal64_key "select * from ${table1} where decimal64_key = 1.2 order by decimal32_key"
+    qt_select_pred_decimal64_key "select * from ${table1} where decimal64_key < 1.222222222222222222 order by decimal32_key"
+
+    qt_select_pred_decimal64_value "select * from ${table1} where decimal64_value = 1.5 order by decimal32_key"
+    qt_select_pred_decimal64_value "select * from ${table1} where decimal64_value < 1.5555555555555555 order by decimal32_key"
+
+    qt_select_pred_decimal128_key "select * from ${table1} where decimal128_key = 1.3 order by decimal32_key"
+    qt_select_pred_decimal128_key "select * from ${table1} where decimal128_key < 1.333333333333 order by decimal32_key"
+
+    qt_select_pred_decimal128_value "select * from ${table1} where decimal128_value = 1.6 order by decimal32_key"
+    qt_select_pred_decimal128_value "select * from ${table1} where decimal128_value < 1.666666666666 order by decimal32_key"
+
+
+    qt_select_between_pred_decimal32_key "select * from ${table1} where decimal32_key between 1.0991 and 1.1111 order by decimal32_key"
+    qt_select_in_pred_decimal32_key1 "select * from ${table1} where decimal32_key in(1.1111) order by decimal32_key"
+    qt_select_in_pred_decimal32_key2 "select * from ${table1} where decimal32_key in(1.10000000000) order by decimal32_key"
+    qt_select_in_pred_decimal32_key3 "select * from ${table1} where decimal32_key in(1.1, 1.4) order by decimal32_key"
+
+    qt_select_between_pred_decimal64_key "select * from ${table1} where decimal64_key between 1.1991 and 1.2111 order by decimal32_key"
+    qt_select_in_pred_decimal64_key1 "select * from ${table1} where decimal64_key in(1.2111) order by decimal32_key"
+    qt_select_in_pred_decimal64_key2 "select * from ${table1} where decimal64_key in(1.20000000000) order by decimal32_key"
+    qt_select_in_pred_decimal64_key3 "select * from ${table1} where decimal64_key in(1.2, 1.4) order by decimal32_key"
+
+    qt_select_between_pred_decimal128_key "select * from ${table1} where decimal128_key between 1.2991 and 1.3111 order by decimal32_key"
+    qt_select_in_pred_decimal128_key1 "select * from ${table1} where decimal128_key in(1.3111) order by decimal32_key"
+    qt_select_in_pred_decimal128_key2 "select * from ${table1} where decimal128_key in(1.30000000000) order by decimal32_key"
+    qt_select_in_pred_decimal128_key3 "select * from ${table1} where decimal128_key in(1.3, 1.4) order by decimal32_key"
+
+    sql "drop table if exists ${table1}"
+}
diff --git a/regression-test/suites/datatype_p0/decimalv3/test_dup_tab_decimalv3.groovy b/regression-test/suites/datatype_p0/decimalv3/test_dup_tab_decimalv3.groovy
new file mode 100644
index 0000000000..fa4842fb4a
--- /dev/null
+++ b/regression-test/suites/datatype_p0/decimalv3/test_dup_tab_decimalv3.groovy
@@ -0,0 +1,91 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_dup_tab_decimalv3") {
+
+    def table1 = "test_dup_tab_decimalv3"
+
+    sql "drop table if exists ${table1}"
+
+    sql """
+    CREATE TABLE IF NOT EXISTS `${table1}` (
+      `decimal32_key` decimalv3(8, 5) NULL COMMENT "",
+      `decimal64_key` decimalv3(16, 5) NULL COMMENT "",
+      `decimal128_key` decimalv3(38, 5) NULL COMMENT "",
+      `decimal32_value` decimalv3(8, 5) NULL COMMENT "",
+      `decimal64_value` decimalv3(16, 5) NULL COMMENT "",
+      `decimal128_value` decimalv3(38, 5) NULL COMMENT ""
+    ) ENGINE=OLAP
+    DUPLICATE KEY(`decimal32_key`, `decimal64_key`, `decimal128_key`)
+    COMMENT "OLAP"
+    DISTRIBUTED BY HASH(`decimal32_key`, `decimal64_key`, `decimal128_key`) BUCKETS 8
+    PROPERTIES (
+    "replication_allocation" = "tag.location.default: 1",
+    "in_memory" = "false",
+    "storage_format" = "V2"
+    )
+    """
+    sql "set enable_vectorized_engine = true"
+
+    sql """insert into ${table1} values(1.1,1.2,1.3,1.4,1.5,1.6),
+            (1.1,1.2,1.3,1.4,1.5,1.6),
+            (1.1,1.2,1.3,1.4,1.5,1.6),
+            (1.1,1.2,1.3,1.4,1.5,1.6),
+            (1.1,1.2,1.3,1.4,1.5,1.6),
+            (2.1,1.2,1.3,1.4,1.5,1.6),
+            (2.1,1.2,1.3,1.4,1.5,1.6),
+            (2.1,1.2,1.3,1.4,1.5,1.6),
+            (NULL, NULL, NULL, NULL, NULL, NULL)
+    """
+    qt_select_all "select * from ${table1} order by decimal32_key"
+
+    qt_select_pred_decimal32_key "select * from ${table1} where decimal32_key = 1.1 order by decimal32_key"
+    qt_select_pred_decimal32_key "select * from ${table1} where decimal32_key < 1.1111111111111111111 order by decimal32_key"
+
+    qt_select_pred_decimal32_value "select * from ${table1} where decimal32_value = 1.4 order by decimal32_key"
+    qt_select_pred_decimal32_value "select * from ${table1} where decimal32_value < 1.444444444444444 order by decimal32_key"
+
+    qt_select_pred_decimal64_key "select * from ${table1} where decimal64_key = 1.2 order by decimal32_key"
+    qt_select_pred_decimal64_key "select * from ${table1} where decimal64_key < 1.222222222222222222 order by decimal32_key"
+
+    qt_select_pred_decimal64_value "select * from ${table1} where decimal64_value = 1.5 order by decimal32_key"
+    qt_select_pred_decimal64_value "select * from ${table1} where decimal64_value < 1.5555555555555555 order by decimal32_key"
+
+    qt_select_pred_decimal128_key "select * from ${table1} where decimal128_key = 1.3 order by decimal32_key"
+    qt_select_pred_decimal128_key "select * from ${table1} where decimal128_key < 1.333333333333 order by decimal32_key"
+
+    qt_select_pred_decimal128_value "select * from ${table1} where decimal128_value = 1.6 order by decimal32_key"
+    qt_select_pred_decimal128_value "select * from ${table1} where decimal128_value < 1.666666666666 order by decimal32_key"
+
+
+    qt_select_between_pred_decimal32_key "select * from ${table1} where decimal32_key between 1.0991 and 1.1111 order by decimal32_key"
+    qt_select_in_pred_decimal32_key1 "select * from ${table1} where decimal32_key in(1.1111) order by decimal32_key"
+    qt_select_in_pred_decimal32_key2 "select * from ${table1} where decimal32_key in(1.10000000000) order by decimal32_key"
+    qt_select_in_pred_decimal32_key3 "select * from ${table1} where decimal32_key in(1.1, 1.4) order by decimal32_key"
+
+    qt_select_between_pred_decimal64_key "select * from ${table1} where decimal64_key between 1.1991 and 1.2111 order by decimal32_key"
+    qt_select_in_pred_decimal64_key1 "select * from ${table1} where decimal64_key in(1.2111) order by decimal32_key"
+    qt_select_in_pred_decimal64_key2 "select * from ${table1} where decimal64_key in(1.20000000000) order by decimal32_key"
+    qt_select_in_pred_decimal64_key3 "select * from ${table1} where decimal64_key in(1.2, 1.4) order by decimal32_key"
+
+    qt_select_between_pred_decimal128_key "select * from ${table1} where decimal128_key between 1.2991 and 1.3111 order by decimal32_key"
+    qt_select_in_pred_decimal128_key1 "select * from ${table1} where decimal128_key in(1.3111) order by decimal32_key"
+    qt_select_in_pred_decimal128_key2 "select * from ${table1} where decimal128_key in(1.30000000000) order by decimal32_key"
+    qt_select_in_pred_decimal128_key3 "select * from ${table1} where decimal128_key in(1.3, 1.4) order by decimal32_key"
+
+    sql "drop table if exists ${table1}"
+}
diff --git a/regression-test/suites/datatype_p0/decimalv3/test_uniq_tab_decimalv3.groovy b/regression-test/suites/datatype_p0/decimalv3/test_uniq_tab_decimalv3.groovy
new file mode 100644
index 0000000000..b810ee53f7
--- /dev/null
+++ b/regression-test/suites/datatype_p0/decimalv3/test_uniq_tab_decimalv3.groovy
@@ -0,0 +1,91 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_uniq_tab_decimalv3") {
+
+    def table1 = "test_uniq_tab_decimalv3"
+
+    sql "drop table if exists ${table1}"
+
+    sql """
+    CREATE TABLE IF NOT EXISTS `${table1}` (
+      `decimal32_key` decimalv3(8, 5) NULL COMMENT "",
+      `decimal64_key` decimalv3(16, 5) NULL COMMENT "",
+      `decimal128_key` decimalv3(38, 5) NULL COMMENT "",
+      `decimal32_value` decimalv3(8, 5) NULL COMMENT "",
+      `decimal64_value` decimalv3(16, 5) NULL COMMENT "",
+      `decimal128_value` decimalv3(38, 5) NULL COMMENT ""
+    ) ENGINE=OLAP
+    UNIQUE KEY(`decimal32_key`, `decimal64_key`, `decimal128_key`)
+    COMMENT "OLAP"
+    DISTRIBUTED BY HASH(`decimal32_key`, `decimal64_key`, `decimal128_key`) BUCKETS 8
+    PROPERTIES (
+    "replication_allocation" = "tag.location.default: 1",
+    "in_memory" = "false",
+    "storage_format" = "V2"
+    )
+    """
+    sql "set enable_vectorized_engine = true"
+
+    sql """insert into ${table1} values(1.1,1.2,1.3,1.4,1.5,1.6),
+            (1.1,1.2,1.3,1.4,1.56,1.234),
+            (1.1,1.2,1.3,1.4,1.66,1.534654),
+            (1.1,1.2,1.3,1.4,1.344,1.32432),
+            (1.1,1.2,1.3,1.4,1.456,1.345435),
+            (2.1,1.2,1.3,1.4,1.5,1.234),
+            (2.1,1.2,1.3,1.4,1.66,1.2342),
+            (2.1,1.2,1.3,1.4,1.21,1.123),
+            (NULL, NULL, NULL, NULL, NULL, NULL)
+    """
+    qt_select_all "select * from ${table1} order by decimal32_key"
+
+    qt_select_pred_decimal32_key "select * from ${table1} where decimal32_key = 1.1 order by decimal32_key"
+    qt_select_pred_decimal32_key "select * from ${table1} where decimal32_key < 1.1111111111111111111 order by decimal32_key"
+
+    qt_select_pred_decimal32_value "select * from ${table1} where decimal32_value = 1.4 order by decimal32_key"
+    qt_select_pred_decimal32_value "select * from ${table1} where decimal32_value < 1.444444444444444 order by decimal32_key"
+
+    qt_select_pred_decimal64_key "select * from ${table1} where decimal64_key = 1.2 order by decimal32_key"
+    qt_select_pred_decimal64_key "select * from ${table1} where decimal64_key < 1.222222222222222222 order by decimal32_key"
+
+    qt_select_pred_decimal64_value "select * from ${table1} where decimal64_value = 1.5 order by decimal32_key"
+    qt_select_pred_decimal64_value "select * from ${table1} where decimal64_value < 1.5555555555555555 order by decimal32_key"
+
+    qt_select_pred_decimal128_key "select * from ${table1} where decimal128_key = 1.3 order by decimal32_key"
+    qt_select_pred_decimal128_key "select * from ${table1} where decimal128_key < 1.333333333333 order by decimal32_key"
+
+    qt_select_pred_decimal128_value "select * from ${table1} where decimal128_value = 1.6 order by decimal32_key"
+    qt_select_pred_decimal128_value "select * from ${table1} where decimal128_value < 1.666666666666 order by decimal32_key"
+
+
+    qt_select_between_pred_decimal32_key "select * from ${table1} where decimal32_key between 1.0991 and 1.1111 order by decimal32_key"
+    qt_select_in_pred_decimal32_key1 "select * from ${table1} where decimal32_key in(1.1111) order by decimal32_key"
+    qt_select_in_pred_decimal32_key2 "select * from ${table1} where decimal32_key in(1.10000000000) order by decimal32_key"
+    qt_select_in_pred_decimal32_key3 "select * from ${table1} where decimal32_key in(1.1, 1.4) order by decimal32_key"
+
+    qt_select_between_pred_decimal64_key "select * from ${table1} where decimal64_key between 1.1991 and 1.2111 order by decimal32_key"
+    qt_select_in_pred_decimal64_key1 "select * from ${table1} where decimal64_key in(1.2111) order by decimal32_key"
+    qt_select_in_pred_decimal64_key2 "select * from ${table1} where decimal64_key in(1.20000000000) order by decimal32_key"
+    qt_select_in_pred_decimal64_key3 "select * from ${table1} where decimal64_key in(1.2, 1.4) order by decimal32_key"
+
+    qt_select_between_pred_decimal128_key "select * from ${table1} where decimal128_key between 1.2991 and 1.3111 order by decimal32_key"
+    qt_select_in_pred_decimal128_key1 "select * from ${table1} where decimal128_key in(1.3111) order by decimal32_key"
+    qt_select_in_pred_decimal128_key2 "select * from ${table1} where decimal128_key in(1.30000000000) order by decimal32_key"
+    qt_select_in_pred_decimal128_key3 "select * from ${table1} where decimal128_key in(1.3, 1.4) order by decimal32_key"
+
+    sql "drop table if exists ${table1}"
+}
diff --git a/regression-test/suites/ddl_p0/test_ctas_decimalv3.groovy b/regression-test/suites/ddl_p0/test_ctas_decimalv3.groovy
new file mode 100644
index 0000000000..e359dfc7a5
--- /dev/null
+++ b/regression-test/suites/ddl_p0/test_ctas_decimalv3.groovy
@@ -0,0 +1,66 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_ctas_decimalv3") {
+    def table1 = "test_uniq_tab_decimalv3"
+    def table2 = "test_uniq_tab_decimalv3_2"
+    try {
+        sql """
+    CREATE TABLE ${table1} (
+    c1 DECIMALV3(7,1) NULL,
+    c2 DECIMALV3(15,5) NULL,
+    c3 DECIMALV3(30,1) NULL,
+    v1 DECIMALV3(7,6) NULL COMMENT "",
+    v2 DECIMALV3(18,6) NULL COMMENT "",
+    v3 DECIMALV3(30,6) NULL COMMENT ""
+    ) ENGINE=OLAP
+    DUPLICATE KEY(c1,c2,c3)
+    COMMENT "OLAP"
+    DISTRIBUTED BY HASH(c1,c2,c3) BUCKETS 3
+      PROPERTIES (
+      "replication_allocation" = "tag.location.default: 1",
+      "in_memory" = "false",
+      "storage_format" = "V2"
+    )
+    """
+
+      sql """ insert into ${table1} values (1.1,1.2,1.3,1.4,1.5,1.6) """
+      sql """ insert into ${table1} values (2.1,2.2,2.3,2.4,2.5,2.6) """
+      sql """ insert into ${table1} values (1.1,1.2,1.3,1.4,1.5,1.6) """
+      sql """ insert into ${table1} values (2.1,2.2,2.3,2.4,2.5,2.6) """
+
+      qt_select """select * from ${table1} order by c1;"""
+      sql """
+    CREATE TABLE IF NOT EXISTS `${table2}`
+    PROPERTIES (
+      "replication_allocation" = "tag.location.default: 1",
+      "in_memory" = "false",
+      "storage_format" = "V2"
+    ) as select * from ${table1};
+    """
+
+      qt_select """select * from ${table2} order by c1;"""
+
+
+    } finally {
+        sql """ DROP TABLE IF EXISTS ${table1} """
+
+        sql """ DROP TABLE IF EXISTS ${table2} """
+    }
+
+}
+
diff --git a/regression-test/suites/schema_change_p0/decimalv3/test_agg_keys_schema_change_decimalv3.groovy b/regression-test/suites/schema_change_p0/decimalv3/test_agg_keys_schema_change_decimalv3.groovy
new file mode 100644
index 0000000000..7b3a4bfb6f
--- /dev/null
+++ b/regression-test/suites/schema_change_p0/decimalv3/test_agg_keys_schema_change_decimalv3.groovy
@@ -0,0 +1,209 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+import org.codehaus.groovy.runtime.IOGroovyMethods
+
+suite("test_agg_keys_schema_change_decimalv3") {
+    def tbName = "test_agg_keys_schema_change_decimalv3"
+    def getJobState = { tableName ->
+         def jobStateResult = sql """  SHOW ALTER TABLE COLUMN WHERE IndexName='${tableName}' ORDER BY createtime DESC LIMIT 1 """
+         return jobStateResult[0][9]
+    }
+
+    String[][] backends = sql """ show backends; """
+    assertTrue(backends.size() > 0)
+    String backend_id;
+    def backendId_to_backendIP = [:]
+    def backendId_to_backendHttpPort = [:]
+    for (String[] backend in backends) {
+        backendId_to_backendIP.put(backend[0], backend[2])
+        backendId_to_backendHttpPort.put(backend[0], backend[5])
+    }
+
+    backend_id = backendId_to_backendIP.keySet()[0]
+    StringBuilder showConfigCommand = new StringBuilder();
+    showConfigCommand.append("curl -X GET http://")
+    showConfigCommand.append(backendId_to_backendIP.get(backend_id))
+    showConfigCommand.append(":")
+    showConfigCommand.append(backendId_to_backendHttpPort.get(backend_id))
+    showConfigCommand.append("/api/show_config")
+    logger.info(showConfigCommand.toString())
+    def process = showConfigCommand.toString().execute()
+    int code = process.waitFor()
+    String err = IOGroovyMethods.getText(new BufferedReader(new InputStreamReader(process.getErrorStream())));
+    String out = process.getText()
+    logger.info("Show config: code=" + code + ", out=" + out + ", err=" + err)
+    assertEquals(code, 0)
+    def configList = parseJson(out.trim())
+    assert configList instanceof List
+
+    def do_compact = { tableName ->
+        String[][] tablets = sql """ show tablets from ${tableName}; """
+        for (String[] tablet in tablets) {
+            String tablet_id = tablet[0]
+            backend_id = tablet[2]
+            logger.info("run compaction:" + tablet_id)
+            StringBuilder sb = new StringBuilder();
+            sb.append("curl -X POST http://")
+            sb.append(backendId_to_backendIP.get(backend_id))
+            sb.append(":")
+            sb.append(backendId_to_backendHttpPort.get(backend_id))
+            sb.append("/api/compaction/run?tablet_id=")
+            sb.append(tablet_id)
+            sb.append("&compact_type=cumulative")
+
+            String command = sb.toString()
+            process = command.execute()
+            code = process.waitFor()
+            err = IOGroovyMethods.getText(new BufferedReader(new InputStreamReader(process.getErrorStream())));
+            out = process.getText()
+            logger.info("Run compaction: code=" + code + ", out=" + out + ", err=" + err)
+        }
+
+        // wait for all compactions done
+        for (String[] tablet in tablets) {
+            boolean running = true
+            do {
+                Thread.sleep(100)
+                String tablet_id = tablet[0]
+                backend_id = tablet[2]
+                StringBuilder sb = new StringBuilder();
+                sb.append("curl -X GET http://")
+                sb.append(backendId_to_backendIP.get(backend_id))
+                sb.append(":")
+                sb.append(backendId_to_backendHttpPort.get(backend_id))
+                sb.append("/api/compaction/run_status?tablet_id=")
+                sb.append(tablet_id)
+
+                String command = sb.toString()
+                process = command.execute()
+                code = process.waitFor()
+                err = IOGroovyMethods.getText(new BufferedReader(new InputStreamReader(process.getErrorStream())));
+                out = process.getText()
+                logger.info("Get compaction status: code=" + code + ", out=" + out + ", err=" + err)
+                assertEquals(code, 0)
+                def compactionStatus = parseJson(out.trim())
+                assertEquals("success", compactionStatus.status.toLowerCase())
+                running = compactionStatus.run_status
+            } while (running)
+        }
+    }
+
+    sql """ DROP TABLE IF EXISTS ${tbName} FORCE"""
+    // Create table and disable light weight schema change
+    sql """
+           CREATE TABLE IF NOT EXISTS ${tbName}
+           (
+               `decimalv3k1` DECIMALV3(38,38),
+               `decimalv3k2` DECIMALV3(38,3),
+               `decimalv3v1` DECIMALV3(38,38) SUM,
+               `decimalv3v2` DECIMALV3(38,3) SUM
+           )
+           AGGREGATE  KEY(`decimalv3k1`,`decimalv3k2`)
+           DISTRIBUTED BY HASH(`decimalv3k1`) BUCKETS 1
+           PROPERTIES("replication_num" = "1", "light_schema_change" = "false");
+        """
+    sql """ insert into ${tbName} values(0.111111111111111111111111111111111,11111111111111111111111111111.11,0.111111111111111111111111111111111,11111111111111111111111111111.11);"""
+    qt_sql """select /*+ SET_VAR(enable_vectorized_engine=true) */ * from ${tbName} ORDER BY `decimalv3k1`;"""
+
+    sql """ alter table ${tbName} add column `decimalv3v3` DECIMALV3(38,4) """
+    int max_try_time = 1000
+    while(max_try_time--){
+        String result = getJobState(tbName)
+        if (result == "FINISHED") {
+            break
+        } else {
+            sleep(100)
+            if (max_try_time < 1){
+                assertEquals(1,2)
+            }
+        }
+    }
+    sql """sync"""
+    qt_sql """select /*+ SET_VAR(enable_vectorized_engine=true) */ * from ${tbName} ORDER BY `decimalv3k1`;"""
+    do_compact(tbName)
+    sql """sync"""
+    qt_sql """select /*+ SET_VAR(enable_vectorized_engine=true) */ * from ${tbName} ORDER BY `decimalv3k1`;"""
+    sql """ alter table ${tbName} drop column `decimalv3v3` """
+    max_try_time = 1000
+    while(max_try_time--){
+        String result = getJobState(tbName)
+        if (result == "FINISHED") {
+            break
+        } else {
+            sleep(100)
+            if (max_try_time < 1){
+                assertEquals(1,2)
+            }
+        }
+    }
+
+    sql """sync"""
+    qt_sql """select /*+ SET_VAR(enable_vectorized_engine=true) */ * from ${tbName} ORDER BY `decimalv3k1`;"""
+    sql """ alter table ${tbName} modify column decimalv3k2 DECIMALV3(19,3) key """
+    max_try_time = 1000
+    while(max_try_time--){
+        String result = getJobState(tbName)
+        if (result == "FINISHED") {
+            break
+        } else {
+            sleep(100)
+            if (max_try_time < 1){
+                assertEquals(1,2)
+            }
+        }
+    }
+
+    sql """sync"""
+    qt_sql """select /*+ SET_VAR(enable_vectorized_engine=true) */ * from ${tbName} ORDER BY `decimalv3k1`;"""
+
+    sql """ alter table ${tbName} modify column decimalv3k2 DECIMALV3(38,10) key """
+    max_try_time = 1000
+    while(max_try_time--){
+        String result = getJobState(tbName)
+        if (result == "FINISHED") {
+            break
+        } else {
+            sleep(100)
+            if (max_try_time < 1){
+                assertEquals(1,2)
+            }
+        }
+    }
+
+    sql """sync"""
+    qt_sql """select /*+ SET_VAR(enable_vectorized_engine=true) */ * from ${tbName} ORDER BY `decimalv3k1`;"""
+
+    sql """ alter table ${tbName} modify column decimalv3k2 DECIMALV3(16,3) key """
+    max_try_time = 1000
+    while(max_try_time--){
+        String result = getJobState(tbName)
+        if (result == "FINISHED") {
+            break
+        } else {
+            sleep(100)
+            if (max_try_time < 1){
+                assertEquals(1,2)
+            }
+        }
+    }
+
+    sql """sync"""
+    qt_sql """select /*+ SET_VAR(enable_vectorized_engine=true) */ * from ${tbName} ORDER BY `decimalv3k1`;"""
+
+    sql """ DROP TABLE ${tbName} FORCE """
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org