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

yiguolei 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 007e75666b5 [refactor](be) move storage field type conversion to core 
(#65717)
007e75666b5 is described below

commit 007e75666b5e20cb0a70c3f63e39cd8756345aa4
Author: Chenyang Sun <[email protected]>
AuthorDate: Fri Jul 17 12:01:45 2026 +0800

    [refactor](be) move storage field type conversion to core (#65717)
    
    ### What problem does this PR solve?
    
    Issue Number: close #xxx
    
    Related PR: #xxx
    
    Problem Summary:
    
    ### Release note
    
    None
    
    ### Check List (For Author)
    
    - Test <!-- At least one of them must be included. -->
        - [ ] Regression test
        - [x] Unit Test
        - [ ] Manual test (add detailed scripts or steps below)
        - [ ] No need to test or manual test. Explain why:
    - [ ] This is a refactor/code format and no logic has been changed.
            - [ ] Previous test can cover this change.
            - [ ] No code files have been changed.
            - [ ] Other reason <!-- Add your reason?  -->
    
    - Behavior changed:
        - [ ] No.
        - [ ] Yes. <!-- Explain the behavior change -->
    
    - Does this need documentation?
        - [ ] No.
    - [ ] Yes. <!-- Add document PR link here. eg:
    https://github.com/apache/doris-website/pull/1214 -->
    
    ### Check List (For Reviewer who merge this PR)
    
    - [ ] Confirm the release note
    - [ ] Confirm test cases
    - [ ] Confirm document
    - [ ] Add branch pick label <!-- Add branch pick label that this PR
    should merge into -->
---
 be/src/core/column/column_variant.cpp              |   3 +-
 be/src/core/data_type/data_type.cpp                |   4 +-
 be/src/core/data_type/data_type.h                  |   1 +
 be/src/core/data_type/define_primitive_type.h      |   3 +
 be/src/core/data_type/storage_field_type.cpp       | 202 +++++++++++++++++++++
 be/src/core/data_type/storage_field_type.h         |  32 ++++
 .../data_type_serde/data_type_decimal_serde.cpp    |   4 +-
 .../data_type_serde/data_type_number_serde.cpp     |   3 +-
 be/src/core/data_type_serde/data_type_serde.cpp    |   4 +-
 be/src/exec/common/variant_util.cpp                |   9 +-
 be/src/storage/olap_common.h                       |   4 +-
 be/src/storage/segment/column_reader.h             |   3 +-
 be/src/storage/tablet/tablet_schema.cpp            | 130 +------------
 be/src/storage/tablet/tablet_schema.h              |   2 -
 be/test/core/data_type/storage_field_type_test.cpp | 171 +++++++++++++++++
 15 files changed, 432 insertions(+), 143 deletions(-)

diff --git a/be/src/core/column/column_variant.cpp 
b/be/src/core/column/column_variant.cpp
index ec34c619cdc..39cf985e7f0 100644
--- a/be/src/core/column/column_variant.cpp
+++ b/be/src/core/column/column_variant.cpp
@@ -59,6 +59,7 @@
 #include "core/data_type/define_primitive_type.h"
 #include "core/data_type/get_least_supertype.h"
 #include "core/data_type/primitive_type.h"
+#include "core/data_type/storage_field_type.h"
 #include "core/field.h"
 #include "core/string_buffer.hpp"
 #include "core/types.h"
@@ -2746,7 +2747,7 @@ void 
ColumnVariant::Subcolumn::deserialize_from_binary_column(const ColumnString
     const auto& data_ref = value->get_data_at(row);
     const auto* start_data = reinterpret_cast<const uint8_t*>(data_ref.data);
     const PrimitiveType type =
-            
TabletColumn::get_primitive_type_by_field_type(static_cast<FieldType>(*start_data));
+            
storage_field_type_to_primitive_type(static_cast<FieldType>(*start_data));
     auto check_end = [&](const uint8_t* end_ptr) {
         DCHECK_EQ(end_ptr - reinterpret_cast<const uint8_t*>(data_ref.data), 
data_ref.size);
     };
diff --git a/be/src/core/data_type/data_type.cpp 
b/be/src/core/data_type/data_type.cpp
index 94f7b6c38c9..941a0377b05 100644
--- a/be/src/core/data_type/data_type.cpp
+++ b/be/src/core/data_type/data_type.cpp
@@ -32,9 +32,9 @@
 #include "core/column/column.h"
 #include "core/column/column_const.h"
 #include "core/data_type/define_primitive_type.h"
+#include "core/data_type/storage_field_type.h"
 #include "core/data_type_serde/data_type_serde.h"
 #include "core/field.h"
-#include "storage/tablet/tablet_schema.h"
 
 namespace doris {
 class BufferWritable;
@@ -47,7 +47,7 @@ IDataType::IDataType() = default;
 IDataType::~IDataType() = default;
 
 doris::FieldType IDataType::get_storage_field_type() const {
-    return TabletColumn::get_field_type_by_type(get_primitive_type());
+    return primitive_type_to_storage_field_type(get_primitive_type());
 }
 
 String IDataType::get_name() const {
diff --git a/be/src/core/data_type/data_type.h 
b/be/src/core/data_type/data_type.h
index 253bd8e49f9..e1042bf4161 100644
--- a/be/src/core/data_type/data_type.h
+++ b/be/src/core/data_type/data_type.h
@@ -38,6 +38,7 @@
 #include "core/cow.h"
 #include "core/data_type/define_primitive_type.h"
 #include "core/data_type/primitive_type.h"
+#include "core/data_type/storage_field_type.h"
 #include "core/data_type_serde/data_type_serde.h"
 #include "core/types.h"
 
diff --git a/be/src/core/data_type/define_primitive_type.h 
b/be/src/core/data_type/define_primitive_type.h
index b47218afc1b..852b68a96b5 100644
--- a/be/src/core/data_type/define_primitive_type.h
+++ b/be/src/core/data_type/define_primitive_type.h
@@ -23,6 +23,9 @@ namespace doris {
 
 using PrimitiveNative = uint8_t;
 
+// Compute-layer types. When adding a new value, decide how it maps to 
FieldType and explicitly
+// define its behavior in primitive_type_to_storage_field_type() and
+// storage_field_type_to_primitive_type(), either by providing a mapping or by 
throwing.
 enum PrimitiveType : PrimitiveNative {
     INVALID_TYPE = 0,
     TYPE_NULL,     /* 1 */
diff --git a/be/src/core/data_type/storage_field_type.cpp 
b/be/src/core/data_type/storage_field_type.cpp
new file mode 100644
index 00000000000..269015401dc
--- /dev/null
+++ b/be/src/core/data_type/storage_field_type.cpp
@@ -0,0 +1,202 @@
+// 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.
+
+#include "core/data_type/storage_field_type.h"
+
+#include "common/exception.h"
+#include "storage/olap_common.h"
+
+namespace doris {
+
+// NOLINTNEXTLINE(readability-function-size): keep the exhaustive mapping 
together for auditability.
+FieldType primitive_type_to_storage_field_type(PrimitiveType type) {
+    switch (type) {
+    case PrimitiveType::INVALID_TYPE:
+        return FieldType::OLAP_FIELD_TYPE_UNKNOWN;
+    case PrimitiveType::TYPE_NULL:
+        return FieldType::OLAP_FIELD_TYPE_NONE;
+    case PrimitiveType::TYPE_BOOLEAN:
+        return FieldType::OLAP_FIELD_TYPE_BOOL;
+    case PrimitiveType::TYPE_TINYINT:
+        return FieldType::OLAP_FIELD_TYPE_TINYINT;
+    case PrimitiveType::TYPE_SMALLINT:
+        return FieldType::OLAP_FIELD_TYPE_SMALLINT;
+    case PrimitiveType::TYPE_INT:
+        return FieldType::OLAP_FIELD_TYPE_INT;
+    case PrimitiveType::TYPE_BIGINT:
+        return FieldType::OLAP_FIELD_TYPE_BIGINT;
+    case PrimitiveType::TYPE_LARGEINT:
+        return FieldType::OLAP_FIELD_TYPE_LARGEINT;
+    case PrimitiveType::TYPE_FLOAT:
+        return FieldType::OLAP_FIELD_TYPE_FLOAT;
+    case PrimitiveType::TYPE_DOUBLE:
+        return FieldType::OLAP_FIELD_TYPE_DOUBLE;
+    case PrimitiveType::TYPE_VARCHAR:
+        return FieldType::OLAP_FIELD_TYPE_VARCHAR;
+    case PrimitiveType::TYPE_DATE:
+        return FieldType::OLAP_FIELD_TYPE_DATE;
+    case PrimitiveType::TYPE_DATETIME:
+        return FieldType::OLAP_FIELD_TYPE_DATETIME;
+    case PrimitiveType::TYPE_CHAR:
+        return FieldType::OLAP_FIELD_TYPE_CHAR;
+    case PrimitiveType::TYPE_STRUCT:
+        return FieldType::OLAP_FIELD_TYPE_STRUCT;
+    case PrimitiveType::TYPE_ARRAY:
+        return FieldType::OLAP_FIELD_TYPE_ARRAY;
+    case PrimitiveType::TYPE_MAP:
+        return FieldType::OLAP_FIELD_TYPE_MAP;
+    case PrimitiveType::TYPE_HLL:
+        return FieldType::OLAP_FIELD_TYPE_HLL;
+    case PrimitiveType::TYPE_DECIMALV2:
+        return FieldType::OLAP_FIELD_TYPE_DECIMAL;
+    case PrimitiveType::TYPE_BITMAP:
+        return FieldType::OLAP_FIELD_TYPE_BITMAP;
+    case PrimitiveType::TYPE_STRING:
+        return FieldType::OLAP_FIELD_TYPE_STRING;
+    case PrimitiveType::TYPE_QUANTILE_STATE:
+        return FieldType::OLAP_FIELD_TYPE_QUANTILE_STATE;
+    case PrimitiveType::TYPE_DATEV2:
+        return FieldType::OLAP_FIELD_TYPE_DATEV2;
+    case PrimitiveType::TYPE_DATETIMEV2:
+        return FieldType::OLAP_FIELD_TYPE_DATETIMEV2;
+    case PrimitiveType::TYPE_TIMEV2:
+        return FieldType::OLAP_FIELD_TYPE_TIMEV2;
+    case PrimitiveType::TYPE_DECIMAL32:
+        return FieldType::OLAP_FIELD_TYPE_DECIMAL32;
+    case PrimitiveType::TYPE_DECIMAL64:
+        return FieldType::OLAP_FIELD_TYPE_DECIMAL64;
+    case PrimitiveType::TYPE_DECIMAL128I:
+        return FieldType::OLAP_FIELD_TYPE_DECIMAL128I;
+    case PrimitiveType::TYPE_JSONB:
+        return FieldType::OLAP_FIELD_TYPE_JSONB;
+    case PrimitiveType::TYPE_VARIANT:
+        return FieldType::OLAP_FIELD_TYPE_VARIANT;
+    case PrimitiveType::TYPE_AGG_STATE:
+        return FieldType::OLAP_FIELD_TYPE_AGG_STATE;
+    case PrimitiveType::TYPE_DECIMAL256:
+        return FieldType::OLAP_FIELD_TYPE_DECIMAL256;
+    case PrimitiveType::TYPE_IPV4:
+        return FieldType::OLAP_FIELD_TYPE_IPV4;
+    case PrimitiveType::TYPE_IPV6:
+        return FieldType::OLAP_FIELD_TYPE_IPV6;
+    case PrimitiveType::TYPE_UINT32:
+        return FieldType::OLAP_FIELD_TYPE_UNSIGNED_INT;
+    case PrimitiveType::TYPE_UINT64:
+        return FieldType::OLAP_FIELD_TYPE_UNSIGNED_BIGINT;
+    case PrimitiveType::TYPE_TIMESTAMPTZ:
+        return FieldType::OLAP_FIELD_TYPE_TIMESTAMPTZ;
+    case PrimitiveType::TYPE_BINARY:
+    case static_cast<PrimitiveType>(14): // TYPE_DECIMAL (deprecated)
+    case static_cast<PrimitiveType>(21): // TYPE_TIME (deprecated)
+    case static_cast<PrimitiveType>(33): // TYPE_LAMBDA_FUNCTION (deprecated)
+    case PrimitiveType::TYPE_FIXED_LENGTH_OBJECT:
+    case PrimitiveType::TYPE_VARBINARY:
+        break;
+    }
+
+    throw Exception(ErrorCode::INTERNAL_ERROR, "Cannot convert PrimitiveType 
{} to FieldType",
+                    static_cast<int>(type));
+}
+
+// NOLINTNEXTLINE(readability-function-size): keep the exhaustive mapping 
together for auditability.
+PrimitiveType storage_field_type_to_primitive_type(FieldType type) {
+    switch (type) {
+    case FieldType::OLAP_FIELD_TYPE_TINYINT:
+        return PrimitiveType::TYPE_TINYINT;
+    case FieldType::OLAP_FIELD_TYPE_SMALLINT:
+        return PrimitiveType::TYPE_SMALLINT;
+    case FieldType::OLAP_FIELD_TYPE_INT:
+        return PrimitiveType::TYPE_INT;
+    case FieldType::OLAP_FIELD_TYPE_UNSIGNED_INT:
+        return PrimitiveType::TYPE_UINT32;
+    case FieldType::OLAP_FIELD_TYPE_BIGINT:
+        return PrimitiveType::TYPE_BIGINT;
+    case FieldType::OLAP_FIELD_TYPE_UNSIGNED_BIGINT:
+        return PrimitiveType::TYPE_UINT64;
+    case FieldType::OLAP_FIELD_TYPE_LARGEINT:
+        return PrimitiveType::TYPE_LARGEINT;
+    case FieldType::OLAP_FIELD_TYPE_FLOAT:
+        return PrimitiveType::TYPE_FLOAT;
+    case FieldType::OLAP_FIELD_TYPE_DOUBLE:
+        return PrimitiveType::TYPE_DOUBLE;
+    case FieldType::OLAP_FIELD_TYPE_CHAR:
+        return PrimitiveType::TYPE_CHAR;
+    case FieldType::OLAP_FIELD_TYPE_DATE:
+        return PrimitiveType::TYPE_DATE;
+    case FieldType::OLAP_FIELD_TYPE_DATETIME:
+        return PrimitiveType::TYPE_DATETIME;
+    case FieldType::OLAP_FIELD_TYPE_DECIMAL:
+        return PrimitiveType::TYPE_DECIMALV2;
+    case FieldType::OLAP_FIELD_TYPE_VARCHAR:
+        return PrimitiveType::TYPE_VARCHAR;
+    case FieldType::OLAP_FIELD_TYPE_STRUCT:
+        return PrimitiveType::TYPE_STRUCT;
+    case FieldType::OLAP_FIELD_TYPE_ARRAY:
+        return PrimitiveType::TYPE_ARRAY;
+    case FieldType::OLAP_FIELD_TYPE_MAP:
+        return PrimitiveType::TYPE_MAP;
+    case FieldType::OLAP_FIELD_TYPE_UNKNOWN:
+        return PrimitiveType::INVALID_TYPE;
+    case FieldType::OLAP_FIELD_TYPE_NONE:
+        return PrimitiveType::TYPE_NULL;
+    case FieldType::OLAP_FIELD_TYPE_HLL:
+        return PrimitiveType::TYPE_HLL;
+    case FieldType::OLAP_FIELD_TYPE_BOOL:
+        return PrimitiveType::TYPE_BOOLEAN;
+    case FieldType::OLAP_FIELD_TYPE_BITMAP:
+        return PrimitiveType::TYPE_BITMAP;
+    case FieldType::OLAP_FIELD_TYPE_STRING:
+        return PrimitiveType::TYPE_STRING;
+    case FieldType::OLAP_FIELD_TYPE_QUANTILE_STATE:
+        return PrimitiveType::TYPE_QUANTILE_STATE;
+    case FieldType::OLAP_FIELD_TYPE_DATEV2:
+        return PrimitiveType::TYPE_DATEV2;
+    case FieldType::OLAP_FIELD_TYPE_DATETIMEV2:
+        return PrimitiveType::TYPE_DATETIMEV2;
+    case FieldType::OLAP_FIELD_TYPE_TIMEV2:
+        return PrimitiveType::TYPE_TIMEV2;
+    case FieldType::OLAP_FIELD_TYPE_DECIMAL32:
+        return PrimitiveType::TYPE_DECIMAL32;
+    case FieldType::OLAP_FIELD_TYPE_DECIMAL64:
+        return PrimitiveType::TYPE_DECIMAL64;
+    case FieldType::OLAP_FIELD_TYPE_DECIMAL128I:
+        return PrimitiveType::TYPE_DECIMAL128I;
+    case FieldType::OLAP_FIELD_TYPE_JSONB:
+        return PrimitiveType::TYPE_JSONB;
+    case FieldType::OLAP_FIELD_TYPE_VARIANT:
+        return PrimitiveType::TYPE_VARIANT;
+    case FieldType::OLAP_FIELD_TYPE_AGG_STATE:
+        return PrimitiveType::TYPE_AGG_STATE;
+    case FieldType::OLAP_FIELD_TYPE_DECIMAL256:
+        return PrimitiveType::TYPE_DECIMAL256;
+    case FieldType::OLAP_FIELD_TYPE_IPV4:
+        return PrimitiveType::TYPE_IPV4;
+    case FieldType::OLAP_FIELD_TYPE_IPV6:
+        return PrimitiveType::TYPE_IPV6;
+    case FieldType::OLAP_FIELD_TYPE_TIMESTAMPTZ:
+        return PrimitiveType::TYPE_TIMESTAMPTZ;
+    case FieldType::OLAP_FIELD_TYPE_UNSIGNED_TINYINT:
+    case FieldType::OLAP_FIELD_TYPE_UNSIGNED_SMALLINT:
+    case FieldType::OLAP_FIELD_TYPE_DISCRETE_DOUBLE:
+        break;
+    }
+
+    throw Exception(ErrorCode::INTERNAL_ERROR, "Cannot convert FieldType {} to 
PrimitiveType",
+                    static_cast<int>(type));
+}
+
+} // namespace doris
diff --git a/be/src/core/data_type/storage_field_type.h 
b/be/src/core/data_type/storage_field_type.h
new file mode 100644
index 00000000000..a1d48e53eea
--- /dev/null
+++ b/be/src/core/data_type/storage_field_type.h
@@ -0,0 +1,32 @@
+// 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.
+
+#pragma once
+
+#include "core/data_type/define_primitive_type.h"
+
+namespace doris {
+
+enum class FieldType;
+
+// Throws Exception when the primitive type has no storage field type mapping.
+[[nodiscard]] FieldType primitive_type_to_storage_field_type(PrimitiveType 
type);
+
+// Throws Exception when the storage field type has no primitive type mapping.
+[[nodiscard]] PrimitiveType storage_field_type_to_primitive_type(FieldType 
type);
+
+} // namespace doris
diff --git a/be/src/core/data_type_serde/data_type_decimal_serde.cpp 
b/be/src/core/data_type_serde/data_type_decimal_serde.cpp
index 35208450c39..221213b899a 100644
--- a/be/src/core/data_type_serde/data_type_decimal_serde.cpp
+++ b/be/src/core/data_type_serde/data_type_decimal_serde.cpp
@@ -33,6 +33,7 @@
 #include "core/column/column_decimal.h"
 #include "core/data_type/data_type_decimal.h"
 #include "core/data_type/define_primitive_type.h"
+#include "core/data_type/storage_field_type.h"
 #include "core/data_type_serde/arrow_validation.h"
 #include "core/data_type_serde/decoded_column_view.h"
 #include "core/types.h"
@@ -40,7 +41,6 @@
 #include "exprs/function/cast/cast_to_decimal.h"
 #include "exprs/function/cast/cast_to_string.h"
 #include "orc/Int128.hh"
-#include "storage/tablet/tablet_schema.h"
 #include "util/jsonb_document.h"
 #include "util/jsonb_document_cast.h"
 #include "util/jsonb_writer.h"
@@ -853,7 +853,7 @@ template <PrimitiveType T>
 void DataTypeDecimalSerDe<T>::write_one_cell_to_binary(const IColumn& 
src_column,
                                                        ColumnString::Chars& 
chars,
                                                        int64_t row_num) const {
-    const uint8_t type = (const 
uint8_t)TabletColumn::get_field_type_by_type(T);
+    const uint8_t type = 
static_cast<uint8_t>(primitive_type_to_storage_field_type(T));
     const auto& data_ref = assert_cast<const 
ColumnDecimal<T>&>(src_column).get_data_at(row_num);
     const auto& prec = static_cast<uint8_t>(precision);
     const auto& sc = static_cast<uint8_t>(scale);
diff --git a/be/src/core/data_type_serde/data_type_number_serde.cpp 
b/be/src/core/data_type_serde/data_type_number_serde.cpp
index 55b156b01f9..6d589637f8a 100644
--- a/be/src/core/data_type_serde/data_type_number_serde.cpp
+++ b/be/src/core/data_type_serde/data_type_number_serde.cpp
@@ -29,6 +29,7 @@
 #include "core/column/column_nullable.h"
 #include "core/data_type/define_primitive_type.h"
 #include "core/data_type/primitive_type.h"
+#include "core/data_type/storage_field_type.h"
 #include "core/data_type_serde/arrow_validation.h"
 #include "core/data_type_serde/data_type_serde.h"
 #include "core/data_type_serde/decoded_column_view.h"
@@ -1124,7 +1125,7 @@ template <PrimitiveType T>
 void DataTypeNumberSerDe<T>::write_one_cell_to_binary(const IColumn& 
src_column,
                                                       ColumnString::Chars& 
chars,
                                                       int64_t row_num) const {
-    const uint8_t type = (const 
uint8_t)TabletColumn::get_field_type_by_type(T);
+    const uint8_t type = 
static_cast<uint8_t>(primitive_type_to_storage_field_type(T));
     const auto& data_ref = assert_cast<const 
ColumnType&>(src_column).get_data_at(row_num);
 
     const size_t old_size = chars.size();
diff --git a/be/src/core/data_type_serde/data_type_serde.cpp 
b/be/src/core/data_type_serde/data_type_serde.cpp
index 16526bc172b..6c41b4e9f14 100644
--- a/be/src/core/data_type_serde/data_type_serde.cpp
+++ b/be/src/core/data_type_serde/data_type_serde.cpp
@@ -42,6 +42,7 @@
 #include "core/data_type/data_type_map.h"
 #include "core/data_type/data_type_nullable.h"
 #include "core/data_type/data_type_struct.h"
+#include "core/data_type/storage_field_type.h"
 #include "core/data_type_serde/data_type_array_serde.h"
 #include "core/data_type_serde/data_type_datetimev2_serde.h"
 #include "core/data_type_serde/data_type_datev2_serde.h"
@@ -57,6 +58,7 @@
 #include "core/value/vdatetime_value.h"
 #include "exprs/function/cast/cast_base.h"
 #include "runtime/descriptors.h"
+#include "storage/olap_common.h"
 #include "util/jsonb_document.h"
 #include "util/jsonb_writer.h"
 namespace doris {
@@ -1130,7 +1132,7 @@ const uint8_t* 
DataTypeSerDe::deserialize_binary_to_column(const uint8_t* data,
 const uint8_t* DataTypeSerDe::deserialize_binary_to_field(const uint8_t* data, 
Field& field,
                                                           FieldInfo& info) {
     const FieldType type = static_cast<FieldType>(*data++);
-    info.scalar_type_id = TabletColumn::get_primitive_type_by_field_type(type);
+    info.scalar_type_id = storage_field_type_to_primitive_type(type);
     const uint8_t* end = data;
     switch (type) {
 #define HANDLE_SIMPLE_SERDE(FT, SERDE)                               \
diff --git a/be/src/exec/common/variant_util.cpp 
b/be/src/exec/common/variant_util.cpp
index 4ba50f5f57d..86c274875da 100644
--- a/be/src/exec/common/variant_util.cpp
+++ b/be/src/exec/common/variant_util.cpp
@@ -72,6 +72,7 @@
 #include "core/data_type/define_primitive_type.h"
 #include "core/data_type/get_least_supertype.h"
 #include "core/data_type/primitive_type.h"
+#include "core/data_type/storage_field_type.h"
 #include "core/field.h"
 #include "core/typeid_cast.h"
 #include "core/types.h"
@@ -1902,26 +1903,26 @@ static void append_field_to_binary_chars(const Field& 
field, ColumnString::Chars
     }
     case PrimitiveType::TYPE_BOOLEAN: {
         append_binary_type(chars,
-                           
TabletColumn::get_field_type_by_type(PrimitiveType::TYPE_BOOLEAN));
+                           
primitive_type_to_storage_field_type(PrimitiveType::TYPE_BOOLEAN));
         const auto v = 
static_cast<UInt8>(field.get<PrimitiveType::TYPE_BOOLEAN>());
         append_binary_bytes(chars, &v, sizeof(UInt8));
         return;
     }
     case PrimitiveType::TYPE_BIGINT: {
-        append_binary_type(chars, 
TabletColumn::get_field_type_by_type(PrimitiveType::TYPE_BIGINT));
+        append_binary_type(chars, 
primitive_type_to_storage_field_type(PrimitiveType::TYPE_BIGINT));
         const auto v = field.get<PrimitiveType::TYPE_BIGINT>();
         append_binary_bytes(chars, &v, sizeof(Int64));
         return;
     }
     case PrimitiveType::TYPE_LARGEINT: {
         append_binary_type(chars,
-                           
TabletColumn::get_field_type_by_type(PrimitiveType::TYPE_LARGEINT));
+                           
primitive_type_to_storage_field_type(PrimitiveType::TYPE_LARGEINT));
         const auto v = field.get<PrimitiveType::TYPE_LARGEINT>();
         append_binary_bytes(chars, &v, sizeof(int128_t));
         return;
     }
     case PrimitiveType::TYPE_DOUBLE: {
-        append_binary_type(chars, 
TabletColumn::get_field_type_by_type(PrimitiveType::TYPE_DOUBLE));
+        append_binary_type(chars, 
primitive_type_to_storage_field_type(PrimitiveType::TYPE_DOUBLE));
         const auto v = field.get<PrimitiveType::TYPE_DOUBLE>();
         append_binary_bytes(chars, &v, sizeof(Float64));
         return;
diff --git a/be/src/storage/olap_common.h b/be/src/storage/olap_common.h
index b34f6ce15ea..c13963b3bff 100644
--- a/be/src/storage/olap_common.h
+++ b/be/src/storage/olap_common.h
@@ -122,7 +122,9 @@ struct TabletSize {
 
 // Storage-engine cell types, used by TabletColumn / KeyCoder and the
 // data_type traits chain. When adding a new value, also extend CppTypeTraits,
-// FieldTypeTraits and the field_type_size() switch in storage/types.h.
+// FieldTypeTraits and the field_type_size() switch in storage/types.h. Decide 
how it maps to
+// PrimitiveType and explicitly define its behavior in 
primitive_type_to_storage_field_type() and
+// storage_field_type_to_primitive_type(), either by providing a mapping or by 
throwing.
 enum class FieldType {
     OLAP_FIELD_TYPE_TINYINT = 1, // MYSQL_TYPE_TINY
     OLAP_FIELD_TYPE_UNSIGNED_TINYINT = 2,
diff --git a/be/src/storage/segment/column_reader.h 
b/be/src/storage/segment/column_reader.h
index 777f8eddf02..327c44c4fee 100644
--- a/be/src/storage/segment/column_reader.h
+++ b/be/src/storage/segment/column_reader.h
@@ -37,6 +37,7 @@
 #include "common/status.h"            // for Status
 #include "core/column/column_array.h" // ColumnArray
 #include "core/data_type/data_type.h"
+#include "core/data_type/storage_field_type.h"
 #include "io/cache/cached_remote_file_reader.h"
 #include "io/fs/file_reader_writer_fwd.h"
 #include "io/io_common.h"
@@ -1094,7 +1095,7 @@ public:
     // when config::enable_column_type_check is on (default true), so derive 
the real OLAP type from
     // the constant value to avoid a spurious "different type between schema 
and column reader" error.
     FieldType get_meta_type() override {
-        return TabletColumn::get_field_type_by_type(_value.get_type());
+        return primitive_type_to_storage_field_type(_value.get_type());
     }
 
     Status match_condition(const AndBlockColumnPredicate* col_predicates,
diff --git a/be/src/storage/tablet/tablet_schema.cpp 
b/be/src/storage/tablet/tablet_schema.cpp
index 3158b229837..8dec9913f88 100644
--- a/be/src/storage/tablet/tablet_schema.cpp
+++ b/be/src/storage/tablet/tablet_schema.cpp
@@ -55,134 +55,6 @@
 #include "util/json/path_in_data.h"
 
 namespace doris {
-FieldType TabletColumn::get_field_type_by_type(PrimitiveType primitiveType) {
-    switch (primitiveType) {
-    case PrimitiveType::INVALID_TYPE:
-        return FieldType::OLAP_FIELD_TYPE_UNKNOWN;
-    case PrimitiveType::TYPE_NULL:
-        return FieldType::OLAP_FIELD_TYPE_NONE;
-    case PrimitiveType::TYPE_BOOLEAN:
-        return FieldType::OLAP_FIELD_TYPE_BOOL;
-    case PrimitiveType::TYPE_TINYINT:
-        return FieldType::OLAP_FIELD_TYPE_TINYINT;
-    case PrimitiveType::TYPE_SMALLINT:
-        return FieldType::OLAP_FIELD_TYPE_SMALLINT;
-    case PrimitiveType::TYPE_INT:
-        return FieldType::OLAP_FIELD_TYPE_INT;
-    case PrimitiveType::TYPE_BIGINT:
-        return FieldType::OLAP_FIELD_TYPE_BIGINT;
-    case PrimitiveType::TYPE_LARGEINT:
-        return FieldType::OLAP_FIELD_TYPE_LARGEINT;
-    case PrimitiveType::TYPE_FLOAT:
-        return FieldType::OLAP_FIELD_TYPE_FLOAT;
-    case PrimitiveType::TYPE_DOUBLE:
-        return FieldType::OLAP_FIELD_TYPE_DOUBLE;
-    case PrimitiveType::TYPE_VARCHAR:
-        return FieldType::OLAP_FIELD_TYPE_VARCHAR;
-    case PrimitiveType::TYPE_DATE:
-        return FieldType::OLAP_FIELD_TYPE_DATE;
-    case PrimitiveType::TYPE_DATETIME:
-        return FieldType::OLAP_FIELD_TYPE_DATETIME;
-    case PrimitiveType::TYPE_BINARY:
-        return FieldType::OLAP_FIELD_TYPE_UNKNOWN; // Not implemented
-    case PrimitiveType::TYPE_CHAR:
-        return FieldType::OLAP_FIELD_TYPE_CHAR;
-    case PrimitiveType::TYPE_STRUCT:
-        return FieldType::OLAP_FIELD_TYPE_STRUCT;
-    case PrimitiveType::TYPE_ARRAY:
-        return FieldType::OLAP_FIELD_TYPE_ARRAY;
-    case PrimitiveType::TYPE_MAP:
-        return FieldType::OLAP_FIELD_TYPE_MAP;
-    case PrimitiveType::TYPE_HLL:
-        return FieldType::OLAP_FIELD_TYPE_HLL;
-    case PrimitiveType::TYPE_DECIMALV2:
-        return FieldType::OLAP_FIELD_TYPE_UNKNOWN; // Not implemented
-    case PrimitiveType::TYPE_BITMAP:
-        return FieldType::OLAP_FIELD_TYPE_BITMAP;
-    case PrimitiveType::TYPE_STRING:
-        return FieldType::OLAP_FIELD_TYPE_STRING;
-    case PrimitiveType::TYPE_QUANTILE_STATE:
-        return FieldType::OLAP_FIELD_TYPE_QUANTILE_STATE;
-    case PrimitiveType::TYPE_DATEV2:
-        return FieldType::OLAP_FIELD_TYPE_DATEV2;
-    case PrimitiveType::TYPE_DATETIMEV2:
-        return FieldType::OLAP_FIELD_TYPE_DATETIMEV2;
-    case PrimitiveType::TYPE_TIMESTAMPTZ:
-        return FieldType::OLAP_FIELD_TYPE_TIMESTAMPTZ;
-    case PrimitiveType::TYPE_TIMEV2:
-        return FieldType::OLAP_FIELD_TYPE_TIMEV2;
-    case PrimitiveType::TYPE_DECIMAL32:
-        return FieldType::OLAP_FIELD_TYPE_DECIMAL32;
-    case PrimitiveType::TYPE_DECIMAL64:
-        return FieldType::OLAP_FIELD_TYPE_DECIMAL64;
-    case PrimitiveType::TYPE_DECIMAL128I:
-        return FieldType::OLAP_FIELD_TYPE_DECIMAL128I;
-    case PrimitiveType::TYPE_DECIMAL256:
-        return FieldType::OLAP_FIELD_TYPE_DECIMAL256;
-    case PrimitiveType::TYPE_JSONB:
-        return FieldType::OLAP_FIELD_TYPE_JSONB;
-    case PrimitiveType::TYPE_VARIANT:
-        return FieldType::OLAP_FIELD_TYPE_VARIANT;
-    case PrimitiveType::TYPE_IPV4:
-        return FieldType::OLAP_FIELD_TYPE_IPV4;
-    case PrimitiveType::TYPE_IPV6:
-        return FieldType::OLAP_FIELD_TYPE_IPV6;
-    case PrimitiveType::TYPE_AGG_STATE:
-        return FieldType::OLAP_FIELD_TYPE_AGG_STATE;
-    default:
-        return FieldType::OLAP_FIELD_TYPE_UNKNOWN;
-    }
-}
-
-PrimitiveType TabletColumn::get_primitive_type_by_field_type(FieldType type) {
-    static const PrimitiveType mapping[] = {
-            /*  0 */ PrimitiveType::INVALID_TYPE,
-            /*  1 OLAP_FIELD_TYPE_TINYINT           */ 
PrimitiveType::TYPE_TINYINT,
-            /*  2 OLAP_FIELD_TYPE_UNSIGNED_TINYINT  */ 
PrimitiveType::INVALID_TYPE,
-            /*  3 OLAP_FIELD_TYPE_SMALLINT          */ 
PrimitiveType::TYPE_SMALLINT,
-            /*  4 OLAP_FIELD_TYPE_UNSIGNED_SMALLINT */ 
PrimitiveType::INVALID_TYPE,
-            /*  5 OLAP_FIELD_TYPE_INT               */ PrimitiveType::TYPE_INT,
-            /*  6 OLAP_FIELD_TYPE_UNSIGNED_INT      */ 
PrimitiveType::INVALID_TYPE,
-            /*  7 OLAP_FIELD_TYPE_BIGINT            */ 
PrimitiveType::TYPE_BIGINT,
-            /*  8 OLAP_FIELD_TYPE_UNSIGNED_BIGINT   */ 
PrimitiveType::INVALID_TYPE,
-            /*  9 OLAP_FIELD_TYPE_LARGEINT          */ 
PrimitiveType::TYPE_LARGEINT,
-            /* 10 OLAP_FIELD_TYPE_FLOAT             */ 
PrimitiveType::TYPE_FLOAT,
-            /* 11 OLAP_FIELD_TYPE_DOUBLE            */ 
PrimitiveType::TYPE_DOUBLE,
-            /* 12 OLAP_FIELD_TYPE_DISCRETE_DOUBLE   */ 
PrimitiveType::INVALID_TYPE,
-            /* 13 OLAP_FIELD_TYPE_CHAR              */ 
PrimitiveType::TYPE_CHAR,
-            /* 14 OLAP_FIELD_TYPE_DATE              */ 
PrimitiveType::TYPE_DATE,
-            /* 15 OLAP_FIELD_TYPE_DATETIME          */ 
PrimitiveType::TYPE_DATETIME,
-            /* 16 OLAP_FIELD_TYPE_DECIMAL           */ 
PrimitiveType::INVALID_TYPE,
-            /* 17 OLAP_FIELD_TYPE_VARCHAR           */ 
PrimitiveType::TYPE_VARCHAR,
-            /* 18 OLAP_FIELD_TYPE_STRUCT            */ 
PrimitiveType::TYPE_STRUCT,
-            /* 19 OLAP_FIELD_TYPE_ARRAY             */ 
PrimitiveType::TYPE_ARRAY,
-            /* 20 OLAP_FIELD_TYPE_MAP               */ PrimitiveType::TYPE_MAP,
-            /* 21 OLAP_FIELD_TYPE_UNKNOWN           */ 
PrimitiveType::INVALID_TYPE,
-            /* 22 OLAP_FIELD_TYPE_NONE              */ 
PrimitiveType::TYPE_NULL,
-            /* 23 OLAP_FIELD_TYPE_HLL               */ PrimitiveType::TYPE_HLL,
-            /* 24 OLAP_FIELD_TYPE_BOOL              */ 
PrimitiveType::TYPE_BOOLEAN,
-            /* 25 OLAP_FIELD_TYPE_BITMAP            */ 
PrimitiveType::TYPE_BITMAP,
-            /* 26 OLAP_FIELD_TYPE_STRING            */ 
PrimitiveType::TYPE_STRING,
-            /* 27 OLAP_FIELD_TYPE_QUANTILE_STATE    */ 
PrimitiveType::TYPE_QUANTILE_STATE,
-            /* 28 OLAP_FIELD_TYPE_DATEV2            */ 
PrimitiveType::TYPE_DATEV2,
-            /* 29 OLAP_FIELD_TYPE_DATETIMEV2        */ 
PrimitiveType::TYPE_DATETIMEV2,
-            /* 30 OLAP_FIELD_TYPE_TIMEV2            */ 
PrimitiveType::TYPE_TIMEV2,
-            /* 31 OLAP_FIELD_TYPE_DECIMAL32         */ 
PrimitiveType::TYPE_DECIMAL32,
-            /* 32 OLAP_FIELD_TYPE_DECIMAL64         */ 
PrimitiveType::TYPE_DECIMAL64,
-            /* 33 OLAP_FIELD_TYPE_DECIMAL128I       */ 
PrimitiveType::TYPE_DECIMAL128I,
-            /* 34 OLAP_FIELD_TYPE_JSONB             */ 
PrimitiveType::TYPE_JSONB,
-            /* 35 OLAP_FIELD_TYPE_VARIANT           */ 
PrimitiveType::TYPE_VARIANT,
-            /* 36 OLAP_FIELD_TYPE_AGG_STATE         */ 
PrimitiveType::TYPE_AGG_STATE,
-            /* 37 OLAP_FIELD_TYPE_DECIMAL256        */ 
PrimitiveType::TYPE_DECIMAL256,
-            /* 38 OLAP_FIELD_TYPE_IPV4              */ 
PrimitiveType::TYPE_IPV4,
-            /* 39 OLAP_FIELD_TYPE_IPV6              */ 
PrimitiveType::TYPE_IPV6,
-            /* 40 OLAP_FIELD_TYPE_TIMESTAMPTZ       */ 
PrimitiveType::TYPE_TIMESTAMPTZ,
-    };
-
-    int idx = static_cast<int>(type);
-    return mapping[idx];
-}
-
 FieldType TabletColumn::get_field_type_by_string(const std::string& type_str) {
     std::string upper_type_str = type_str;
     std::transform(type_str.begin(), type_str.end(), upper_type_str.begin(),
@@ -238,6 +110,8 @@ FieldType TabletColumn::get_field_type_by_string(const 
std::string& type_str) {
     } else if (0 == upper_type_str.compare("DECIMAL256")) {
         type = FieldType::OLAP_FIELD_TYPE_DECIMAL256;
     } else if (0 == upper_type_str.compare(0, 7, "DECIMAL")) {
+        // Keep this generic prefix match after all specific DECIMAL types; 
otherwise DECIMAL32,
+        // DECIMAL64, DECIMAL128I, and DECIMAL256 would all be classified as 
DECIMAL.
         type = FieldType::OLAP_FIELD_TYPE_DECIMAL;
     } else if (0 == upper_type_str.compare(0, 7, "VARCHAR")) {
         type = FieldType::OLAP_FIELD_TYPE_VARCHAR;
diff --git a/be/src/storage/tablet/tablet_schema.h 
b/be/src/storage/tablet/tablet_schema.h
index bf4598e2bb9..caa7c9b54f6 100644
--- a/be/src/storage/tablet/tablet_schema.h
+++ b/be/src/storage/tablet/tablet_schema.h
@@ -180,8 +180,6 @@ public:
     static std::string get_string_by_field_type(FieldType type);
     static std::string get_string_by_aggregation_type(FieldAggregationMethod 
aggregation_type);
     static FieldType get_field_type_by_string(const std::string& str);
-    static FieldType get_field_type_by_type(PrimitiveType type);
-    static PrimitiveType get_primitive_type_by_field_type(FieldType type);
     static FieldAggregationMethod get_aggregation_type_by_string(const 
std::string& str);
     static uint32_t get_field_length_by_type(TPrimitiveType::type type, 
uint32_t string_length);
     bool is_row_store_column() const;
diff --git a/be/test/core/data_type/storage_field_type_test.cpp 
b/be/test/core/data_type/storage_field_type_test.cpp
new file mode 100644
index 00000000000..af621ceb9c6
--- /dev/null
+++ b/be/test/core/data_type/storage_field_type_test.cpp
@@ -0,0 +1,171 @@
+// 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.
+
+#include "core/data_type/storage_field_type.h"
+
+#include <gtest/gtest.h>
+
+#include <array>
+#include <cstddef>
+
+#include "common/exception.h"
+#include "storage/olap_common.h"
+
+namespace doris {
+
+namespace {
+
+struct TypePair {
+    PrimitiveType primitive_type;
+    FieldType field_type;
+};
+
+constexpr std::array supported_mappings {
+        TypePair {PrimitiveType::INVALID_TYPE, 
FieldType::OLAP_FIELD_TYPE_UNKNOWN},
+        TypePair {PrimitiveType::TYPE_NULL, FieldType::OLAP_FIELD_TYPE_NONE},
+        TypePair {PrimitiveType::TYPE_BOOLEAN, 
FieldType::OLAP_FIELD_TYPE_BOOL},
+        TypePair {PrimitiveType::TYPE_TINYINT, 
FieldType::OLAP_FIELD_TYPE_TINYINT},
+        TypePair {PrimitiveType::TYPE_SMALLINT, 
FieldType::OLAP_FIELD_TYPE_SMALLINT},
+        TypePair {PrimitiveType::TYPE_INT, FieldType::OLAP_FIELD_TYPE_INT},
+        TypePair {PrimitiveType::TYPE_BIGINT, 
FieldType::OLAP_FIELD_TYPE_BIGINT},
+        TypePair {PrimitiveType::TYPE_LARGEINT, 
FieldType::OLAP_FIELD_TYPE_LARGEINT},
+        TypePair {PrimitiveType::TYPE_FLOAT, FieldType::OLAP_FIELD_TYPE_FLOAT},
+        TypePair {PrimitiveType::TYPE_DOUBLE, 
FieldType::OLAP_FIELD_TYPE_DOUBLE},
+        TypePair {PrimitiveType::TYPE_VARCHAR, 
FieldType::OLAP_FIELD_TYPE_VARCHAR},
+        TypePair {PrimitiveType::TYPE_DATE, FieldType::OLAP_FIELD_TYPE_DATE},
+        TypePair {PrimitiveType::TYPE_DATETIME, 
FieldType::OLAP_FIELD_TYPE_DATETIME},
+        TypePair {PrimitiveType::TYPE_CHAR, FieldType::OLAP_FIELD_TYPE_CHAR},
+        TypePair {PrimitiveType::TYPE_STRUCT, 
FieldType::OLAP_FIELD_TYPE_STRUCT},
+        TypePair {PrimitiveType::TYPE_ARRAY, FieldType::OLAP_FIELD_TYPE_ARRAY},
+        TypePair {PrimitiveType::TYPE_MAP, FieldType::OLAP_FIELD_TYPE_MAP},
+        TypePair {PrimitiveType::TYPE_HLL, FieldType::OLAP_FIELD_TYPE_HLL},
+        TypePair {PrimitiveType::TYPE_DECIMALV2, 
FieldType::OLAP_FIELD_TYPE_DECIMAL},
+        TypePair {PrimitiveType::TYPE_BITMAP, 
FieldType::OLAP_FIELD_TYPE_BITMAP},
+        TypePair {PrimitiveType::TYPE_STRING, 
FieldType::OLAP_FIELD_TYPE_STRING},
+        TypePair {PrimitiveType::TYPE_QUANTILE_STATE, 
FieldType::OLAP_FIELD_TYPE_QUANTILE_STATE},
+        TypePair {PrimitiveType::TYPE_DATEV2, 
FieldType::OLAP_FIELD_TYPE_DATEV2},
+        TypePair {PrimitiveType::TYPE_DATETIMEV2, 
FieldType::OLAP_FIELD_TYPE_DATETIMEV2},
+        TypePair {PrimitiveType::TYPE_TIMEV2, 
FieldType::OLAP_FIELD_TYPE_TIMEV2},
+        TypePair {PrimitiveType::TYPE_DECIMAL32, 
FieldType::OLAP_FIELD_TYPE_DECIMAL32},
+        TypePair {PrimitiveType::TYPE_DECIMAL64, 
FieldType::OLAP_FIELD_TYPE_DECIMAL64},
+        TypePair {PrimitiveType::TYPE_DECIMAL128I, 
FieldType::OLAP_FIELD_TYPE_DECIMAL128I},
+        TypePair {PrimitiveType::TYPE_JSONB, FieldType::OLAP_FIELD_TYPE_JSONB},
+        TypePair {PrimitiveType::TYPE_VARIANT, 
FieldType::OLAP_FIELD_TYPE_VARIANT},
+        TypePair {PrimitiveType::TYPE_AGG_STATE, 
FieldType::OLAP_FIELD_TYPE_AGG_STATE},
+        TypePair {PrimitiveType::TYPE_DECIMAL256, 
FieldType::OLAP_FIELD_TYPE_DECIMAL256},
+        TypePair {PrimitiveType::TYPE_IPV4, FieldType::OLAP_FIELD_TYPE_IPV4},
+        TypePair {PrimitiveType::TYPE_IPV6, FieldType::OLAP_FIELD_TYPE_IPV6},
+        TypePair {PrimitiveType::TYPE_UINT32, 
FieldType::OLAP_FIELD_TYPE_UNSIGNED_INT},
+        TypePair {PrimitiveType::TYPE_UINT64, 
FieldType::OLAP_FIELD_TYPE_UNSIGNED_BIGINT},
+        TypePair {PrimitiveType::TYPE_TIMESTAMPTZ, 
FieldType::OLAP_FIELD_TYPE_TIMESTAMPTZ},
+};
+
+TEST(StorageFieldTypeTest, SupportedMappingsRoundTrip) {
+    for (const auto& [primitive_type, field_type] : supported_mappings) {
+        SCOPED_TRACE(static_cast<int>(primitive_type));
+        EXPECT_EQ(primitive_type_to_storage_field_type(primitive_type), 
field_type);
+        EXPECT_EQ(storage_field_type_to_primitive_type(field_type), 
primitive_type);
+    }
+}
+
+TEST(StorageFieldTypeTest, UnsupportedPrimitiveTypesThrow) {
+    constexpr std::array unsupported_types {
+            PrimitiveType::TYPE_BINARY,
+            static_cast<PrimitiveType>(14), // TYPE_DECIMAL (deprecated)
+            static_cast<PrimitiveType>(21), // TYPE_TIME (deprecated)
+            static_cast<PrimitiveType>(33), // TYPE_LAMBDA_FUNCTION 
(deprecated)
+            PrimitiveType::TYPE_FIXED_LENGTH_OBJECT,
+            PrimitiveType::TYPE_VARBINARY,
+            static_cast<PrimitiveType>(43),
+            static_cast<PrimitiveType>(255),
+    };
+
+    for (const auto type : unsupported_types) {
+        SCOPED_TRACE(static_cast<int>(type));
+        EXPECT_THROW((void)primitive_type_to_storage_field_type(type), 
Exception);
+    }
+}
+
+TEST(StorageFieldTypeTest, UnsupportedOrInvalidFieldTypesThrow) {
+    constexpr std::array unsupported_types {
+            FieldType::OLAP_FIELD_TYPE_UNSIGNED_TINYINT,
+            FieldType::OLAP_FIELD_TYPE_UNSIGNED_SMALLINT,
+            FieldType::OLAP_FIELD_TYPE_DISCRETE_DOUBLE,
+            static_cast<FieldType>(-1),
+            static_cast<FieldType>(0),
+            static_cast<FieldType>(41),
+            static_cast<FieldType>(255),
+    };
+
+    for (const auto type : unsupported_types) {
+        SCOPED_TRACE(static_cast<int>(type));
+        EXPECT_THROW((void)storage_field_type_to_primitive_type(type), 
Exception);
+    }
+}
+
+TEST(StorageFieldTypeTest, PersistedFieldTypeValuesStayStable) {
+    constexpr std::array persisted_types {
+            FieldType::OLAP_FIELD_TYPE_TINYINT,
+            FieldType::OLAP_FIELD_TYPE_UNSIGNED_TINYINT,
+            FieldType::OLAP_FIELD_TYPE_SMALLINT,
+            FieldType::OLAP_FIELD_TYPE_UNSIGNED_SMALLINT,
+            FieldType::OLAP_FIELD_TYPE_INT,
+            FieldType::OLAP_FIELD_TYPE_UNSIGNED_INT,
+            FieldType::OLAP_FIELD_TYPE_BIGINT,
+            FieldType::OLAP_FIELD_TYPE_UNSIGNED_BIGINT,
+            FieldType::OLAP_FIELD_TYPE_LARGEINT,
+            FieldType::OLAP_FIELD_TYPE_FLOAT,
+            FieldType::OLAP_FIELD_TYPE_DOUBLE,
+            FieldType::OLAP_FIELD_TYPE_DISCRETE_DOUBLE,
+            FieldType::OLAP_FIELD_TYPE_CHAR,
+            FieldType::OLAP_FIELD_TYPE_DATE,
+            FieldType::OLAP_FIELD_TYPE_DATETIME,
+            FieldType::OLAP_FIELD_TYPE_DECIMAL,
+            FieldType::OLAP_FIELD_TYPE_VARCHAR,
+            FieldType::OLAP_FIELD_TYPE_STRUCT,
+            FieldType::OLAP_FIELD_TYPE_ARRAY,
+            FieldType::OLAP_FIELD_TYPE_MAP,
+            FieldType::OLAP_FIELD_TYPE_UNKNOWN,
+            FieldType::OLAP_FIELD_TYPE_NONE,
+            FieldType::OLAP_FIELD_TYPE_HLL,
+            FieldType::OLAP_FIELD_TYPE_BOOL,
+            FieldType::OLAP_FIELD_TYPE_BITMAP,
+            FieldType::OLAP_FIELD_TYPE_STRING,
+            FieldType::OLAP_FIELD_TYPE_QUANTILE_STATE,
+            FieldType::OLAP_FIELD_TYPE_DATEV2,
+            FieldType::OLAP_FIELD_TYPE_DATETIMEV2,
+            FieldType::OLAP_FIELD_TYPE_TIMEV2,
+            FieldType::OLAP_FIELD_TYPE_DECIMAL32,
+            FieldType::OLAP_FIELD_TYPE_DECIMAL64,
+            FieldType::OLAP_FIELD_TYPE_DECIMAL128I,
+            FieldType::OLAP_FIELD_TYPE_JSONB,
+            FieldType::OLAP_FIELD_TYPE_VARIANT,
+            FieldType::OLAP_FIELD_TYPE_AGG_STATE,
+            FieldType::OLAP_FIELD_TYPE_DECIMAL256,
+            FieldType::OLAP_FIELD_TYPE_IPV4,
+            FieldType::OLAP_FIELD_TYPE_IPV6,
+            FieldType::OLAP_FIELD_TYPE_TIMESTAMPTZ,
+    };
+
+    for (size_t i = 0; i < persisted_types.size(); ++i) {
+        EXPECT_EQ(static_cast<size_t>(persisted_types[i]), i + 1);
+    }
+}
+
+} // namespace
+
+} // namespace doris


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


Reply via email to