risingwavelabs/risingwave · error
legacy arrow-udf is no longer supported. please update…
Error message
legacy arrow-udf is no longer supported. please update arrow-udf to 0.3+
What it means
The wasm binary compiled against legacy arrow-udf (ABI version <= 2) is rejected; RisingWave only supports arrow-udf 0.3+ export ABI. This prevents silently running an incompatible function at query time.
Solutions
- Upgrade the UDF project to arrow-udf 0.3+ and rebuild the wasm binary
- Replace the stale .wasm artifact referenced by USING LINK
- Check the arrow-udf version in the UDF Cargo.toml and bump it
Example fix
# before (UDF Cargo.toml) arrow-udf = "0.2" # after arrow-udf = "0.3"
Defensive patterns
Strategy: validation
Validate before calling
// check arrow-udf version in UDF Cargo.toml is >= 0.3 before building/deploying wasm
Try / catch
try { await rw.query(createFunctionSql) } catch (e) { if (String(e).includes('legacy arrow-udf')) { /* rebuild wasm with arrow-udf 0.3+ and redeploy */ } else throw e; } Prevention
- Pin arrow-udf to 0.3+ in UDF projects
- Regenerate .wasm artifacts on dependency upgrades
- Check ABI version in UDF build CI
When it happens
Trigger: `create_wasm` loads a wasm binary (via USING LINK or base64) whose runtime `abi_version().0 <= 2` — i.e. built with arrow-udf < 0.3.
Common situations: Old prebuilt .wasm artifacts from an earlier arrow-udf version; dependencies locked to an old arrow-udf crate version in the UDF build; stale CI artifacts.
Understand the failure class
Background: "is deprecated and will be removed" — deprecation warnings for old API names, keywords, and options, and how to migrate before the removal release — this error's family across 29 libraries.
Related errors
- unsupported data type
- USING must be specified
- {0}
- aggregate function is not supported
- argument type mismatch, expect
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/b89dd4e25a2380b2.
Report an issue: GitHub.
Appendix: source
Thrown at src/expr/impl/src/udf/wasm.rs:55
#[linkme::distributed_slice(UDF_IMPLS)]
static RUST: UdfImplDescriptor = UdfImplDescriptor {
match_fn: |language, _runtime, _link| language == "rust",
create_fn: create_rust,
build_fn: build,
};
fn create_wasm(opts: CreateOptions<'_>) -> Result<CreateFunctionOutput> {
let wasm_binary: Cow<'_, [u8]> = if let Some(link) = opts.using_link {
read_file_from_link(link)?.into()
} else if let Some(bytes) = opts.using_base64_decoded {
bytes.into()
} else {
bail!("USING must be specified")
};
let runtime = create_wasm_runtime(&wasm_binary)?;
if runtime.abi_version().0 <= 2 {
bail!("legacy arrow-udf is no longer supported. please update arrow-udf to 0.3+");
}
let name_in_runtime = opts.name.to_owned();
let convert = UdfArrowConvert {
legacy: runtime_is_legacy(&runtime),
};
let arg_types: Vec<_> = opts
.arg_types
.iter()
.map(|ty| convert.to_arrow_field("", ty))
.try_collect()?;
let return_type = convert.to_arrow_field("", opts.return_type)?;
match opts.kind {
UdfKind::Scalar => {
// test if the function exists in the wasm binary
_ = runtime.find_function(&name_in_runtime, arg_types, return_type)?;
}
UdfKind::Table => {View on GitHub (pinned to 6469eb736d)