返回

Databend 内置标量函数开发指南

闲谈

什么是标量函数?

标量函数(有时被称为用户自定义函数/UDF)为每条记录返回一个单一的值,而不是作为一个结果集,并且可以在查询或 SET 语句中的大多数地方使用,除了 FROM 子句。

在 Databend 中,内置标量函数是使用 Rust 编写的,并且可以被 Rust trait 扩展。这使得您可以轻松地添加新的函数到 Databend,而无需修改 Databend 的核心代码。

如何实现一个标量函数?

要实现一个标量函数,您需要创建一个 Rust 结构体,该结构体实现了 ScalarFunction trait。ScalarFunction trait 定义了以下方法:

  • name: 返回函数的名称。
  • signature: 返回函数的参数类型和返回值类型。
  • eval: 评估函数并返回结果。

您还可以通过实现 ScalarFunctionExt trait 来扩展内置函数的功能。ScalarFunctionExt trait 定义了以下方法:

  • deterministic: 指示函数是否是确定的,即对于给定的输入,函数总是返回相同的结果。
  • monotonic: 指示函数是否是单调的,即对于给定的输入,函数的返回值总是递增或递减。
  • final: 指示函数是否可以作为其他函数的参数使用。

如何使用 trait 来扩展内置函数的功能?

您可以通过实现 ScalarFunctionExt trait 来扩展内置函数的功能。ScalarFunctionExt trait 定义了以下方法:

  • deterministic: 指示函数是否是确定的,即对于给定的输入,函数总是返回相同的结果。
  • monotonic: 指示函数是否是单调的,即对于给定的输入,函数的返回值总是递增或递减。
  • final: 指示函数是否可以作为其他函数的参数使用。

例如,您可以实现 deterministic 方法来指示函数是确定的,或者实现 monotonic 方法来指示函数是单调的。

如何对标量函数进行测试和部署?

您可以使用 cargo test 命令来测试标量函数。您还可以在 Databend 中使用 CREATE FUNCTION 语句来部署标量函数。

例如,要测试 my_function 函数,您可以运行以下命令:

cargo test --test my_function

要部署 my_function 函数,您可以运行以下命令:

CREATE FUNCTION my_function(arg1 INT) -> INT AS 'my_function'

总结

在本文档中,我们介绍了 Databend 内置标量函数的开发方法。我们介绍了什么是标量函数、如何实现一个标量函数、如何使用 trait 来扩展内置函数的功能以及如何对标量函数进行测试和部署。希望本文档可以帮助您轻松、高效地开发出符合您需求的内置标量函数。