diff --git a/rust/lancedb/src/materialized_view.rs b/rust/lancedb/src/materialized_view.rs index 83c8454af..977c98ea4 100644 --- a/rust/lancedb/src/materialized_view.rs +++ b/rust/lancedb/src/materialized_view.rs @@ -285,11 +285,18 @@ fn ensure_immutable(expr: &datafusion_expr::Expr, error: impl Fn(String) -> Erro use datafusion_common::tree_node::{TreeNode, TreeNodeRecursion}; use datafusion_expr::Volatility; + // Labeled immutable but actually build-dependent: version() returns the + // DataFusion build string, so its value changes across upgrades. + const BUILD_DEPENDENT: &[&str] = &["version"]; + let mut offending: Option = None; expr.apply(|node| { if let datafusion_expr::Expr::ScalarFunction(function) = node { - if function.func.signature().volatility != Volatility::Immutable { - offending = Some(function.func.name().to_string()); + let name = function.func.name(); + if function.func.signature().volatility != Volatility::Immutable + || BUILD_DEPENDENT.contains(&name) + { + offending = Some(name.to_string()); return Ok(TreeNodeRecursion::Stop); } } @@ -1014,7 +1021,7 @@ mod tests { #[tokio::test] async fn test_volatile_and_unstable_expressions_are_rejected() { let conn = people_db().await; - for expression in ["random()", "now()"] { + for expression in ["random()", "now()", "version()"] { let err = conn .create_materialized_view("bad", "people") .select([("x", expression)])