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

  1. Upgrade the UDF project to arrow-udf 0.3+ and rebuild the wasm binary
  2. Replace the stale .wasm artifact referenced by USING LINK
  3. 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

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


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)