{"record":{"id":"396dffa7f1863d7e","repo":"risingwavelabs/risingwave","slug":"iceberg-metadata-relations-are-not-supported-in-st","errorCode":null,"errorMessage":"Iceberg metadata relations are not supported in streaming queries","messagePattern":"Iceberg metadata relations are not supported in streaming queries","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/frontend/src/optimizer/plan_node/logical_iceberg_metadata_scan.rs","lineNumber":91,"sourceCode":"        predicate: Condition,\n        _ctx: &mut PredicatePushdownContext,\n    ) -> PlanRef {\n        LogicalFilter::create(self.clone().into(), predicate)\n    }\n}\n\nimpl ToBatch for LogicalIcebergMetadataScan {\n    fn to_batch(&self) -> Result<crate::optimizer::plan_node::BatchPlanRef> {\n        Ok(BatchIcebergMetadataScan::new(self.core.clone()).into())\n    }\n}\n\nimpl ToStream for LogicalIcebergMetadataScan {\n    fn to_stream(\n        &self,\n        _ctx: &mut ToStreamContext,\n    ) -> Result<crate::optimizer::plan_node::StreamPlanRef> {\n        bail!(\"Iceberg metadata relations are not supported in streaming queries\")\n    }\n\n    fn logical_rewrite_for_stream(\n        &self,\n        _ctx: &mut RewriteStreamContext,\n    ) -> Result<(PlanRef, ColIndexMapping)> {\n        bail!(\"Iceberg metadata relations are not supported in streaming queries\")\n    }\n}\n","sourceCodeStart":73,"sourceCodeEnd":101,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/frontend/src/optimizer/plan_node/logical_iceberg_metadata_scan.rs#L73-L101","documentation":"LogicalIcebergMetadataScan represents Iceberg metadata relations (e.g. metadata tables/files). The streaming optimizer calls to_stream when converting logical plans to streaming plans; this node deliberately rejects streaming with a bail! because Iceberg metadata relations are designed to be read only via batch queries. The error is an intended guard, not a crash.","triggerScenarios":"Running a streaming query (CREATE MATERIALIZED VIEW, CREATE STREAM, shared source plan) whose plan references an Iceberg metadata relation (e.g. querying an Iceberg metadata table inside a streaming context), causing to_stream to be invoked on LogicalIcebergMetadataScan.","commonSituations":"Developers building materialized views on top of Iceberg metadata tables (like iceberg.$files / metadata scans), assuming continuous querying is supported; using SQL that mixes Iceberg metadata relations into streaming pipelines after a version where the guard was added.","solutions":["Run the query as a batch query (plain SELECT) instead of a streaming/materialized query — Iceberg metadata relations are batch-only.","Materialize the needed metadata snapshot in a batch job/table and build streaming logic on that materialized data instead.","Check RisingWave docs/release notes for Iceberg metadata relation streaming support; upgrade if a newer version adds it."],"exampleFix":"// before: streaming query over Iceberg metadata\nCREATE MATERIALIZED VIEW mv FROM iceberg_meta_scan(...);\n// after: batch query\nSELECT * FROM iceberg_meta_scan(...);","handlingStrategy":"validation","validationCode":"// Detect Iceberg metadata relations before issuing streaming DDL\nlet is_iceberg_metadata = sql.to_uppercase().contains(\".$METADATA\") || relation_name.contains(\"iceberg_meta\");\nif is_iceberg_metadata {\n    return Err(\"Iceberg metadata relations are batch-only\".into());\n}","typeGuard":"fn is_batch_only_relation(kind: &RelationKind) -> bool {\n    matches!(kind, RelationKind::IcebergMetadataScan)\n}","tryCatchPattern":"match client.run_sql(stmt) {\n    Err(e) if format!(\"{e}\").contains(\"not supported in streaming\") => {\n        eprintln!(\"Run this as a batch query instead: {}\", to_batch_sql(stmt));\n    }\n    r => r?,\n}","preventionTips":["Query Iceberg metadata tables only with plain batch SELECTs.","Do not build materialized views over Iceberg metadata relations.","Check release notes for when (if ever) streaming over Iceberg metadata becomes supported.","Validate SQL targets before submitting streaming DDL from automation/tools."],"tags":["rust","query-optimizer","iceberg","streaming","unsupported"],"backgroundTag":"unsupported-operation","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}