This is an automated email from the ASF dual-hosted git repository.
kou pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/main by this push:
new d66780d90c GH-38879: [C++][Gandiva] Fix Gandiva to_date function's
validation for supress errors parameter (#38987)
d66780d90c is described below
commit d66780d90c6faf7bf051cbf12b4b68dff098bd54
Author: Yue <[email protected]>
AuthorDate: Thu Nov 30 03:55:14 2023 +0800
GH-38879: [C++][Gandiva] Fix Gandiva to_date function's validation for
supress errors parameter (#38987)
### Rationale for this change
* This PR fixes the `to_date_utf8_utf8_int32` gandiva function to avoid
crash for invalid input
### What changes are included in this PR?
* A bug fix for to_date_utf8_utf8_int32 parameter validation
### Are these changes tested?
Yes, new tests are added to verify non literal input won't crash the
to_date_utf8_utf8_int32 function
### Are there any user-facing changes?
No
* Closes: #38879
Authored-by: Yue Ni <[email protected]>
Signed-off-by: Sutou Kouhei <[email protected]>
---
cpp/src/gandiva/to_date_holder.cc | 2 +-
cpp/src/gandiva/to_date_holder_test.cc | 24 +++++++++++++++++++-----
2 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/cpp/src/gandiva/to_date_holder.cc
b/cpp/src/gandiva/to_date_holder.cc
index 0778c39b4c..76f16f0cb1 100644
--- a/cpp/src/gandiva/to_date_holder.cc
+++ b/cpp/src/gandiva/to_date_holder.cc
@@ -50,7 +50,7 @@ Result<std::shared_ptr<ToDateHolder>>
ToDateHolder::Make(const FunctionNode& nod
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");
diff --git a/cpp/src/gandiva/to_date_holder_test.cc
b/cpp/src/gandiva/to_date_holder_test.cc
index 1e0f2e1578..1612d9b4f4 100644
--- a/cpp/src/gandiva/to_date_holder_test.cc
+++ b/cpp/src/gandiva/to_date_holder_test.cc
@@ -29,14 +29,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:
@@ -167,4 +171,14 @@ TEST_F(TestToDateHolder, TestSimpleDateYear) {
EXPECT_EQ(millis_since_epoch, 915148800000);
}
+TEST_F(TestToDateHolder, TestMakeFromFunctionNode) {
+ auto to_date_func = BuildToDate("YYYY");
+ EXPECT_OK_AND_ASSIGN(auto to_date_holder, ToDateHolder::Make(to_date_func));
+}
+
+TEST_F(TestToDateHolder, TestMakeFromInvalidSurpressParamFunctionNode) {
+ 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).status());
+}
} // namespace gandiva