diff --git a/be/src/vec/functions/function_json.cpp b/be/src/vec/functions/function_json.cpp index 346c6005b9..22a6871805 100644 --- a/be/src/vec/functions/function_json.cpp +++ b/be/src/vec/functions/function_json.cpp @@ -145,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 { @@ -234,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 { @@ -252,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)) { @@ -271,10 +242,7 @@ rapidjson::Value* get_json_object(std::string_view json_string, std::string_view document->Parse(json_string.data(), json_string.size()); 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()); @@ -849,9 +817,9 @@ struct FunctionJsonQuoteImpl { struct FunctionJsonExtractImpl { static constexpr auto name = "json_extract"; - static rapidjson::Value parse_json(const ColumnString* json_col, const ColumnString* path_col, - rapidjson::Document::AllocatorType& allocator, - const int row) { + static std::pair parse_json( + const ColumnString* json_col, const ColumnString* path_col, + rapidjson::Document::AllocatorType& allocator, const int row) { rapidjson::Value value; rapidjson::Document document; @@ -860,11 +828,14 @@ struct FunctionJsonExtractImpl { const auto path = path_col->get_data_at(row); std::string_view path_string(path.data, path.size); - auto root = get_json_object(json_string, path_string, &document); + 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 void execute(const std::vector& data_columns, @@ -874,30 +845,41 @@ struct FunctionJsonExtractImpl { rapidjson::StringBuffer buf; rapidjson::Writer writer(buf); - const auto json_col = data_columns[0]; + const auto* json_col = data_columns[0]; for (size_t row = 0; row < input_rows_count; row++) { rapidjson::Value value; if (data_columns.size() == 2) { - value = parse_json(json_col, data_columns[1], allocator, row); + auto result = parse_json(json_col, data_columns[1], allocator, row); + if (result.first) { + value = std::move(result.second); + } else { + null_map[row] = 1; + result_column.insert_default(); + continue; + } } else { + bool found_any = false; value.SetArray(); value.Reserve(data_columns.size() - 1, allocator); for (size_t col = 1; col < data_columns.size(); ++col) { - value.PushBack(parse_json(json_col, data_columns[col], allocator, row), - allocator); + auto result = parse_json(json_col, data_columns[col], allocator, row); + if (result.first) { + found_any = true; + value.PushBack(std::move(result.second), allocator); + } + } + if (!found_any) { + null_map[row] = 1; + result_column.insert_default(); + continue; } } - if (value.IsNull()) { - null_map[row] = 1; - result_column.insert_default(); - } else { - // write value as string - buf.Clear(); - writer.Reset(buf); - value.Accept(writer); - result_column.insert_data(buf.GetString(), buf.GetSize()); - } + // write value as string + buf.Clear(); + writer.Reset(buf); + value.Accept(writer); + result_column.insert_data(buf.GetString(), buf.GetSize()); } } }; diff --git a/be/test/util/jsonb_parser_simd_test.cpp b/be/test/util/jsonb_parser_simd_test.cpp index 4fff867d53..3e7e70cf66 100644 --- a/be/test/util/jsonb_parser_simd_test.cpp +++ b/be/test/util/jsonb_parser_simd_test.cpp @@ -232,7 +232,7 @@ TEST_F(JsonbParserTest, ParseJsonWithLongInt) { TEST_F(JsonbParserTest, ParseInvalidJsonFormat) { std::string_view invalid_json = R"({"key": "value")"; - EXPECT_EQ(parse_json_and_check(invalid_json, invalid_json), JsonbErrType::E_INVALID_KEY_STRING); + EXPECT_NE(parse_json_and_check(invalid_json, invalid_json), JsonbErrType::E_NONE); } TEST_F(JsonbParserTest, ParseJsonWithInvalidKeyType) { diff --git a/be/test/vec/function/function_json_test.cpp b/be/test/vec/function/function_json_test.cpp index ceecadf64c..9c79b71246 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)); } 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 c82e38aa21..9928a5943a 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 8f871ec68e..773061f7bd 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 64a76e2482..dc1c34eafe 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/nereids_p0/json_p0/test_json_load_and_function.out b/regression-test/data/nereids_p0/json_p0/test_json_load_and_function.out index 892c9e8fe8..c8bbe10e57 100644 --- a/regression-test/data/nereids_p0/json_p0/test_json_load_and_function.out +++ b/regression-test/data/nereids_p0/json_p0/test_json_load_and_function.out @@ -6186,7 +6186,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" @@ -6200,61 +6200,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 @@ -6287,32 +6287,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_parse -- {"":"v1"} 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 2b64e92fd3..c800dc75f7 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] 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 41e68111d7..b3e202be28 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,10 @@ 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; + """ }