diff --git a/be/src/vec/functions/function_json.cpp b/be/src/vec/functions/function_json.cpp index 6901dfb2b69297..ab1ff616f2b1e7 100644 --- a/be/src/vec/functions/function_json.cpp +++ b/be/src/vec/functions/function_json.cpp @@ -15,6 +15,7 @@ // specific language governing permissions and limitations // under the License. +#include #include #include #include @@ -144,45 +145,7 @@ rapidjson::Value* match_value(const std::vector& parsed_paths, rapidjs const std::string& col = parsed_paths[i].key; int index = parsed_paths[i].idx; if (LIKELY(!col.empty())) { - if (root->IsArray()) { - array_obj = static_cast( - mem_allocator.Malloc(sizeof(rapidjson::Value))); - array_obj->SetArray(); - bool is_null = true; - - // if array ,loop the array,find out all Objects,then find the results from the objects - for (int j = 0; j < root->Size(); j++) { - rapidjson::Value* json_elem = &((*root)[j]); - - if (json_elem->IsArray() || json_elem->IsNull()) { - continue; - } else { - if (!json_elem->IsObject()) { - continue; - } - if (!json_elem->HasMember(col.c_str())) { - if (is_insert_null) { // not found item, then insert a null object. - is_null = false; - rapidjson::Value nullObject(rapidjson::kNullType); - array_obj->PushBack(nullObject, mem_allocator); - } - continue; - } - rapidjson::Value* obj = &((*json_elem)[col.c_str()]); - if (obj->IsArray()) { - is_null = false; - for (int k = 0; k < obj->Size(); k++) { - array_obj->PushBack((*obj)[k], mem_allocator); - } - } else if (!obj->IsNull()) { - is_null = false; - array_obj->PushBack(*obj, mem_allocator); - } - } - } - - root = is_null ? &(array_obj->SetNull()) : array_obj; - } else if (root->IsObject()) { + if (root->IsObject()) { if (!root->HasMember(col.c_str())) { return nullptr; } else { @@ -233,8 +196,17 @@ rapidjson::Value* get_json_object(std::string_view json_string, std::string_view //Cannot use '\' as the last character, return NULL if (path_string.back() == '\\') { - document->SetNull(); - return document; + return nullptr; + } + + std::string fixed_string; + if (path_string.size() >= 2 && path_string[0] == '$' && path_string[1] != '.') { + // Boost tokenizer requires explicit "." after "$" to correctly extract JSON path tokens. + // Without this, expressions like "$[0].key" cannot be properly split. + // This commit ensures a "." is automatically added after "$" to maintain consistent token parsing behavior. + fixed_string = "$."; + fixed_string += path_string.substr(1); + path_string = fixed_string; } try { @@ -251,13 +223,13 @@ rapidjson::Value* get_json_object(std::string_view json_string, std::string_view } } catch (boost::escaped_list_error&) { // meet unknown escape sequence, example '$.name\k' - return document; + return nullptr; } parsed_paths = &tmp_parsed_paths; if (!(*parsed_paths)[0].is_valid) { - return document; + return nullptr; } if (UNLIKELY((*parsed_paths).size() == 1)) { @@ -272,8 +244,7 @@ rapidjson::Value* get_json_object(std::string_view json_string, std::string_view if (UNLIKELY(document->HasParseError())) { // VLOG_CRITICAL << "Error at offset " << document->GetErrorOffset() << ": " // << GetParseError_En(document->GetParseError()); - document->SetNull(); - return document; + return nullptr; } return match_value(*parsed_paths, document, document->GetAllocator()); @@ -858,9 +829,10 @@ template struct FunctionJsonExtractImpl { static constexpr auto name = Name::name; - static rapidjson::Value parse_json(const ColumnString* json_col, const ColumnString* path_col, - rapidjson::Document::AllocatorType& allocator, const int row, - const int col, std::vector& column_is_consts) { + static std::pair parse_json( + const ColumnString* json_col, const ColumnString* path_col, + rapidjson::Document::AllocatorType& allocator, const int row, const int col, + std::vector& column_is_consts) { rapidjson::Value value; rapidjson::Document document; @@ -869,10 +841,13 @@ struct FunctionJsonExtractImpl { const auto path = path_col->get_data_at(index_check_const(row, column_is_consts[col])); std::string_view path_string(path.data, path.size); auto* root = get_json_object(json_string, path_string, &document); + bool found = false; if (root != nullptr) { + found = true; value.CopyFrom(*root, allocator); } - return value; + + return {found, std::move(value)}; } static rapidjson::Value* get_document(const ColumnString* path_col, @@ -913,8 +888,9 @@ struct FunctionJsonExtractImpl { rapidjson::StringBuffer buf; rapidjson::Writer writer(buf); const auto* json_col = data_columns[0]; - auto insert_result_lambda = [&](rapidjson::Value& value, int row) { - if (value.IsNull()) { + + auto insert_result_lambda = [&](rapidjson::Value& value, bool is_null, int row) { + if (is_null) { null_map[row] = 1; result_column.insert_default(); } else { @@ -935,12 +911,13 @@ struct FunctionJsonExtractImpl { } }; if (data_columns.size() == 2) { - rapidjson::Value value; if (column_is_consts[1]) { std::vector parsed_paths; auto* root = get_document(data_columns[1], &document, parsed_paths, 0, column_is_consts[1]); for (size_t row = 0; row < input_rows_count; row++) { + bool is_null = false; + rapidjson::Value value; if (root != nullptr) { const auto& obj = json_col->get_data_at(row); std::string_view json_string(obj.data, obj.size); @@ -957,17 +934,18 @@ struct FunctionJsonExtractImpl { if (root_val != nullptr) { value.CopyFrom(*root_val, allocator); } else { - rapidjson::Value tmp; - value.Swap(tmp); + is_null = true; } + } else { + is_null = true; } - insert_result_lambda(value, row); + insert_result_lambda(value, is_null, row); } } else { for (size_t row = 0; row < input_rows_count; row++) { - value = parse_json(json_col, data_columns[1], allocator, row, 1, - column_is_consts); - insert_result_lambda(value, row); + auto result = parse_json(json_col, data_columns[1], allocator, row, 1, + column_is_consts); + insert_result_lambda(result.second, !result.first, row); } } @@ -977,12 +955,16 @@ struct FunctionJsonExtractImpl { value.Reserve(data_columns.size() - 1, allocator); for (size_t row = 0; row < input_rows_count; row++) { value.Clear(); + bool found_any = false; for (size_t col = 1; col < data_columns.size(); ++col) { - value.PushBack(parse_json(json_col, data_columns[col], allocator, row, col, - column_is_consts), - allocator); + auto result = parse_json(json_col, data_columns[col], allocator, row, col, + column_is_consts); + if (result.first) { + found_any = true; + value.PushBack(std::move(result.second), allocator); + } } - insert_result_lambda(value, row); + insert_result_lambda(value, !found_any, row); } } } diff --git a/be/test/vec/function/function_json_test.cpp b/be/test/vec/function/function_json_test.cpp index 988d4ca731a582..8f28a474958537 100644 --- a/be/test/vec/function/function_json_test.cpp +++ b/be/test/vec/function/function_json_test.cpp @@ -72,15 +72,13 @@ TEST(FunctionJsonTEST, GetJsonStringTest) { std::string func_name = "get_json_string"; InputTypeSet input_types = {TypeIndex::String, TypeIndex::String}; DataSet data_set = { - {{VARCHAR("{\"k1\":\"v1\", \"k2\":\"v2\"}"), VARCHAR("$.k1")}, VARCHAR("v1")}, - {{VARCHAR("{\"k1\":\"v1\", \"my.key\":[\"e1\", \"e2\", \"e3\"]}"), - VARCHAR("$.\"my.key\"[1]")}, + {{VARCHAR(R"({"k1":"v1", "k2":"v2"})"), VARCHAR("$.k1")}, VARCHAR("v1")}, + {{VARCHAR(R"({"k1":"v1", "my.key":["e1", "e2", "e3"]})"), VARCHAR("$.\"my.key\"[1]")}, VARCHAR("e2")}, - {{VARCHAR("{\"k1.key\":{\"k2\":[\"v1\", \"v2\"]}}"), VARCHAR("$.\"k1.key\".k2[0]")}, + {{VARCHAR(R"({"k1.key":{"k2":["v1", "v2"]}})"), VARCHAR("$.\"k1.key\".k2[0]")}, VARCHAR("v1")}, - {{VARCHAR("[{\"k1\":\"v1\"}, {\"k2\":\"v2\"}, {\"k1\":\"v3\"}, {\"k1\":\"v4\"}]"), - VARCHAR("$.k1")}, - VARCHAR("[\"v1\",\"v3\",\"v4\"]")}}; + {{VARCHAR(R"([{"k1":"v1"}, {"k2":"v2"}, {"k1":"v3"}, {"k1":"v4"}])"), VARCHAR("$.k1")}, + Null()}}; static_cast(check_function(func_name, input_types, data_set)); } @@ -93,7 +91,7 @@ TEST(FunctionJsonTEST, JsonExtractTest) { // json_extract root DataSet data_set = { {{Null(), STRING("$")}, Null()}, - {{STRING("null"), STRING("$")}, Null()}, + {{STRING("null"), STRING("$")}, STRING("null")}, {{STRING("true"), STRING("$")}, STRING("true")}, {{STRING("false"), STRING("$")}, STRING("false")}, {{STRING("100"), STRING("$")}, STRING("100")}, //int8 @@ -127,7 +125,7 @@ TEST(FunctionJsonTEST, JsonExtractTest) { data_set = { {{Null(), STRING("$")}, Null()}, - {{STRING("null"), STRING("$")}, Null()}, + {{STRING("null"), STRING("$")}, STRING("null")}, {{STRING("true"), STRING("$")}, STRING("true")}, {{STRING("false"), STRING("$")}, STRING("false")}, {{STRING("100"), STRING("$")}, STRING("100")}, //int8 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 de25adfef2e758..b6098cfbf640ad 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 @@ -6189,7 +6189,7 @@ false 14 [123,456] \N 15 ["abc","def"] \N 16 [null,true,false,100,6.18,"abc"] \N -17 [{"k1":"v41","k2":400},1,"a",3.14] ["v41"] +17 [{"k1":"v41","k2":400},1,"a",3.14] \N 18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} "v31" 26 \N \N 27 {"k1":"v1","k2":200} "v1" @@ -6203,61 +6203,61 @@ false -- !select -- 1 \N \N -2 null [null,null] -3 true [null,null] -4 false [null,null] -5 100 [null,null] -6 10000 [null,null] -7 1000000000 [null,null] -8 1152921504606846976 [null,null] -9 6.18 [null,null] -10 "abcd" [null,null] -11 {} [null,null] -12 {"k1":"v31","k2":300} [300,null] -13 [] [null,null] -14 [123,456] [null,456] -15 ["abc","def"] [null,"def"] -16 [null,true,false,100,6.18,"abc"] [null,true] -17 [{"k1":"v41","k2":400},1,"a",3.14] [[400],1] -18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [300,null] +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} [300] +13 [] \N +14 [123,456] [456] +15 ["abc","def"] ["def"] +16 [null,true,false,100,6.18,"abc"] [true] +17 [{"k1":"v41","k2":400},1,"a",3.14] [1] +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [300] 26 \N \N -27 {"k1":"v1","k2":200} [200,null] -28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} [null,null] -29 12524337771678448270 [null,null] -30 -9223372036854775808 [null,null] -31 18446744073709551615 [null,null] -32 {"":"v1"} [null,null] -33 {"":1," ":"v1"} [null,null] -34 {"":1,"ab":"v1"," ":"v1"," ":2} [null,null] +27 {"k1":"v1","k2":200} [200] +28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} \N +29 12524337771678448270 \N +30 -9223372036854775808 \N +31 18446744073709551615 \N +32 {"":"v1"} \N +33 {"":1," ":"v1"} \N +34 {"":1,"ab":"v1"," ":"v1"," ":2} \N -- !select -- 1 \N \N -2 null [null,null] -3 true [null,null] -4 false [null,null] -5 100 [null,null] -6 10000 [null,null] -7 1000000000 [null,null] -8 1152921504606846976 [null,null] -9 6.18 [null,null] -10 "abcd" [null,null] -11 {} [null,null] -12 {"k1":"v31","k2":300} [300,null] -13 [] [null,null] -14 [123,456] [null,null] -15 ["abc","def"] [null,null] -16 [null,true,false,100,6.18,"abc"] [null,null] -17 [{"k1":"v41","k2":400},1,"a",3.14] [[400],null] -18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [300,null] +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} [300] +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [300] 26 \N \N -27 {"k1":"v1","k2":200} [200,null] -28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} [null,null] -29 12524337771678448270 [null,null] -30 -9223372036854775808 [null,null] -31 18446744073709551615 [null,null] -32 {"":"v1"} [null,null] -33 {"":1," ":"v1"} [null,null] -34 {"":1,"ab":"v1"," ":"v1"," ":2} [null,null] +27 {"k1":"v1","k2":200} [200] +28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} \N +29 12524337771678448270 \N +30 -9223372036854775808 \N +31 18446744073709551615 \N +32 {"":"v1"} \N +33 {"":1," ":"v1"} \N +34 {"":1,"ab":"v1"," ":"v1"," ":2} \N -- !select -- 1 \N \N @@ -6290,32 +6290,32 @@ false -- !select -- 1 \N \N -2 null [null,null,null] -3 true [null,null,null] -4 false [null,null,null] -5 100 [null,null,null] -6 10000 [null,null,null] -7 1000000000 [null,null,null] -8 1152921504606846976 [null,null,null] -9 6.18 [null,null,null] -10 "abcd" [null,null,null] -11 {} [null,null,null] -12 {"k1":"v31","k2":300} [null,null,null] -13 [] [null,null,null] -14 [123,456] [null,null,null] -15 ["abc","def"] [null,null,null] -16 [null,true,false,100,6.18,"abc"] [null,null,null] -17 [{"k1":"v41","k2":400},1,"a",3.14] [null,null,null] +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N 18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} ["v41",400,"a"] 26 \N \N -27 {"k1":"v1","k2":200} [null,null,null] -28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} [null,null,null] -29 12524337771678448270 [null,null,null] -30 -9223372036854775808 [null,null,null] -31 18446744073709551615 [null,null,null] -32 {"":"v1"} [null,null,null] -33 {"":1," ":"v1"} [null,null,null] -34 {"":1,"ab":"v1"," ":"v1"," ":2} [null,null,null] +27 {"k1":"v1","k2":200} \N +28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} \N +29 12524337771678448270 \N +30 -9223372036854775808 \N +31 18446744073709551615 \N +32 {"":"v1"} \N +33 {"":1," ":"v1"} \N +34 {"":1,"ab":"v1"," ":"v1"," ":2} \N -- !select -- 2 null @@ -11664,7 +11664,7 @@ false 14 [123,456] \N 15 ["abc","def"] \N 16 [null,true,false,100,6.18,"abc"] \N -17 [{"k1":"v41","k2":400},1,"a",3.14] ["v41"] +17 [{"k1":"v41","k2":400},1,"a",3.14] \N 18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} "v31" 27 {"k1":"v1","k2":200} "v1" 28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} \N @@ -11676,58 +11676,58 @@ false 34 {"":1,"ab":"v1"," ":"v1"," ":2} \N -- !select -- -2 null [null,null] -3 true [null,null] -4 false [null,null] -5 100 [null,null] -6 10000 [null,null] -7 1000000000 [null,null] -8 1152921504606846976 [null,null] -9 6.18 [null,null] -10 "abcd" [null,null] -11 {} [null,null] -12 {"k1":"v31","k2":300} [300,null] -13 [] [null,null] -14 [123,456] [null,456] -15 ["abc","def"] [null,"def"] -16 [null,true,false,100,6.18,"abc"] [null,true] -17 [{"k1":"v41","k2":400},1,"a",3.14] [[400],1] -18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [300,null] -27 {"k1":"v1","k2":200} [200,null] -28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} [null,null] -29 12524337771678448270 [null,null] -30 -9223372036854775808 [null,null] -31 18446744073709551615 [null,null] -32 {"":"v1"} [null,null] -33 {"":1," ":"v1"} [null,null] -34 {"":1,"ab":"v1"," ":"v1"," ":2} [null,null] +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} [300] +13 [] \N +14 [123,456] [456] +15 ["abc","def"] ["def"] +16 [null,true,false,100,6.18,"abc"] [true] +17 [{"k1":"v41","k2":400},1,"a",3.14] [1] +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [300] +27 {"k1":"v1","k2":200} [200] +28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} \N +29 12524337771678448270 \N +30 -9223372036854775808 \N +31 18446744073709551615 \N +32 {"":"v1"} \N +33 {"":1," ":"v1"} \N +34 {"":1,"ab":"v1"," ":"v1"," ":2} \N -- !select -- -2 null [null,null] -3 true [null,null] -4 false [null,null] -5 100 [null,null] -6 10000 [null,null] -7 1000000000 [null,null] -8 1152921504606846976 [null,null] -9 6.18 [null,null] -10 "abcd" [null,null] -11 {} [null,null] -12 {"k1":"v31","k2":300} [300,null] -13 [] [null,null] -14 [123,456] [null,null] -15 ["abc","def"] [null,null] -16 [null,true,false,100,6.18,"abc"] [null,null] -17 [{"k1":"v41","k2":400},1,"a",3.14] [[400],null] -18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [300,null] -27 {"k1":"v1","k2":200} [200,null] -28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} [null,null] -29 12524337771678448270 [null,null] -30 -9223372036854775808 [null,null] -31 18446744073709551615 [null,null] -32 {"":"v1"} [null,null] -33 {"":1," ":"v1"} [null,null] -34 {"":1,"ab":"v1"," ":"v1"," ":2} [null,null] +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} [300] +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [300] +27 {"k1":"v1","k2":200} [200] +28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} \N +29 12524337771678448270 \N +30 -9223372036854775808 \N +31 18446744073709551615 \N +32 {"":"v1"} \N +33 {"":1," ":"v1"} \N +34 {"":1,"ab":"v1"," ":"v1"," ":2} \N -- !select -- 2 null \N @@ -11757,31 +11757,31 @@ false 34 {"":1,"ab":"v1"," ":"v1"," ":2} \N -- !select -- -2 null [null,null,null] -3 true [null,null,null] -4 false [null,null,null] -5 100 [null,null,null] -6 10000 [null,null,null] -7 1000000000 [null,null,null] -8 1152921504606846976 [null,null,null] -9 6.18 [null,null,null] -10 "abcd" [null,null,null] -11 {} [null,null,null] -12 {"k1":"v31","k2":300} [null,null,null] -13 [] [null,null,null] -14 [123,456] [null,null,null] -15 ["abc","def"] [null,null,null] -16 [null,true,false,100,6.18,"abc"] [null,null,null] -17 [{"k1":"v41","k2":400},1,"a",3.14] [null,null,null] +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N 18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} ["v41",400,"a"] -27 {"k1":"v1","k2":200} [null,null,null] -28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} [null,null,null] -29 12524337771678448270 [null,null,null] -30 -9223372036854775808 [null,null,null] -31 18446744073709551615 [null,null,null] -32 {"":"v1"} [null,null,null] -33 {"":1," ":"v1"} [null,null,null] -34 {"":1,"ab":"v1"," ":"v1"," ":2} [null,null,null] +27 {"k1":"v1","k2":200} \N +28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} \N +29 12524337771678448270 \N +30 -9223372036854775808 \N +31 18446744073709551615 \N +32 {"":"v1"} \N +33 {"":1," ":"v1"} \N +34 {"":1,"ab":"v1"," ":"v1"," ":2} \N -- !sql_json_parse -- {"":"v1"} diff --git a/regression-test/data/jsonb_p0/test_jsonb_load_and_function.out b/regression-test/data/jsonb_p0/test_jsonb_load_and_function.out index dbd756dab9d0bb..d7d7611931fdb3 100644 --- a/regression-test/data/jsonb_p0/test_jsonb_load_and_function.out +++ b/regression-test/data/jsonb_p0/test_jsonb_load_and_function.out @@ -8187,7 +8187,7 @@ false 14 [123,456] \N 15 ["abc","def"] \N 16 [null,true,false,100,6.18,"abc"] \N -17 [{"k1":"v41","k2":400},1,"a",3.14] ["v41"] +17 [{"k1":"v41","k2":400},1,"a",3.14] \N 18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} "v31" 26 \N \N 27 {"k1":"v1","k2":200} "v1" @@ -8201,61 +8201,61 @@ false -- !select -- 1 \N \N -2 null [null,null] -3 true [null,null] -4 false [null,null] -5 100 [null,null] -6 10000 [null,null] -7 1000000000 [null,null] -8 1152921504606846976 [null,null] -9 6.18 [null,null] -10 "abcd" [null,null] -11 {} [null,null] -12 {"k1":"v31","k2":300} [300,null] -13 [] [null,null] -14 [123,456] [null,456] -15 ["abc","def"] [null,"def"] -16 [null,true,false,100,6.18,"abc"] [null,true] -17 [{"k1":"v41","k2":400},1,"a",3.14] [[400],1] -18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [300,null] +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} [300] +13 [] \N +14 [123,456] [456] +15 ["abc","def"] ["def"] +16 [null,true,false,100,6.18,"abc"] [true] +17 [{"k1":"v41","k2":400},1,"a",3.14] [1] +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [300] 26 \N \N -27 {"k1":"v1","k2":200} [200,null] -28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} [null,null] -29 12524337771678448270 [null,null] -30 -9223372036854775808 [null,null] -31 18446744073709551615 [null,null] -32 {"":"v1"} [null,null] -33 {"":1," ":"v1"} [null,null] -34 {"":1,"ab":"v1"," ":"v1"," ":2} [null,null] +27 {"k1":"v1","k2":200} [200] +28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} \N +29 12524337771678448270 \N +30 -9223372036854775808 \N +31 18446744073709551615 \N +32 {"":"v1"} \N +33 {"":1," ":"v1"} \N +34 {"":1,"ab":"v1"," ":"v1"," ":2} \N -- !select -- 1 \N \N -2 null [null,null] -3 true [null,null] -4 false [null,null] -5 100 [null,null] -6 10000 [null,null] -7 1000000000 [null,null] -8 1152921504606846976 [null,null] -9 6.18 [null,null] -10 "abcd" [null,null] -11 {} [null,null] -12 {"k1":"v31","k2":300} [300,null] -13 [] [null,null] -14 [123,456] [null,null] -15 ["abc","def"] [null,null] -16 [null,true,false,100,6.18,"abc"] [null,null] -17 [{"k1":"v41","k2":400},1,"a",3.14] [[400],null] -18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [300,null] +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} [300] +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [300] 26 \N \N -27 {"k1":"v1","k2":200} [200,null] -28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} [null,null] -29 12524337771678448270 [null,null] -30 -9223372036854775808 [null,null] -31 18446744073709551615 [null,null] -32 {"":"v1"} [null,null] -33 {"":1," ":"v1"} [null,null] -34 {"":1,"ab":"v1"," ":"v1"," ":2} [null,null] +27 {"k1":"v1","k2":200} [200] +28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} \N +29 12524337771678448270 \N +30 -9223372036854775808 \N +31 18446744073709551615 \N +32 {"":"v1"} \N +33 {"":1," ":"v1"} \N +34 {"":1,"ab":"v1"," ":"v1"," ":2} \N -- !select -- 1 \N \N @@ -8288,32 +8288,32 @@ false -- !select -- 1 \N \N -2 null [null,null,null] -3 true [null,null,null] -4 false [null,null,null] -5 100 [null,null,null] -6 10000 [null,null,null] -7 1000000000 [null,null,null] -8 1152921504606846976 [null,null,null] -9 6.18 [null,null,null] -10 "abcd" [null,null,null] -11 {} [null,null,null] -12 {"k1":"v31","k2":300} [null,null,null] -13 [] [null,null,null] -14 [123,456] [null,null,null] -15 ["abc","def"] [null,null,null] -16 [null,true,false,100,6.18,"abc"] [null,null,null] -17 [{"k1":"v41","k2":400},1,"a",3.14] [null,null,null] +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N 18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} ["v41",400,"a"] 26 \N \N -27 {"k1":"v1","k2":200} [null,null,null] -28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} [null,null,null] -29 12524337771678448270 [null,null,null] -30 -9223372036854775808 [null,null,null] -31 18446744073709551615 [null,null,null] -32 {"":"v1"} [null,null,null] -33 {"":1," ":"v1"} [null,null,null] -34 {"":1,"ab":"v1"," ":"v1"," ":2} [null,null,null] +27 {"k1":"v1","k2":200} \N +28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} \N +29 12524337771678448270 \N +30 -9223372036854775808 \N +31 18446744073709551615 \N +32 {"":"v1"} \N +33 {"":1," ":"v1"} \N +34 {"":1,"ab":"v1"," ":"v1"," ":2} \N -- !sql_json_length -- 1 diff --git a/regression-test/data/nereids_function_p0/scalar_function/J.out b/regression-test/data/nereids_function_p0/scalar_function/J.out index 64a76e24826c10..dc1c34eafe65f6 100644 --- a/regression-test/data/nereids_function_p0/scalar_function/J.out +++ b/regression-test/data/nereids_function_p0/scalar_function/J.out @@ -7348,7 +7348,7 @@ false 14 [123,456] \N 15 ["abc","def"] \N 16 [null,true,false,100,6.18,"abc"] \N -17 [{"k1":"v41","k2":400},1,"a",3.14] ["v41"] +17 [{"k1":"v41","k2":400},1,"a",3.14] \N 18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} "v31" 26 \N \N 27 {"k1":"v1","k2":200} "v1" @@ -7359,55 +7359,55 @@ false -- !select -- 1 \N \N -2 null [null,null] -3 true [null,null] -4 false [null,null] -5 100 [null,null] -6 10000 [null,null] -7 1000000000 [null,null] -8 1152921504606846976 [null,null] -9 6.18 [null,null] -10 "abcd" [null,null] -11 {} [null,null] -12 {"k1":"v31","k2":300} [300,null] -13 [] [null,null] -14 [123,456] [null,456] -15 ["abc","def"] [null,"def"] -16 [null,true,false,100,6.18,"abc"] [null,true] -17 [{"k1":"v41","k2":400},1,"a",3.14] [[400],1] -18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [300,null] +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} [300] +13 [] \N +14 [123,456] [456] +15 ["abc","def"] ["def"] +16 [null,true,false,100,6.18,"abc"] [true] +17 [{"k1":"v41","k2":400},1,"a",3.14] [1] +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [300] 26 \N \N -27 {"k1":"v1","k2":200} [200,null] -28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} [null,null] -29 12524337771678448270 [null,null] -30 -9223372036854775808 [null,null] -31 18446744073709551615 [null,null] +27 {"k1":"v1","k2":200} [200] +28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} \N +29 12524337771678448270 \N +30 -9223372036854775808 \N +31 18446744073709551615 \N -- !select -- 1 \N \N -2 null [null,null] -3 true [null,null] -4 false [null,null] -5 100 [null,null] -6 10000 [null,null] -7 1000000000 [null,null] -8 1152921504606846976 [null,null] -9 6.18 [null,null] -10 "abcd" [null,null] -11 {} [null,null] -12 {"k1":"v31","k2":300} [300,null] -13 [] [null,null] -14 [123,456] [null,null] -15 ["abc","def"] [null,null] -16 [null,true,false,100,6.18,"abc"] [null,null] -17 [{"k1":"v41","k2":400},1,"a",3.14] [[400],null] -18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [300,null] +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} [300] +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [300] 26 \N \N -27 {"k1":"v1","k2":200} [200,null] -28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} [null,null] -29 12524337771678448270 [null,null] -30 -9223372036854775808 [null,null] -31 18446744073709551615 [null,null] +27 {"k1":"v1","k2":200} [200] +28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} \N +29 12524337771678448270 \N +30 -9223372036854775808 \N +31 18446744073709551615 \N -- !select -- 1 \N \N @@ -7437,29 +7437,29 @@ false -- !select -- 1 \N \N -2 null [null,null,null] -3 true [null,null,null] -4 false [null,null,null] -5 100 [null,null,null] -6 10000 [null,null,null] -7 1000000000 [null,null,null] -8 1152921504606846976 [null,null,null] -9 6.18 [null,null,null] -10 "abcd" [null,null,null] -11 {} [null,null,null] -12 {"k1":"v31","k2":300} [null,null,null] -13 [] [null,null,null] -14 [123,456] [null,null,null] -15 ["abc","def"] [null,null,null] -16 [null,true,false,100,6.18,"abc"] [null,null,null] -17 [{"k1":"v41","k2":400},1,"a",3.14] [null,null,null] +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N 18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} ["v41",400,"a"] 26 \N \N -27 {"k1":"v1","k2":200} [null,null,null] -28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} [null,null,null] -29 12524337771678448270 [null,null,null] -30 -9223372036854775808 [null,null,null] -31 18446744073709551615 [null,null,null] +27 {"k1":"v1","k2":200} \N +28 {"a.b.c":{"k1.a1":"v31","k2":300},"a":"niu"} \N +29 12524337771678448270 \N +30 -9223372036854775808 \N +31 18446744073709551615 \N -- !json_extract_string -- "v31" diff --git a/regression-test/data/query_p0/sql_functions/json_functions/test_json_extract.out b/regression-test/data/query_p0/sql_functions/json_functions/test_json_extract.out index 2b64e92fd3ef58..822470fb2732f3 100644 --- a/regression-test/data/query_p0/sql_functions/json_functions/test_json_extract.out +++ b/regression-test/data/query_p0/sql_functions/json_functions/test_json_extract.out @@ -20,3 +20,5 @@ v31 -- !sql_string7 -- \N +-- !fix_array_path -- +[123] [123] [123] [123] diff --git a/regression-test/suites/query_p0/sql_functions/json_functions/test_json_extract.groovy b/regression-test/suites/query_p0/sql_functions/json_functions/test_json_extract.groovy index 41e68111d79d77..b728f7ee517a9b 100644 --- a/regression-test/suites/query_p0/sql_functions/json_functions/test_json_extract.groovy +++ b/regression-test/suites/query_p0/sql_functions/json_functions/test_json_extract.groovy @@ -28,4 +28,12 @@ suite("test_json_extract") { sql """ SELECT JSON_EXTRACT_STRING('{"id": 123, "name": "doris"}', '\$.'); """ exception "Invalid Json Path for value: \$." } + + qt_fix_array_path """ + select + JSON_EXTRACT('[{"key": [123]}]', '\$[0].key') v1 + , JSON_EXTRACT('[{"key": [123]}]', '\$.[0].key') v2 + , JSONB_EXTRACT('[{"key": [123]}]', '\$[0].key') v3 + , JSONB_EXTRACT('[{"key": [123]}]', '\$.[0].key') v4; + """ }