niyue commented on code in PR #38632:
URL: https://github.com/apache/arrow/pull/38632#discussion_r1387917726


##########
cpp/src/gandiva/tests/test_util.cc:
##########
@@ -42,11 +46,129 @@ NativeFunction GetTestExternalFunction() {
   return multiply_by_two_func;
 }
 
-std::shared_ptr<Configuration> TestConfigurationWithFunctionRegistry(
+static NativeFunction GetTestExternalCInterfaceFunction() {
+  NativeFunction multiply_by_three_func(
+      "multiply_by_three", {}, {arrow::int32()}, arrow::int64(),
+      ResultNullableType::kResultNullIfNull, "multiply_by_three_int32");
+  return multiply_by_three_func;
+}
+
+static NativeFunction GetTestFunctionWithFunctionHolder() {
+  // the 2nd parameter is expected to be an int32 literal
+  NativeFunction multiply_by_n_func("multiply_by_n", {}, {arrow::int32(), 
arrow::int32()},
+                                    arrow::int64(), 
ResultNullableType::kResultNullIfNull,
+                                    "multiply_by_n_int32_int32",
+                                    NativeFunction::kNeedsFunctionHolder);
+  return multiply_by_n_func;
+}
+
+static NativeFunction GetTestFunctionWithContext() {
+  NativeFunction multiply_by_two_formula(
+      "multiply_by_two_formula", {}, {arrow::utf8()}, arrow::utf8(),
+      ResultNullableType::kResultNullIfNull, "multiply_by_two_formula_utf8",
+      NativeFunction::kNeedsContext);
+  return multiply_by_two_formula;
+}
+
+static std::shared_ptr<Configuration> BuildConfigurationWithRegistry(
+    std::shared_ptr<FunctionRegistry> registry,
+    const std::function<arrow::Status(std::shared_ptr<FunctionRegistry>)>&
+        register_func) {
+  ARROW_EXPECT_OK(register_func(registry));
+  return ConfigurationBuilder().build(std::move(registry));
+}
+
+std::shared_ptr<Configuration> TestConfigWithFunctionRegistry(
+    std::shared_ptr<FunctionRegistry> registry) {
+  return BuildConfigurationWithRegistry(std::move(registry), [](auto reg) {
+    return reg->Register({GetTestExternalFunction()}, 
GetTestFunctionLLVMIRPath());
+  });
+}
+
+class MultiplyHolder : public FunctionHolder {
+ public:
+  explicit MultiplyHolder(int32_t num) : num_(num) {}
+
+  static Status Make(const FunctionNode& node, 
std::shared_ptr<MultiplyHolder>* holder) {
+    ARROW_RETURN_IF(node.children().size() != 2,
+                    Status::Invalid("'multiply_by_n' function requires two 
parameters"));
+
+    auto literal = dynamic_cast<LiteralNode*>(node.children().at(1).get());
+    ARROW_RETURN_IF(
+        literal == nullptr,
+        Status::Invalid(
+            "'multiply_by_n' function requires a literal as the 2nd 
parameter"));
+
+    auto literal_type = literal->return_type()->id();
+    ARROW_RETURN_IF(
+        literal_type != arrow::Type::INT32,
+        Status::Invalid(
+            "'multiply_by_n' function requires an int32 literal as the 2nd 
parameter"));
+
+    *holder = std::make_shared<MultiplyHolder>(
+        literal->is_null() ? 0 : std::get<int32_t>(literal->holder()));
+    return Status::OK();
+  }
+
+  int32_t operator()() const { return num_; }
+
+ private:
+  int32_t num_;
+};
+
+extern "C" {
+// this function is used as an external stub function for testing so it has to 
be declared

Review Comment:
   Fixed.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to