From 579465e3d4ebfe92c879ef03f1a1d0f9f140c493 Mon Sep 17 00:00:00 2001 From: Mryange Date: Mon, 11 May 2026 10:08:22 +0800 Subject: [PATCH] [refine](Field) rename Tuple to Struct in BE core types (#63093) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit What problem does this PR solve? Issue Number: N/A Problem Summary: The C++ struct Tuple in be/src/core/field.h is a type alias for FieldVector used to represent STRUCT-typed field values. However, the name "Tuple" is misleading — this type corresponds to the STRUCT data type, not a tuple. This rename aligns the C++ type name with the actual semantic: Tuple → Struct, along with all references in comments, error messages, and variable names. --- be/src/core/column/column_struct.cpp | 13 +++++++------ be/src/core/data_type/convert_field_to_type.cpp | 2 +- be/src/core/data_type/data_type.h | 2 +- be/src/core/data_type/data_type_struct.cpp | 4 ++-- be/src/core/data_type/primitive_type.h | 4 ++-- be/src/core/field.h | 8 ++++---- be/src/exprs/vstruct_literal.cpp | 2 +- be/src/util/json/json_parser.cpp | 4 ++-- be/test/core/column/column_hash_func_test.cpp | 2 +- be/test/core/column/column_variant_test.cpp | 4 ++-- be/test/core/data_type/data_type_ip_test.cpp | 2 +- be/test/core/data_type/data_type_map_test.cpp | 2 +- be/test/core/data_type/data_type_struct_test.cpp | 10 +++++----- .../data_type_serde/data_type_serde_arrow_test.cpp | 2 +- .../data_type_serde/data_type_serde_pb_test.cpp | 4 ++-- .../data_type_serde/data_type_to_string_test.cpp | 2 +- be/test/core/jsonb/convert_field_to_type_test.cpp | 2 +- be/test/core/jsonb/serialize_test.cpp | 2 +- 18 files changed, 36 insertions(+), 35 deletions(-) diff --git a/be/src/core/column/column_struct.cpp b/be/src/core/column/column_struct.cpp index 6d462b4ffa622f..ed150bdfd725b8 100644 --- a/be/src/core/column/column_struct.cpp +++ b/be/src/core/column/column_struct.cpp @@ -107,7 +107,7 @@ Field ColumnStruct::operator[](size_t n) const { void ColumnStruct::get(size_t n, Field& res) const { const size_t tuple_size = columns.size(); - res = Field::create_field(Tuple()); + res = Field::create_field(Struct()); auto& res_tuple = res.get(); res_tuple.reserve(tuple_size); @@ -121,10 +121,11 @@ void ColumnStruct::insert(const Field& x) { const auto& tuple = x.get(); const size_t tuple_size = columns.size(); if (tuple.size() != tuple_size) { - throw doris::Exception(ErrorCode::INTERNAL_ERROR, - "Cannot insert value of different size into tuple. field tuple size " - "{}, columns size {}", - tuple.size(), tuple_size); + throw doris::Exception( + ErrorCode::INTERNAL_ERROR, + "Cannot insert value of different size into struct. field struct size " + "{}, columns size {}", + tuple.size(), tuple_size); } for (size_t i = 0; i < tuple_size; ++i) { @@ -138,7 +139,7 @@ void ColumnStruct::insert_from(const IColumn& src_, size_t n) { const size_t tuple_size = columns.size(); if (src.columns.size() != tuple_size) { throw doris::Exception(ErrorCode::INTERNAL_ERROR, - "Cannot insert value of different size into tuple."); + "Cannot insert value of different size into struct."); __builtin_unreachable(); } diff --git a/be/src/core/data_type/convert_field_to_type.cpp b/be/src/core/data_type/convert_field_to_type.cpp index bd1dd2ab2ef800..f17a94c1366485 100644 --- a/be/src/core/data_type/convert_field_to_type.cpp +++ b/be/src/core/data_type/convert_field_to_type.cpp @@ -216,7 +216,7 @@ class FieldVisitorToJsonb : public StaticVisitor { } void operator()(const Array& x, JsonbWriter* writer) const; - void operator()(const Tuple& x, JsonbWriter* writer) const { + void operator()(const Struct& x, JsonbWriter* writer) const { throw doris::Exception(doris::ErrorCode::NOT_IMPLEMENTED_ERROR, "Not implemeted"); } void operator()(const Decimal32& x, JsonbWriter* writer) const { diff --git a/be/src/core/data_type/data_type.h b/be/src/core/data_type/data_type.h index e013fa206c9906..7b9c010bd3dba4 100644 --- a/be/src/core/data_type/data_type.h +++ b/be/src/core/data_type/data_type.h @@ -137,7 +137,7 @@ class IDataType : private boost::noncopyable { virtual bool equals_ignore_precision(const IDataType& rhs) const { return equals(rhs); } - /** Example: numbers, Date, DateTime, FixedString, Enum... Nullable and Tuple of such types. + /** Example: numbers, Date, DateTime, FixedString, Enum... Nullable and Struct of such types. * Counterexamples: String, Array. * It's Ok to return false for AggregateFunction despite the fact that some of them have fixed size state. */ diff --git a/be/src/core/data_type/data_type_struct.cpp b/be/src/core/data_type/data_type_struct.cpp index 0c981481c69db4..616414a474db6f 100644 --- a/be/src/core/data_type/data_type_struct.cpp +++ b/be/src/core/data_type/data_type_struct.cpp @@ -61,11 +61,11 @@ static Status check_tuple_names(const Strings& names) { std::unordered_set names_set; for (const auto& name : names) { if (name.empty()) { - return Status::InvalidArgument("Names of tuple elements cannot be empty"); + return Status::InvalidArgument("Names of struct elements cannot be empty"); } if (!names_set.insert(name).second) { - return Status::InvalidArgument("Names of tuple elements must be unique"); + return Status::InvalidArgument("Names of struct elements must be unique"); } } diff --git a/be/src/core/data_type/primitive_type.h b/be/src/core/data_type/primitive_type.h index e3cbd05d1e67d3..3ecc6590faba7e 100644 --- a/be/src/core/data_type/primitive_type.h +++ b/be/src/core/data_type/primitive_type.h @@ -48,7 +48,7 @@ class ColumnVarbinary; using ColumnString = ColumnStr; class JsonbField; struct Array; -struct Tuple; +struct Struct; struct Map; struct FieldWithDataType; using VariantMap = std::map; @@ -496,7 +496,7 @@ struct PrimitiveTypeTraits { }; template <> struct PrimitiveTypeTraits { - using CppType = Tuple; + using CppType = Struct; using StorageFieldType = CppType; using DataType = DataTypeStruct; using ColumnType = ColumnStruct; diff --git a/be/src/core/field.h b/be/src/core/field.h index aff03a7f4fb797..1bb4160d0ddb35 100644 --- a/be/src/core/field.h +++ b/be/src/core/field.h @@ -58,16 +58,16 @@ class Field; using FieldVector = std::vector; -/// Array and Tuple use the same storage type -- FieldVector, but we declare +/// Array and Struct use the same storage type -- FieldVector, but we declare /// distinct types for them, so that the caller can choose whether it wants to -/// construct a Field of Array or a Tuple type. An alternative approach would be +/// construct a Field of Array or a Struct type. An alternative approach would be /// to construct both of these types from FieldVector, and have the caller /// specify the desired Field type explicitly. struct Array : public FieldVector { using FieldVector::FieldVector; }; -struct Tuple : public FieldVector { +struct Struct : public FieldVector { using FieldVector::FieldVector; }; @@ -286,7 +286,7 @@ class Field { private: std::aligned_union_t storage; diff --git a/be/src/exprs/vstruct_literal.cpp b/be/src/exprs/vstruct_literal.cpp index e405b37bfcd899..05f9a09aeb7b9c 100644 --- a/be/src/exprs/vstruct_literal.cpp +++ b/be/src/exprs/vstruct_literal.cpp @@ -36,7 +36,7 @@ namespace doris { Status VStructLiteral::prepare(RuntimeState* state, const RowDescriptor& row_desc, VExprContext* context) { RETURN_IF_ERROR_OR_PREPARED(VExpr::prepare(state, row_desc, context)); - Field struct_field = Field::create_field(Tuple()); + Field struct_field = Field::create_field(Struct()); for (const auto& child : _children) { Field item; auto child_literal = std::dynamic_pointer_cast(child); diff --git a/be/src/util/json/json_parser.cpp b/be/src/util/json/json_parser.cpp index 921093105de701..f5de77e30c5056 100644 --- a/be/src/util/json/json_parser.cpp +++ b/be/src/util/json/json_parser.cpp @@ -370,9 +370,9 @@ StringRef JSONDataParser::getNameOfNested(const PathInData::Parts& p return {}; } /// Find first key that is marked as nested, - /// because we may have tuple of Nested and there could be + /// because we may have struct of Nested and there could be /// several arrays with the same prefix, but with independent sizes. - /// Consider we have array element with type `k2 Tuple(k3 Nested(...), k5 Nested(...))` + /// Consider we have array element with type `k2 Struct(k3 Nested(...), k5 Nested(...))` /// Then subcolumns `k2.k3` and `k2.k5` may have indepented sizes and we should extract /// `k3` and `k5` keys instead of `k2`. for (const auto& part : path) { diff --git a/be/test/core/column/column_hash_func_test.cpp b/be/test/core/column/column_hash_func_test.cpp index aa1e153111f5fe..56cbde9e2df73e 100644 --- a/be/test/core/column/column_hash_func_test.cpp +++ b/be/test/core/column/column_hash_func_test.cpp @@ -239,7 +239,7 @@ TEST(HashFuncTest, StructTypeTestWithSepcificValueCrcHash) { dataTypes.push_back(n1); dataTypes.push_back(s1); - Tuple t; + Struct t; t.push_back(Field::create_field(Int64(1))); t.push_back(Field::create_field("hello")); diff --git a/be/test/core/column/column_variant_test.cpp b/be/test/core/column/column_variant_test.cpp index 2c81fe1a107c9f..7413213e155f44 100644 --- a/be/test/core/column/column_variant_test.cpp +++ b/be/test/core/column/column_variant_test.cpp @@ -2786,9 +2786,9 @@ TEST_F(ColumnVariantTest, get_field_info_all_types) { EXPECT_EQ(info.scalar_type_id, PrimitiveType::TYPE_JSONB); } - // Test Tuple + // Test Struct { - Tuple t1; + Struct t1; t1.push_back(Field::create_field(String("amory cute"))); t1.push_back(Field::create_field(Int64(37))); t1.push_back(Field::create_field(true)); diff --git a/be/test/core/data_type/data_type_ip_test.cpp b/be/test/core/data_type/data_type_ip_test.cpp index b538c50adccb57..d6aa58bcc33be9 100644 --- a/be/test/core/data_type/data_type_ip_test.cpp +++ b/be/test/core/data_type/data_type_ip_test.cpp @@ -290,7 +290,7 @@ TEST_F(DataTypeIPTest, SerdeTOJsonInComplex) { column_map_ipv6->insert(Field::create_field(ipv6_map)); // pack struct - Tuple tuple; + Struct tuple; tuple.push_back(Field::create_field(ipv4_values[0])); tuple.push_back(Field::create_field(ipv6_values[0])); tuple.push_back(Field::create_field(ipv4_array)); diff --git a/be/test/core/data_type/data_type_map_test.cpp b/be/test/core/data_type/data_type_map_test.cpp index 2bd87551085f6f..a5633493c28acc 100644 --- a/be/test/core/data_type/data_type_map_test.cpp +++ b/be/test/core/data_type/data_type_map_test.cpp @@ -439,7 +439,7 @@ TEST_F(DataTypeMapTest, SerdeNestedTypeArrowTest) { std::make_shared(std::vector {f4})); DataTypePtr ma = std::make_shared(dt1, dt2); - Tuple t1, t2, t3, t4; + Struct t1, t2, t3, t4; t1.push_back(Field::create_field("clever")); t1.push_back(Field::create_field(__int128_t(37))); t1.push_back(Field::create_field(true)); diff --git a/be/test/core/data_type/data_type_struct_test.cpp b/be/test/core/data_type/data_type_struct_test.cpp index 60f473ee569721..29006c7134ede6 100644 --- a/be/test/core/data_type/data_type_struct_test.cpp +++ b/be/test/core/data_type/data_type_struct_test.cpp @@ -388,7 +388,7 @@ TEST_F(DataTypeStructTest, SerdeNestedTypeArrowTest) { m2.push_back(Field::create_field(v2)); // nested Struct - Tuple t1, t2; + Struct t1, t2; t1.push_back(Field::create_field("clever")); t1.push_back(Field::create_field(__int128_t(37))); t1.push_back(Field::create_field(true)); @@ -397,7 +397,7 @@ TEST_F(DataTypeStructTest, SerdeNestedTypeArrowTest) { t2.push_back(Field::create_field(false)); // Struct - Tuple tt1, tt2; + Struct tt1, tt2; tt1.push_back(Field::create_field(a1)); tt1.push_back(Field::create_field(m1)); tt1.push_back(Field::create_field(t1)); @@ -425,7 +425,7 @@ TEST_F(DataTypeStructTest, writeColumnToOrc) { DataTypePtr st = std::make_shared(std::vector {dt1, dt2}); auto serde = st->get_serde(1); - Tuple test_data; + Struct test_data; test_data.push_back(Field::create_field(100)); test_data.push_back(Field::create_field(200)); @@ -468,7 +468,7 @@ TEST_F(DataTypeStructTest, formString) { DataTypePtr dt1 = std::make_shared(); DataTypePtr dt2 = std::make_shared(); DataTypePtr st = std::make_shared(std::vector {dt1, dt2}); - Tuple tt1; + Struct tt1; tt1.push_back(Field::create_field(100)); tt1.push_back(Field::create_field("asd")); @@ -500,7 +500,7 @@ TEST_F(DataTypeStructTest, insertColumnLastValueMultipleTimes) { DataTypePtr dt1 = std::make_shared(); DataTypePtr dt2 = std::make_shared(); DataTypePtr st = std::make_shared(std::vector {dt1, dt2}); - Tuple tt1; + Struct tt1; tt1.push_back(Field::create_field(100)); tt1.push_back(Field::create_field("asd")); diff --git a/be/test/core/data_type_serde/data_type_serde_arrow_test.cpp b/be/test/core/data_type_serde/data_type_serde_arrow_test.cpp index 442acb629ee1af..c91a03fcaadba7 100644 --- a/be/test/core/data_type_serde/data_type_serde_arrow_test.cpp +++ b/be/test/core/data_type_serde/data_type_serde_arrow_test.cpp @@ -357,7 +357,7 @@ void serialize_and_deserialize_arrow_test(std::vector cols, int r DataTypePtr m = std::make_shared(std::make_shared()); DataTypePtr st = std::make_shared(std::vector {s, d, m}); type_desc = st; - Tuple t1, t2; + Struct t1, t2; t1.push_back(Field::create_field("amory cute")); t1.push_back(Field::create_field(__int128_t(37))); t1.push_back(Field::create_field(true)); diff --git a/be/test/core/data_type_serde/data_type_serde_pb_test.cpp b/be/test/core/data_type_serde/data_type_serde_pb_test.cpp index 8570d1d16372ec..986583982eb2bd 100644 --- a/be/test/core/data_type_serde/data_type_serde_pb_test.cpp +++ b/be/test/core/data_type_serde/data_type_serde_pb_test.cpp @@ -547,7 +547,7 @@ TEST(DataTypeSerDePbTest, DataTypeScalaSerDeTestStruct) { DataTypePtr d = std::make_shared(std::make_shared()); DataTypePtr m = std::make_shared(std::make_shared()); DataTypePtr st = std::make_shared(std::vector {s, d, m}); - Tuple t1, t2; + Struct t1, t2; t1.push_back(Field::create_field(String("amory cute"))); t1.push_back(Field::create_field(__int128_t(37))); t1.push_back(Field::create_field(true)); @@ -578,7 +578,7 @@ TEST(DataTypeSerDePbTest, DataTypeScalaSerDeTestStruct2) { DataTypePtr d = std::make_shared(std::make_shared()); DataTypePtr m = std::make_shared(std::make_shared()); DataTypePtr st = std::make_shared(std::vector {s, d, m}); - Tuple t1, t2; + Struct t1, t2; t1.push_back(Field::create_field(String("amory cute"))); t1.push_back(Field::create_field(37)); t1.push_back(Field::create_field(true)); diff --git a/be/test/core/data_type_serde/data_type_to_string_test.cpp b/be/test/core/data_type_serde/data_type_to_string_test.cpp index 106b8c9bffec31..132d031e21df9f 100644 --- a/be/test/core/data_type_serde/data_type_to_string_test.cpp +++ b/be/test/core/data_type_serde/data_type_to_string_test.cpp @@ -54,7 +54,7 @@ TEST(ToStringMethodTest, DataTypeToStringTest) { m.push_back(Field::create_field(a1)); m.push_back(Field::create_field(a2)); - Tuple t; + Struct t; t.push_back(Field::create_field(Int128(12345454342))); t.push_back(Field::create_field(String("amory cute"))); t.push_back(Field::create_field(Int64(0))); diff --git a/be/test/core/jsonb/convert_field_to_type_test.cpp b/be/test/core/jsonb/convert_field_to_type_test.cpp index ac623dc7e84c7b..921cb9693e53be 100644 --- a/be/test/core/jsonb/convert_field_to_type_test.cpp +++ b/be/test/core/jsonb/convert_field_to_type_test.cpp @@ -502,7 +502,7 @@ TEST_F(ConvertFieldToTypeTest, ConvertFieldToType_ErrorCases) { // Test with unsupported types (should throw exception) { - Field tuple_field = Field::create_field(Tuple()); + Field tuple_field = Field::create_field(Struct()); EXPECT_THROW( { diff --git a/be/test/core/jsonb/serialize_test.cpp b/be/test/core/jsonb/serialize_test.cpp index 27c8b3aed10ba6..58aad7ca61803b 100644 --- a/be/test/core/jsonb/serialize_test.cpp +++ b/be/test/core/jsonb/serialize_test.cpp @@ -288,7 +288,7 @@ TEST(BlockSerializeTest, Struct) { DataTypePtr d = std::make_shared(std::make_shared()); DataTypePtr m = std::make_shared(std::make_shared()); DataTypePtr st = std::make_shared(std::vector {s, d, m}); - Tuple t1, t2; + Struct t1, t2; t1.push_back(Field::create_field(String("amory cute"))); t1.push_back(Field::create_field(__int128_t(37))); t1.push_back(Field::create_field(true));