[fix](json) Add . after in JSON path to support correct token parsing (#52543) (#52544)

Boost tokenizer requires explicit "." after "$" to correctly extract
JSON path tokens. Without this, expressions like "$[0].key" cannot be
properly split, causing issues in downstream logic. This commit ensures
a "." is automatically added after "$" to maintain consistent token
parsing behavior.
This commit is contained in:
Jerry Hu
2025-07-03 14:36:53 +08:00
committed by GitHub
parent fb70742e87
commit 6404277795
9 changed files with 428 additions and 440 deletions

View File

@ -145,45 +145,7 @@ rapidjson::Value* match_value(const std::vector<JsonPath>& 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<rapidjson::Value*>(
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<bool, rapidjson::Value> 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_FUN_STRING>(json_string, path_string, &document);
auto* root = get_json_object<JSON_FUN_STRING>(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<const ColumnString*>& data_columns,
@ -874,30 +845,41 @@ struct FunctionJsonExtractImpl {
rapidjson::StringBuffer buf;
rapidjson::Writer<rapidjson::StringBuffer> 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());
}
}
};

View File

@ -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) {

View File

@ -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<void>(check_function<DataTypeString, true>(func_name, input_types, data_set));
}

View File

@ -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"}

View File

@ -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

View File

@ -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"

View File

@ -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"}

View File

@ -20,3 +20,5 @@ v31
-- !sql_string7 --
\N
-- !fix_array_path --
[123] [123]

View File

@ -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;
"""
}