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