This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-4.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-4.1 by this push:
new d6229788fcd branch-4.1: [fix](be) Avoid unsigned underflow in JSON
modify path #63579 (#64191)
d6229788fcd is described below
commit d6229788fcd38b1246946ba8a7cb80a34c44a2f7
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Mon Jun 8 12:18:55 2026 +0800
branch-4.1: [fix](be) Avoid unsigned underflow in JSON modify path #63579
(#64191)
Cherry-picked from #63579
Co-authored-by: Jerry Hu <[email protected]>
---
be/src/exprs/function/function_jsonb.cpp | 5 +++--
be/test/exprs/function/function_jsonb_test.cpp | 24 ++++++++++++++++++++++++
2 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/be/src/exprs/function/function_jsonb.cpp
b/be/src/exprs/function/function_jsonb.cpp
index 21ec5789950..28015309cdb 100644
--- a/be/src/exprs/function/function_jsonb.cpp
+++ b/be/src/exprs/function/function_jsonb.cpp
@@ -2050,6 +2050,7 @@ public:
bool replace = false;
parents.emplace_back(json_documents[row_idx]->getValue());
+ const auto legs_count =
json_path[path_index].get_leg_vector_size();
if (find_result.value) {
// find target path, replace it with the new value.
replace = true;
@@ -2061,7 +2062,8 @@ public:
} else {
// does not find target path, insert the new value.
JsonbPath new_path;
- for (size_t j = 0; j <
json_path[path_index].get_leg_vector_size() - 1; ++j) {
+ DCHECK_GT(legs_count, 0);
+ for (size_t j = 0; j + 1 < legs_count; ++j) {
auto* current_leg =
json_path[path_index].get_leg_from_leg_vector(j);
std::unique_ptr<leg_info> leg =
std::make_unique<leg_info>(
current_leg->leg_ptr, current_leg->leg_len,
@@ -2075,7 +2077,6 @@ public:
}
}
- const auto legs_count =
json_path[path_index].get_leg_vector_size();
leg_info* last_leg =
legs_count > 0
?
json_path[path_index].get_leg_from_leg_vector(legs_count - 1)
diff --git a/be/test/exprs/function/function_jsonb_test.cpp
b/be/test/exprs/function/function_jsonb_test.cpp
index 25377a0bce9..8d9df92d402 100644
--- a/be/test/exprs/function/function_jsonb_test.cpp
+++ b/be/test/exprs/function/function_jsonb_test.cpp
@@ -986,4 +986,28 @@ TEST(FunctionJsonbTEST, JsonContains) {
ASSERT_TRUE(st.ok()) << "execute failed: " << st.to_string();
}
+TEST(FunctionJsonbTEST, JsonbModifyMissingPathParent) {
+ InputTypeSet input_types = {PrimitiveType::TYPE_JSONB,
PrimitiveType::TYPE_VARCHAR,
+ PrimitiveType::TYPE_JSONB};
+
+ {
+ DataSet data_set = {
+ {{STRING("{}"), STRING("$.a"), STRING("1")},
STRING(R"({"a":1})")},
+ {{STRING(R"({"a":{}})"), STRING("$.a.b"), STRING("2")},
STRING(R"({"a":{"b":2}})")},
+ {{STRING(R"({"a":[1]})"), STRING("$.a[1]"), STRING("2")},
STRING(R"({"a":[1,2]})")},
+ };
+ static_cast<void>(
+ check_function<DataTypeJsonb, true>("jsonb_insert",
input_types, data_set));
+ }
+
+ {
+ DataSet data_set = {
+ {{STRING("{}"), STRING("$.a"), STRING("1")},
STRING(R"({"a":1})")},
+ {{STRING(R"({"a":{}})"), STRING("$.a.b"), STRING("2")},
STRING(R"({"a":{"b":2}})")},
+ {{STRING(R"({"a":[1]})"), STRING("$.a[1]"), STRING("2")},
STRING(R"({"a":[1,2]})")},
+ };
+ static_cast<void>(check_function<DataTypeJsonb, true>("jsonb_set",
input_types, data_set));
+ }
+}
+
} // namespace doris
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]