From ee707c72a7a99cf84ea107f201ed7d58c4a75ed3 Mon Sep 17 00:00:00 2001 From: Simon Sawert Date: Thu, 28 Aug 2025 12:18:03 +0200 Subject: [PATCH] Support wildcard metrics for `SEMANTIC_VIEW` (#2016) --- src/ast/query.rs | 2 +- src/parser/mod.rs | 7 +++++-- tests/sqlparser_common.rs | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/ast/query.rs b/src/ast/query.rs index 967af85c..ffc9ce66 100644 --- a/src/ast/query.rs +++ b/src/ast/query.rs @@ -1429,7 +1429,7 @@ pub enum TableFactor { /// List of dimensions or expression referring to dimensions (e.g. DATE_PART('year', col)) dimensions: Vec, /// List of metrics (references to objects like orders.value, value, orders.*) - metrics: Vec, + metrics: Vec, /// List of facts or expressions referring to facts or dimensions. facts: Vec, /// WHERE clause for filtering diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 761bc312..a563e174 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -13958,7 +13958,7 @@ impl<'a> Parser<'a> { "METRICS clause can only be specified once".to_string(), )); } - metrics = self.parse_comma_separated(|parser| parser.parse_object_name(true))?; + metrics = self.parse_comma_separated(Parser::parse_wildcard_expr)?; } else if self.parse_keyword(Keyword::FACTS) { if !facts.is_empty() { return Err(ParserError::ParserError( @@ -13975,7 +13975,10 @@ impl<'a> Parser<'a> { where_clause = Some(self.parse_expr()?); } else { return parser_err!( - "Expected one of DIMENSIONS, METRICS, FACTS or WHERE", + format!( + "Expected one of DIMENSIONS, METRICS, FACTS or WHERE, got {}", + self.peek_token().token + ), self.peek_token().span.start )?; } diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 2e2d9bfd..516df5be 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -16951,6 +16951,7 @@ fn test_parse_semantic_view_table_factor() { "SELECT * FROM SEMANTIC_VIEW(model METRICS orders.col, orders.col2)", None, ), + ("SELECT * FROM SEMANTIC_VIEW(model METRICS orders.*)", None), // We can parse in any order but will always produce a result in a fixed order. ( "SELECT * FROM SEMANTIC_VIEW(model WHERE x > 0 DIMENSIONS dim1)", @@ -16980,7 +16981,6 @@ fn test_parse_semantic_view_table_factor() { let invalid_sqls = [ "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 INVALID inv1)", "SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 DIMENSIONS dim2)", - "SELECT * FROM SEMANTIC_VIEW(model METRICS SUM(met1.avg))", ]; for sql in invalid_sqls {