From 5c8c5e6cece315219938636f1cfdc7997e5b3c77 Mon Sep 17 00:00:00 2001 From: Mryange Date: Tue, 13 May 2025 16:05:12 +0800 Subject: [PATCH] fix --- be/src/vec/data_types/serde/data_type_struct_serde.cpp | 10 ++++++++++ .../sql_functions/cast_function/test_cast_struct.out | 3 +++ .../cast_function/test_cast_struct.groovy | 3 +++ 3 files changed, 16 insertions(+) diff --git a/be/src/vec/data_types/serde/data_type_struct_serde.cpp b/be/src/vec/data_types/serde/data_type_struct_serde.cpp index beb829dc5211b4..d6c0c26a06cdb5 100644 --- a/be/src/vec/data_types/serde/data_type_struct_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_struct_serde.cpp @@ -111,6 +111,7 @@ Status DataTypeStructSerDe::deserialize_one_cell_from_json(IColumn& column, Slic char quote_char = 0; auto elem_size = elem_serdes_ptrs.size(); + DCHECK_EQ(elem_size, elem_names.size()); int field_pos = 0; for (; idx < slice_size; ++idx) { @@ -138,6 +139,15 @@ Status DataTypeStructSerDe::deserialize_one_cell_from_json(IColumn& column, Slic next.trim_prefix(); next.trim_quote(); // check field_name + if (field_pos >= elem_size) { + // we should do column revert if error + for (size_t j = 0; j < field_pos; j++) { + struct_column.get_column(j).pop_back(1); + } + return Status::InvalidArgument( + "Actual struct field number is more than schema field number {}.", + field_pos, elem_size); + } if (elem_names[field_pos] != next) { // we should do column revert if error for (size_t j = 0; j < field_pos; j++) { diff --git a/regression-test/data/query_p0/sql_functions/cast_function/test_cast_struct.out b/regression-test/data/query_p0/sql_functions/cast_function/test_cast_struct.out index fa63c0da504a35..b27ed779acb820 100644 --- a/regression-test/data/query_p0/sql_functions/cast_function/test_cast_struct.out +++ b/regression-test/data/query_p0/sql_functions/cast_function/test_cast_struct.out @@ -41,3 +41,6 @@ -- !sql14 -- {"f1":1.0, "f2":"2022-10-10 00:00:00"} +-- !sql15 -- +\N + diff --git a/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_struct.groovy b/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_struct.groovy index 3056dab2a36480..2d177154b493c6 100644 --- a/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_struct.groovy +++ b/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_struct.groovy @@ -40,6 +40,9 @@ suite("test_cast_struct") { // struct type cast to struct qt_sql14 "select cast(cast({1,'2022-10-10'} as struct) as struct)" + // struct type cast to struct with different field name + qt_sql15 """select cast('{"a":1,"b":"1","c":"1","d":"1"}' as struct)""" + // basic types except string can not cast to struct test { sql "select cast(cast(1 as int) as struct)"