{"record":{"id":"f8cd890cfba2c142","repo":"cube-js/cube","slug":"unsupported-extension-node","errorCode":null,"errorMessage":"Unsupported extension node: {}","messagePattern":"Unsupported extension node: (.+?)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"rust/cubesql/cubesql/src/compile/rewrite/converter.rs","lineNumber":821,"sourceCode":"                self.graph\n                    .add(LogicalPlanLanguage::Limit([skip, fetch, input]))\n            }\n            LogicalPlan::Values(values) => {\n                let values = add_data_node!(self, values.values, ValuesValues);\n                self.graph.add(LogicalPlanLanguage::Values([values]))\n            }\n            LogicalPlan::CreateExternalTable { .. } => {\n                panic!(\"CreateExternalTable is not supported\");\n            }\n            LogicalPlan::Explain { .. } => {\n                panic!(\"Explain is not supported\");\n            }\n            LogicalPlan::Analyze { .. } => {\n                panic!(\"Analyze is not supported\");\n            }\n            // TODO\n            LogicalPlan::Extension(ext) => {\n                panic!(\"Unsupported extension node: {}\", ext.node.schema());\n            }\n            LogicalPlan::Distinct(distinct) => {\n                let input = self.add_logical_plan_replace_params(\n                    distinct.input.as_ref(),\n                    query_params,\n                    ctx,\n                )?;\n                self.graph.add(LogicalPlanLanguage::Distinct([input]))\n            }\n            // TODO: Support all\n            _ => unimplemented!(\"Unsupported node type: {:?}\", plan),\n        })\n    }\n    fn find_source_table_name(&self, plan: &LogicalPlan) -> Result<Option<String>, CubeError> {\n        Ok(match plan {\n            LogicalPlan::Projection(node) => self.find_source_table_name(node.input.as_ref())?,\n            LogicalPlan::Filter(node) => self.find_source_table_name(node.input.as_ref())?,\n            LogicalPlan::Window(node) => self.find_source_table_name(node.input.as_ref())?,","sourceCodeStart":803,"sourceCodeEnd":839,"githubUrl":"https://github.com/cube-js/cube/blob/7d981676b36392fec34088b9afab6bdcad40207c/rust/cubesql/cubesql/src/compile/rewrite/converter.rs#L803-L839","documentation":"During LogicalPlan-to-Cube-plan conversion, LogicalPlan::Extension nodes (DataFusion's escape hatch for custom, user-defined plan nodes) have no mapping into Cube's plan language and trigger an explicit panic. The message includes the extension node's schema for diagnostics.","triggerScenarios":"The plan being converted contains a custom/extension operator — e.g. a UDF node, a custom table function, or a DataFusion plugin node injected upstream of the converter.","commonSituations":"Using DataFusion extension points or third-party extensions with CubeSQL; a CubeSQL version where a newly added builtin operator is still represented as an Extension node; raw SQL that maps to an unsupported function.","solutions":["Identify the extension node name from the schema in the message and rewrite the query without it","Upgrade CubeSQL — many extension nodes are later given real conversions","Open/consult a Cube issue for the specific operator to add a LogicalPlanLanguage mapping"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"// catch_unwind around planner entry, since this is a panic not a Result\nlet result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| planner.plan(sql)));\nmatch result {\n    Ok(plan) => plan,\n    Err(p) => { log::error!(\"plan conversion failed: {:?}\", p); Err(planning_failed_response()) }\n}","preventionTips":["Avoid DataFusion extension operators / UDF plan nodes in queries sent to CubeSQL","Keep CubeSQL and Cube server versions aligned","Read the extension schema name in the panic to identify the offending operator quickly"],"tags":["rust","panic","unsupported-plan-node","datafusion-extension"],"backgroundTag":"unsupported-plan-node","analyzedSha":"7d981676b36392fec34088b9afab6bdcad40207c","analyzedAt":"2026-09-02T03:45:10.400Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}