Skip to content

Commit 0eb0c6a

Browse files
committed
Rename and move tests
1 parent 81f406f commit 0eb0c6a

File tree

5 files changed

+129
-142
lines changed

5 files changed

+129
-142
lines changed

src/dialect/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1193,7 +1193,7 @@ pub trait Dialect: Debug + Any {
11931193
/// WHERE customer.active = true
11941194
/// )
11951195
/// ```
1196-
fn supports_semantic_view(&self) -> bool {
1196+
fn supports_semantic_view_table_factor(&self) -> bool {
11971197
false
11981198
}
11991199
}

src/dialect/snowflake.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ impl Dialect for SnowflakeDialect {
565565
true
566566
}
567567

568-
fn supports_semantic_view(&self) -> bool {
568+
fn supports_semantic_view_table_factor(&self) -> bool {
569569
true
570570
}
571571
}

src/parser/mod.rs

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4247,9 +4247,8 @@ impl<'a> Parser<'a> {
42474247
/// Peeks to see if the current token is the `expected` keyword followed by specified tokens
42484248
/// without consuming them.
42494249
///
4250-
/// Note that if the length of `tokens` is too long, this function will not be efficient as it
4251-
/// does a loop on the tokens with `peek_nth_token` each time.
4252-
pub fn peek_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
4250+
/// See [Self::parse_keyword_with_tokens] for details.
4251+
pub(crate) fn peek_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
42534252
self.keyword_with_tokens(expected, tokens, false)
42544253
}
42554254

@@ -13455,7 +13454,7 @@ impl<'a> Parser<'a> {
1345513454
} else if self.parse_keyword_with_tokens(Keyword::XMLTABLE, &[Token::LParen]) {
1345613455
self.prev_token();
1345713456
self.parse_xml_table_factor()
13458-
} else if self.dialect.supports_semantic_view()
13457+
} else if self.dialect.supports_semantic_view_table_factor()
1345913458
&& self.peek_keyword_with_tokens(Keyword::SEMANTIC_VIEW, &[Token::LParen])
1346013459
{
1346113460
self.parse_semantic_view_table_factor()
@@ -17189,7 +17188,7 @@ impl Word {
1718917188

1719017189
#[cfg(test)]
1719117190
mod tests {
17192-
use crate::test_utils::{all_dialects, TestedDialects};
17191+
use crate::test_utils::{all_dialects, all_dialects_where, TestedDialects};
1719317192

1719417193
use super::*;
1719517194

@@ -17954,18 +17953,4 @@ mod tests {
1795417953
assert!(Parser::parse_sql(&GenericDialect, &sql).is_err());
1795517954
}
1795617955
}
17957-
17958-
#[test]
17959-
fn test_parse_semantic_view() {
17960-
let sql = r#"SEMANTIC_VIEW(model DIMENSIONS a.b METRICS c.d WHERE x > 0) AS sm"#;
17961-
let mut parser = Parser::new(&GenericDialect {})
17962-
.try_with_sql(sql)
17963-
.expect("failed to create parser");
17964-
17965-
let ast = parser
17966-
.parse_semantic_view_table_factor()
17967-
.expect("should parse SEMANTIC_VIEW");
17968-
17969-
assert!(matches!(ast, TableFactor::SemanticView { .. }));
17970-
}
1797117956
}

tests/sqlparser_common.rs

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16729,3 +16729,126 @@ fn parse_create_table_like() {
1672916729
_ => unreachable!(),
1673016730
}
1673116731
}
16732+
16733+
#[test]
16734+
fn test_parse_semantic_view_table_factor() {
16735+
let dialects = all_dialects_where(|d| d.supports_semantic_view_table_factor());
16736+
16737+
let valid_sqls = [
16738+
("SELECT * FROM SEMANTIC_VIEW(model)", None),
16739+
(
16740+
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1, dim2)",
16741+
None,
16742+
),
16743+
("SELECT * FROM SEMANTIC_VIEW(a.b METRICS c.d, c.e)", None),
16744+
(
16745+
"SELECT * FROM SEMANTIC_VIEW(model FACTS fact1, fact2)",
16746+
None,
16747+
),
16748+
(
16749+
"SELECT * FROM SEMANTIC_VIEW(model FACTS DATE_PART('year', col))",
16750+
None,
16751+
),
16752+
(
16753+
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 METRICS met1)",
16754+
None,
16755+
),
16756+
(
16757+
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 WHERE x > 0)",
16758+
None,
16759+
),
16760+
(
16761+
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1) AS sv",
16762+
None,
16763+
),
16764+
(
16765+
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS DATE_PART('year', col))",
16766+
None,
16767+
),
16768+
(
16769+
"SELECT * FROM SEMANTIC_VIEW(model METRICS orders.col, orders.col2)",
16770+
None,
16771+
),
16772+
// We can parse in any order but will always produce a result in a fixed order.
16773+
(
16774+
"SELECT * FROM SEMANTIC_VIEW(model WHERE x > 0 DIMENSIONS dim1)",
16775+
Some("SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 WHERE x > 0)"),
16776+
),
16777+
(
16778+
"SELECT * FROM SEMANTIC_VIEW(model METRICS met1 DIMENSIONS dim1)",
16779+
Some("SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 METRICS met1)"),
16780+
),
16781+
(
16782+
"SELECT * FROM SEMANTIC_VIEW(model FACTS fact1 DIMENSIONS dim1)",
16783+
Some("SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 FACTS fact1)"),
16784+
),
16785+
];
16786+
16787+
for (input_sql, expected_sql) in valid_sqls {
16788+
if let Some(expected) = expected_sql {
16789+
// Test that non-canonical order gets normalized
16790+
let parsed = dialects.parse_sql_statements(input_sql).unwrap();
16791+
let formatted = parsed[0].to_string();
16792+
assert_eq!(formatted, expected);
16793+
} else {
16794+
dialects.verified_stmt(input_sql);
16795+
}
16796+
}
16797+
16798+
let invalid_sqls = [
16799+
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 INVALID inv1)",
16800+
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 DIMENSIONS dim2)",
16801+
"SELECT * FROM SEMANTIC_VIEW(model METRICS SUM(met1.avg))",
16802+
];
16803+
16804+
for sql in invalid_sqls {
16805+
let result = dialects.parse_sql_statements(sql);
16806+
assert!(result.is_err(), "Expected error for invalid SQL: {}", sql);
16807+
}
16808+
16809+
let ast_sql = r#"SELECT * FROM SEMANTIC_VIEW(
16810+
my_model
16811+
DIMENSIONS DATE_PART('year', date_col), region_name
16812+
METRICS orders.revenue, orders.count
16813+
WHERE active = true
16814+
) AS model_alias"#;
16815+
16816+
let stmt = dialects.parse_sql_statements(ast_sql).unwrap();
16817+
match &stmt[0] {
16818+
Statement::Query(q) => {
16819+
if let SetExpr::Select(select) = q.body.as_ref() {
16820+
if let Some(TableWithJoins { relation, .. }) = select.from.first() {
16821+
match relation {
16822+
TableFactor::SemanticView {
16823+
name,
16824+
dimensions,
16825+
metrics,
16826+
facts,
16827+
where_clause,
16828+
alias,
16829+
} => {
16830+
assert_eq!(name.to_string(), "my_model");
16831+
assert_eq!(dimensions.len(), 2);
16832+
assert_eq!(dimensions[0].to_string(), "DATE_PART('year', date_col)");
16833+
assert_eq!(dimensions[1].to_string(), "region_name");
16834+
assert_eq!(metrics.len(), 2);
16835+
assert_eq!(metrics[0].to_string(), "orders.revenue");
16836+
assert_eq!(metrics[1].to_string(), "orders.count");
16837+
assert!(facts.is_empty());
16838+
assert!(where_clause.is_some());
16839+
assert_eq!(where_clause.as_ref().unwrap().to_string(), "active = true");
16840+
assert!(alias.is_some());
16841+
assert_eq!(alias.as_ref().unwrap().name.value, "model_alias");
16842+
}
16843+
_ => panic!("Expected SemanticView table factor"),
16844+
}
16845+
} else {
16846+
panic!("Expected table in FROM clause");
16847+
}
16848+
} else {
16849+
panic!("Expected SELECT statement");
16850+
}
16851+
}
16852+
_ => panic!("Expected Query statement"),
16853+
}
16854+
}

