{"record":{"id":"b89dd4e25a2380b2","repo":"risingwavelabs/risingwave","slug":"legacy-arrow-udf-is-no-longer-supported-please-up","errorCode":null,"errorMessage":"legacy arrow-udf is no longer supported. please update arrow-udf to 0.3+","messagePattern":"legacy arrow-udf is no longer supported\\. please update arrow-udf to 0\\.3\\+","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/expr/impl/src/udf/wasm.rs","lineNumber":55,"sourceCode":"#[linkme::distributed_slice(UDF_IMPLS)]\nstatic RUST: UdfImplDescriptor = UdfImplDescriptor {\n    match_fn: |language, _runtime, _link| language == \"rust\",\n    create_fn: create_rust,\n    build_fn: build,\n};\n\nfn create_wasm(opts: CreateOptions<'_>) -> Result<CreateFunctionOutput> {\n    let wasm_binary: Cow<'_, [u8]> = if let Some(link) = opts.using_link {\n        read_file_from_link(link)?.into()\n    } else if let Some(bytes) = opts.using_base64_decoded {\n        bytes.into()\n    } else {\n        bail!(\"USING must be specified\")\n    };\n\n    let runtime = create_wasm_runtime(&wasm_binary)?;\n    if runtime.abi_version().0 <= 2 {\n        bail!(\"legacy arrow-udf is no longer supported. please update arrow-udf to 0.3+\");\n    }\n\n    let name_in_runtime = opts.name.to_owned();\n    let convert = UdfArrowConvert {\n        legacy: runtime_is_legacy(&runtime),\n    };\n    let arg_types: Vec<_> = opts\n        .arg_types\n        .iter()\n        .map(|ty| convert.to_arrow_field(\"\", ty))\n        .try_collect()?;\n    let return_type = convert.to_arrow_field(\"\", opts.return_type)?;\n    match opts.kind {\n        UdfKind::Scalar => {\n            // test if the function exists in the wasm binary\n            _ = runtime.find_function(&name_in_runtime, arg_types, return_type)?;\n        }\n        UdfKind::Table => {","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/expr/impl/src/udf/wasm.rs#L37-L73","documentation":"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.","triggerScenarios":"`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.","commonSituations":"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.","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"],"exampleFix":"# before (UDF Cargo.toml)\narrow-udf = \"0.2\"\n# after\narrow-udf = \"0.3\"","handlingStrategy":"validation","validationCode":"// check arrow-udf version in UDF Cargo.toml is >= 0.3 before building/deploying wasm","typeGuard":null,"tryCatchPattern":"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; }","preventionTips":["Pin arrow-udf to 0.3+ in UDF projects","Regenerate .wasm artifacts on dependency upgrades","Check ABI version in UDF build CI"],"tags":["udf","wasm","version-compatibility"],"backgroundTag":"deprecated-api-usage","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}