diff --git a/be/src/util/jsonb_document.h b/be/src/util/jsonb_document.h index c02a034d53..73b6a44b38 100644 --- a/be/src/util/jsonb_document.h +++ b/be/src/util/jsonb_document.h @@ -1573,6 +1573,9 @@ inline bool JsonbPath::parse_member(Stream* stream, JsonbPath* path) { stream->skip(1); stream->add_leg_len(); stream->set_has_escapes(true); + if (stream->exhausted()) { + return false; + } continue; } else if (stream->peek() == DOUBLE_QUOTE) { if (left_quotation_marks == nullptr) { diff --git a/be/src/vec/functions/function_json.cpp b/be/src/vec/functions/function_json.cpp index 03bd03c52e..cc6b22c7b5 100644 --- a/be/src/vec/functions/function_json.cpp +++ b/be/src/vec/functions/function_json.cpp @@ -229,12 +229,19 @@ rapidjson::Value* get_json_object(std::string_view json_string, std::string_view std::vector* parsed_paths; std::vector tmp_parsed_paths; + //Cannot use '\' as the last character, return NULL + if (path_string.back() == '\\') { + document->SetNull(); + return document; + } + #ifdef USE_LIBCPP std::string s(path_string); auto tok = get_json_token(s); #else auto tok = get_json_token(path_string); #endif + std::vector paths(tok.begin(), tok.end()); get_parsed_paths(paths, &tmp_parsed_paths); if (tmp_parsed_paths.empty()) { diff --git a/regression-test/data/json_p0/test_json_load_and_function.out b/regression-test/data/json_p0/test_json_load_and_function.out index e12fb79e38..422bbbeece 100644 --- a/regression-test/data/json_p0/test_json_load_and_function.out +++ b/regression-test/data/json_p0/test_json_load_and_function.out @@ -45,6 +45,9 @@ 30 -9223372036854775808 31 18446744073709551615 +-- !select -- +\N + -- !select -- 1 \N \N 2 null null diff --git a/regression-test/suites/json_p0/test_json_load_and_function.groovy b/regression-test/suites/json_p0/test_json_load_and_function.groovy index c79274eec3..82b16be1f4 100644 --- a/regression-test/suites/json_p0/test_json_load_and_function.groovy +++ b/regression-test/suites/json_p0/test_json_load_and_function.groovy @@ -158,6 +158,7 @@ suite("test_json_load_and_function", "p0") { qt_select "SELECT * FROM ${testTable} ORDER BY id" // json_extract + qt_select "SELECT json_extract( '{\"k1\\\\\": \"v1\"}', \"\$.k1\\\\\")" qt_select "SELECT id, j, jsonb_extract(j, '\$') FROM ${testTable} ORDER BY id" qt_select "SELECT id, j, jsonb_extract(j, '\$.*') FROM ${testTable} ORDER BY id"