From 515c8039552ba8d169066a14b9163549f1567fb7 Mon Sep 17 00:00:00 2001 From: Alex Qyoun-ae <4062971+MazterQyou@users.noreply.github.com> Date: Fri, 6 Mar 2026 13:19:21 +0400 Subject: [PATCH] fix(cubesql): Do not panic when executing `MEASURE` function Signed-off-by: Alex Qyoun-ae <4062971+MazterQyou@users.noreply.github.com> --- .../cubesql/src/compile/engine/udf/common.rs | 9 ++++++++- rust/cubesql/cubesql/src/compile/mod.rs | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/rust/cubesql/cubesql/src/compile/engine/udf/common.rs b/rust/cubesql/cubesql/src/compile/engine/udf/common.rs index 94b69431b10a5..e770974abd80b 100644 --- a/rust/cubesql/cubesql/src/compile/engine/udf/common.rs +++ b/rust/cubesql/cubesql/src/compile/engine/udf/common.rs @@ -2179,7 +2179,14 @@ pub fn create_measure_udaf() -> AggregateUDF { } }); - let accumulator: AccumulatorFunctionImplementation = Arc::new(|_| todo!("Not implemented")); + let accumulator: AccumulatorFunctionImplementation = Arc::new(|_| { + Err(DataFusionError::Execution( + "This query is required to be pushed down due to use of MEASURE() function \ + but planner wasn't able to. Please check that you're using MEASURE() function \ + on a measure column, and that no filters prevent the pushdown" + .to_string(), + )) + }); let state_type = Arc::new(vec![DataType::Float64]); let state_type: StateTypeFunction = Arc::new(move |_, _| Ok(state_type.clone())); diff --git a/rust/cubesql/cubesql/src/compile/mod.rs b/rust/cubesql/cubesql/src/compile/mod.rs index 6a7613ab5a42a..2d3de410fcc6c 100644 --- a/rust/cubesql/cubesql/src/compile/mod.rs +++ b/rust/cubesql/cubesql/src/compile/mod.rs @@ -18574,4 +18574,20 @@ LIMIT {{ limit }}{% endif %}"#.to_string(), Ok(()) } + + #[tokio::test] + async fn test_measure_func_returns_error() -> Result<(), CubeError> { + let query_result = execute_query( + // Easiest way to test `MEASURE` execution is to call it + // on a system table + "SELECT MEASURE(relname) FROM pg_class".to_string(), + DatabaseProtocol::PostgreSQL, + ) + .await; + + let error = query_result.expect_err("Query should return an error"); + assert!(error.to_string().contains("required to be pushed down")); + + Ok(()) + } }