{"record":{"id":"8edd73929f8e46d6","repo":"pola-rs/polars","slug":"named-function-not-found","errorCode":null,"errorMessage":"NAMED FUNCTION NOT FOUND","messagePattern":"NAMED FUNCTION NOT FOUND","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/polars-plan/src/dsl/expr/anonymous/expr.rs","lineNumber":184,"sourceCode":"    pub fn materialize(self) -> PolarsResult<SpecialEq<Arc<dyn AnonymousColumnsUdf>>> {\n        match self {\n            Self::Deserialized(t) => Ok(t),\n            Self::Named {\n                name,\n                payload,\n                value,\n            } => feature_gated!(\"serde\", {\n                use super::named_serde::NAMED_SERDE_REGISTRY_EXPR;\n                match value {\n                    Some(v) => Ok(v),\n                    None => Ok(SpecialEq(\n                        NAMED_SERDE_REGISTRY_EXPR\n                            .read()\n                            .unwrap()\n                            .as_ref()\n                            .expect(\"NAMED EXPR REGISTRY NOT SET\")\n                            .get_function(&name, payload.unwrap().as_ref())\n                            .expect(\"NAMED FUNCTION NOT FOUND\"),\n                    )),\n                }\n            }),\n            Self::Bytes(_b) => {\n                feature_gated!(\"serde\";\"python\", {\n                    serde_expr::deserialize_column_udf(_b.as_ref()).map(SpecialEq::new)\n                })\n            },\n        }\n    }\n}\n","sourceCodeStart":166,"sourceCodeEnd":196,"githubUrl":"https://github.com/pola-rs/polars/blob/df599052daf96e7a9cc30a3b0c6bd25d6947e3c0/crates/polars-plan/src/dsl/expr/anonymous/expr.rs#L166-L196","documentation":"The registry is installed but get_function(&name, payload) returned None for the requested name: the serialized expression references a named column UDF that this process's registry does not know. The expect then panics with 'NAMED FUNCTION NOT FOUND'.","triggerScenarios":"Consumer registry lacks the name the producer used — renamed/removed UDFs between versions, plugin not loaded, typo in the registered name, or a malicious/corrupted payload naming an arbitrary function.","commonSituations":"Version skew during rolling deploys, partial plugin installs, deserializing plans on machines that never loaded the extension providing the function.","solutions":["Register the named function in the consumer's ExprRegistry (exact name and payload format)","Verify producer and consumer agree on UDF names — treat UDF names as a compatibility contract","Load the owning plugin/extension before deserializing","If unknown names are expected, handle them before deserialization (e.g. inspect the payload) since the lookup currently panics rather than erroring"],"exampleFix":"// before: 'my_window_udf' unknown on consumer -> panic 'NAMED FUNCTION NOT FOUND'\n\n// after: consumer registry maps every producer name\nimpl ExprRegistry for Reg {\n    fn get_function(&self, name: &str, payload: &[u8]) -> Option<Arc<dyn AnonymousColumnsUdf>> {\n        match name {\n            \"my_window_udf\" => Some(Arc::new(MyWindowUdf::decode(payload))),\n            _ => None,\n        }\n    }\n}\nset_named_serde_registry(Arc::new(Reg) as _);","handlingStrategy":"validation","validationCode":"for name in producer_function_names() {\n    assert!(registry.get_function(name, &[]).is_some(), \"function {name} not registered\");\n}","typeGuard":null,"tryCatchPattern":"std::panic::catch_unwind(|| deserialize(bytes))\n    .map_err(|_| format!(\"plan references a UDF unknown to this build\"))","preventionTips":["Register the full UDF name set on every node","Guard UDF renames with compat aliases","Verify plugin load order before deserialization"],"tags":["serde","udf","registry","version-skew","plugin","panic","rust"],"backgroundTag":null,"analyzedSha":"df599052daf96e7a9cc30a3b0c6bd25d6947e3c0","analyzedAt":"2026-08-16T12:10:03.978Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}