Rust SDK for writing ClickHouse WASM UDFs.
Create a new library crate:
cargo new --lib my_udfConfigure Cargo.toml:
[package]
name = "my_udf"
version = "0.1.0"
edition = "2024"
[lib]
crate-type = ["cdylib"]
[dependencies]
clickhouse-wasm-udf = "0.2.0"Set the default build target in .cargo/config.toml:
build]
target = "wasm32-unknown-unknown"
Use the #[clickhouse_udf] attribute macro. Arguments and return values can be
any type that implements serde::Serialize + serde::Deserialize — numbers,
String, Vec, HashMap, etc.
use clickhouse_wasm_udf::clickhouse_udf;
#[clickhouse_udf]
fn greet(name: String) -> Result<String, String> {
if name.is_empty() {
return Err("Name cannot be empty".into());
}
Ok(format!("Hello, {name}!"))
}use clickhouse_wasm_udf::{ch_log_trace, ch_fatal, clickhouse_udf};
#[clickhouse_udf]
fn safe_div(a: f64, b: f64) -> f64 {
if b == 0.0 {
ch_fatal!("division by zero");
}
ch_log_trace!("computing {a} / {b}");
a / b
}ch_log_trace! writes to the ClickHouse server log. ch_fatal! aborts the call and
reports an error.
cargo build --release
# output: target/wasm32-unknown-unknown/release/my_udf.wasm