From d1d5a033ace8cfac026d4c35562f7e6aa8f2ef66 Mon Sep 17 00:00:00 2001 From: philo Date: Fri, 9 Sep 2022 16:42:25 +0800 Subject: [PATCH] Return raw string if meeting parsing string error --- cpp/src/gandiva/json_holder.cc | 8 ++++++++ cpp/src/gandiva/json_holder_test.cc | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/cpp/src/gandiva/json_holder.cc b/cpp/src/gandiva/json_holder.cc index fdf4318d92e2..59d1755ce477 100644 --- a/cpp/src/gandiva/json_holder.cc +++ b/cpp/src/gandiva/json_holder.cc @@ -52,6 +52,14 @@ error_code handle_types(simdjson_result raw_res, std::string* r std::string_view res_view; auto error = raw_res.get_string().get(res_view); *res = std::string(res_view); + // Return raw string if meeting parsing string error. + if (error == STRING_ERROR) { + ondemand::raw_json_string raw_string; + error = raw_res.get_raw_json_string().get(raw_string); + std::stringstream ss; + ss << raw_string; + *res = ss.str(); + } return error; } case ondemand::json_type::boolean: { diff --git a/cpp/src/gandiva/json_holder_test.cc b/cpp/src/gandiva/json_holder_test.cc index fe6d7f0ada7a..84025b4d97a3 100644 --- a/cpp/src/gandiva/json_holder_test.cc +++ b/cpp/src/gandiva/json_holder_test.cc @@ -140,6 +140,12 @@ TEST_F(TestJsonHolder, TestJson) { data = get_json_object(&execution_context_, R"([{"my": {"param": {"name": "fang"quoted""}}}, {"other": ["placeholder1", "placeholder2"]}])", "$[0].my.param.name", &out_len); EXPECT_EQ(data, nullptr); + + // Return raw string. + data = get_json_object(&execution_context_, R"({"hello": "abc\xcc\xcc"})", "$.hello", &out_len); + expected_res = "abc\\xcc\\xcc"; + EXPECT_EQ(out_len, expected_res.length()); + EXPECT_EQ(std::string((char*)data, out_len), expected_res); } } // namespace gandiva