common_function/system/
build.rs1use std::sync::Arc;
16
17use datafusion::arrow::array::StringViewArray;
18use datafusion::arrow::datatypes::DataType;
19use datafusion::logical_expr::ColumnarValue;
20use datafusion_expr::{ScalarFunctionArgs, Signature, Volatility};
21
22use crate::function::Function;
23use crate::system::define_nullary_udf;
24
25define_nullary_udf!(
26BuildFunction);
28
29impl Function for BuildFunction {
30 fn name(&self) -> &str {
31 "build"
32 }
33
34 fn return_type(&self, _: &[DataType]) -> datafusion_common::Result<DataType> {
35 Ok(DataType::Utf8View)
36 }
37
38 fn signature(&self) -> &Signature {
39 &self.signature
40 }
41
42 fn invoke_with_args(&self, _: ScalarFunctionArgs) -> datafusion_common::Result<ColumnarValue> {
43 let build_info = common_version::build_info().to_string();
44 Ok(ColumnarValue::Array(Arc::new(StringViewArray::from(vec![
45 build_info,
46 ]))))
47 }
48}
49
50#[cfg(test)]
51mod tests {
52 use std::sync::Arc;
53
54 use arrow_schema::Field;
55 use datafusion::arrow::array::ArrayRef;
56 use datafusion_common::config::ConfigOptions;
57
58 use super::*;
59 #[test]
60 fn test_build_function() {
61 let build = BuildFunction::default();
62 assert_eq!("build", build.name());
63 assert_eq!(DataType::Utf8View, build.return_type(&[]).unwrap());
64 let build_info = common_version::build_info().to_string();
65 let actual = build
66 .invoke_with_args(ScalarFunctionArgs {
67 args: vec![],
68 arg_fields: vec![],
69 number_rows: 0,
70 return_field: Arc::new(Field::new("x", DataType::Utf8View, false)),
71 config_options: Arc::new(ConfigOptions::new()),
72 })
73 .unwrap();
74 let actual = ColumnarValue::values_to_arrays(&[actual]).unwrap();
75 let expect = vec![Arc::new(StringViewArray::from(vec![build_info])) as ArrayRef];
76 assert_eq!(actual, expect);
77 }
78}