Skip to content

Commit

Permalink
apacheGH-38879: [C++][Gandiva] Fix Gandiva to_date function's validat…
Browse files Browse the repository at this point in the history
…ion for supress errors parameter (apache#38987)

* This PR fixes the `to_date_utf8_utf8_int32` gandiva function to avoid crash for invalid input

* A bug fix for to_date_utf8_utf8_int32 parameter validation

Yes, new tests are added to verify non literal input won't crash the to_date_utf8_utf8_int32 function

No
* Closes: apache#38879

Authored-by: Yue Ni <[email protected]>
Signed-off-by: Sutou Kouhei <[email protected]>
  • Loading branch information
niyue authored and DenisTarasyuk committed May 15, 2024
1 parent 1605358 commit c3b368a
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 6 deletions.
2 changes: 1 addition & 1 deletion cpp/src/gandiva/to_date_holder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ Status ToDateHolder::Make(const FunctionNode& node,
if (node.children().size() == 3) {
auto literal_suppress_errors =
dynamic_cast<LiteralNode*>(node.children().at(2).get());
if (literal_pattern == nullptr) {
if (literal_suppress_errors == nullptr) {
return Status::Invalid(
"The (optional) third parameter to 'to_date' function needs to an integer "
"literal to indicate whether to suppress the error");
Expand Down
26 changes: 21 additions & 5 deletions cpp/src/gandiva/to_date_holder_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,18 @@ namespace gandiva {

class TestToDateHolder : public ::testing::Test {
public:
FunctionNode BuildToDate(std::string pattern) {
FunctionNode BuildToDate(std::string pattern,
std::shared_ptr<Node> suppress_error_node = nullptr) {
auto field = std::make_shared<FieldNode>(arrow::field("in", arrow::utf8()));
auto pattern_node =
std::make_shared<LiteralNode>(arrow::utf8(), LiteralHolder(pattern), false);
auto suppress_error_node =
std::make_shared<LiteralNode>(arrow::int32(), LiteralHolder(0), false);
return FunctionNode("to_date_utf8_utf8_int32",
{field, pattern_node, suppress_error_node}, arrow::int64());
if (suppress_error_node == nullptr) {
suppress_error_node =
std::make_shared<LiteralNode>(arrow::int32(), LiteralHolder(0), false);
}
return {"to_date_utf8_utf8_int32",
{field, pattern_node, std::move(suppress_error_node)},
arrow::int64()};
}

protected:
Expand Down Expand Up @@ -178,4 +182,16 @@ TEST_F(TestToDateHolder, TestSimpleDateYear) {
EXPECT_EQ(millis_since_epoch, 915148800000);
}

TEST_F(TestToDateHolder, TestMakeFromFunctionNode) {
std::shared_ptr<ToDateHolder> to_date_holder;
auto to_date_func = BuildToDate("YYYY");
ASSERT_OK(ToDateHolder::Make(to_date_func, &to_date_holder));
}

TEST_F(TestToDateHolder, TestMakeFromInvalidSurpressParamFunctionNode) {
std::shared_ptr<ToDateHolder> to_date_holder;
auto non_literal_param = std::make_shared<FieldNode>(arrow::field("in", arrow::utf8()));
auto to_date_func = BuildToDate("YYYY", std::move(non_literal_param));
ASSERT_RAISES(Invalid, ToDateHolder::Make(to_date_func, &to_date_holder));
}
} // namespace gandiva

0 comments on commit c3b368a

Please sign in to comment.