tests/sqlparser_snowflake.rs

Lines changed: 0 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -4581,124 +4581,3 @@ fn test_drop_constraints() {
45814581
snowflake().verified_stmt("ALTER TABLE tbl DROP FOREIGN KEY k1 RESTRICT");
45824582
snowflake().verified_stmt("ALTER TABLE tbl DROP CONSTRAINT c1 CASCADE");
45834583
}
4584-
4585-
#[test]
4586-
fn test_semantic_view() {
4587-
let valid_sqls = [
4588-
("SELECT * FROM SEMANTIC_VIEW(model)", None),
4589-
(
4590-
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1, dim2)",
4591-
None,
4592-
),
4593-
("SELECT * FROM SEMANTIC_VIEW(a.b METRICS c.d, c.e)", None),
4594-
(
4595-
"SELECT * FROM SEMANTIC_VIEW(model FACTS fact1, fact2)",
4596-
None,
4597-
),
4598-
(
4599-
"SELECT * FROM SEMANTIC_VIEW(model FACTS DATE_PART('year', col))",
4600-
None,
4601-
),
4602-
(
4603-
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 METRICS met1)",
4604-
None,
4605-
),
4606-
(
4607-
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 WHERE x > 0)",
4608-
None,
4609-
),
4610-
(
4611-
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1) AS sv",
4612-
None,
4613-
),
4614-
(
4615-
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS DATE_PART('year', col))",
4616-
None,
4617-
),
4618-
(
4619-
"SELECT * FROM SEMANTIC_VIEW(model METRICS orders.col, orders.col2)",
4620-
None,
4621-
),
4622-
// We can parse in any order but will always produce a result in a fixed order.
4623-
(
4624-
"SELECT * FROM SEMANTIC_VIEW(model WHERE x > 0 DIMENSIONS dim1)",
4625-
Some("SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 WHERE x > 0)"),
4626-
),
4627-
(
4628-
"SELECT * FROM SEMANTIC_VIEW(model METRICS met1 DIMENSIONS dim1)",
4629-
Some("SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 METRICS met1)"),
4630-
),
4631-
(
4632-
"SELECT * FROM SEMANTIC_VIEW(model FACTS fact1 DIMENSIONS dim1)",
4633-
Some("SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 FACTS fact1)"),
4634-
),
4635-
];
4636-
4637-
for (input_sql, expected_sql) in valid_sqls {
4638-
if let Some(expected) = expected_sql {
4639-
// Test that non-canonical order gets normalized
4640-
let parsed = snowflake().parse_sql_statements(input_sql).unwrap();
4641-
let formatted = parsed[0].to_string();
4642-
assert_eq!(formatted, expected);
4643-
} else {
4644-
snowflake().verified_stmt(input_sql);
4645-
}
4646-
}
4647-
4648-
let invalid_sqls = [
4649-
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 INVALID inv1)",
4650-
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 DIMENSIONS dim2)",
4651-
"SELECT * FROM SEMANTIC_VIEW(model METRICS SUM(met1.avg))",
4652-
];
4653-
4654-
for sql in invalid_sqls {
4655-
let result = snowflake().parse_sql_statements(sql);
4656-
assert!(result.is_err(), "Expected error for invalid SQL: {}", sql);
4657-
}
4658-
4659-
let ast_sql = r#"SELECT * FROM SEMANTIC_VIEW(
4660-
my_model
4661-
DIMENSIONS DATE_PART('year', date_col), region_name
4662-
METRICS orders.revenue, orders.count
4663-
WHERE active = true
4664-
) AS model_alias"#;
4665-
4666-
let stmt = snowflake().parse_sql_statements(ast_sql).unwrap();
4667-
match &stmt[0] {
4668-
Statement::Query(q) => {
4669-
if let SetExpr::Select(select) = q.body.as_ref() {
4670-
if let Some(TableWithJoins { relation, .. }) = select.from.first() {
4671-
match relation {
4672-
TableFactor::SemanticView {
4673-
name,
4674-
dimensions,
4675-
metrics,
4676-
facts,
4677-
where_clause,
4678-
alias,
4679-
} => {
4680-
assert_eq!(name.to_string(), "my_model");
4681-
assert_eq!(dimensions.len(), 2);
4682-
assert_eq!(dimensions[0].to_string(), "DATE_PART('year', date_col)");
4683-
assert_eq!(dimensions[1].to_string(), "region_name");
4684-
assert_eq!(metrics.len(), 2);
4685-
assert_eq!(metrics[0].to_string(), "orders.revenue");
4686-
assert_eq!(metrics[1].to_string(), "orders.count");
4687-
assert!(facts.is_empty());
4688-
assert!(where_clause.is_some());
4689-
assert_eq!(where_clause.as_ref().unwrap().to_string(), "active = true");
4690-
assert!(alias.is_some());
4691-
assert_eq!(alias.as_ref().unwrap().name.value, "model_alias");
4692-
}
4693-
_ => panic!("Expected SemanticView table factor"),
4694-
}
4695-
} else {
4696-
panic!("Expected table in FROM clause");
4697-
}
4698-
} else {
4699-
panic!("Expected SELECT statement");
4700-
}
4701-
}
4702-
_ => panic!("Expected Query statement"),
4703-
}
4704-
}

0 commit comments

Comments
 (0)