{"record":{"id":"1d2203a3ab34b61c","repo":"pola-rs/polars","slug":"named-expr-registry-not-set","errorCode":null,"errorMessage":"NAMED EXPR REGISTRY NOT SET","messagePattern":"NAMED EXPR REGISTRY NOT SET","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/polars-plan/src/dsl/expr/anonymous/agg.rs","lineNumber":37,"sourceCode":"\nimpl OpaqueStreamingAgg {\n    pub fn materialize(&self) -> PolarsResult<SpecialEq<Arc<dyn AnonymousAgg>>> {\n        match self {\n            Self::Deserialized(t) => Ok(t.clone()),\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.clone()),\n                    None => Ok(SpecialEq::new(\n                        NAMED_SERDE_REGISTRY_EXPR\n                            .read()\n                            .unwrap()\n                            .as_ref()\n                            .expect(\"NAMED EXPR REGISTRY NOT SET\")\n                            .get_agg(name, payload.as_ref().unwrap())?\n                            .expect(\"NAMED AGG NOT FOUND\"),\n                    )),\n                }\n            }),\n            Self::Bytes(_b) => {\n                feature_gated!(\"serde\", {\n                    use crate::dsl::anonymous::serde_expr;\n                    serde_expr::deserialize_anon_agg(_b.as_ref()).map(SpecialEq::new)\n                })\n            },\n        }\n    }\n}\n\nimpl Hash for OpaqueStreamingAgg {\n    fn hash<H: Hasher>(&self, state: &mut H) {\n        core::mem::discriminant(self).hash(state);","sourceCodeStart":19,"sourceCodeEnd":55,"githubUrl":"https://github.com/pola-rs/polars/blob/df599052daf96e7a9cc30a3b0c6bd25d6947e3c0/crates/polars-plan/src/dsl/expr/anonymous/agg.rs#L19-L55","documentation":"Named anonymous aggregations serialize only a name (plus payload); materialization looks up the implementation in a global registry (NAMED_SERDE_REGISTRY_EXPR) that the embedding must install via set_named_serde_registry. When a serialized plan containing such an agg is deserialized in a process where the registry was never set, the Option<Arc<dyn ExprRegistry>> is None and this expect panics.","triggerScenarios":"Deserializing (serde) a LazyFrame/expression that contains a named anonymous aggregation in a process that did not call polars_plan::dsl::named_serde::set_named_serde_registry first — e.g. sending a serialized plan to a worker node or a fresh subprocess.","commonSituations":"Distributed/multi-process setups where plans are shipped between processes; custom embeddings that deserialize expressions without bootstrapping the registry; deserializing in a minimal test harness.","solutions":["Call set_named_serde_registry(Arc::new(MyRegistry)) at process startup, before any deserialization","Ensure every node that will deserialize plans registers an ExprRegistry covering the same names","If the value variant is cached (value: Some(v)), deserialize is registry-free — prefer sending cached values when possible","Keep producer and consumer on the same polars version so registry names match"],"exampleFix":"// before: deserialize in a fresh process -> panic 'NAMED EXPR REGISTRY NOT SET'\nlet plan = serde_json::from_str::<LazyFrame>(serialized)?;\n\n// after: install the registry at startup\nuse polars_plan::dsl::named_serde::{set_named_serde_registry, ExprRegistry};\nset_named_serde_registry(std::sync::Arc::new(MyAggRegistry) as _);\nlet plan = serde_json::from_str::<LazyFrame>(serialized)?;","handlingStrategy":"validation","validationCode":"// run at process startup, before any deserialization\nuse polars_plan::dsl::named_serde::{set_named_serde_registry, ExprRegistry};\nset_named_serde_registry(std::sync::Arc::new(MyRegistry) as _);","typeGuard":null,"tryCatchPattern":"let lf = std::panic::catch_unwind(|| bincode::deserialize::<LazyFrame>(bytes))\n    .map_err(|_| anyhow::anyhow!(\"plan references unregistered named aggregations\"))?;","preventionTips":["Bootstrap the registry in every process that deserializes plans","Add a startup self-test that deserializes a sample plan","Keep producer/consumer polars versions aligned"],"tags":["serde","serialization","udf","registry","distributed","panic","rust"],"backgroundTag":null,"analyzedSha":"df599052daf96e7a9cc30a3b0c6bd25d6947e3c0","analyzedAt":"2026-08-16T12:10:03.978Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}