Skip to content

Commit 7b55dd5

Browse files
committed
Rename and move tests
1 parent 02e7563 commit 7b55dd5

File tree

5 files changed

+128
-141
lines changed

5 files changed

+128
-141
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
@@ -567,7 +567,7 @@ impl Dialect for SnowflakeDialect {
567567
true
568568
}
569569

570-
fn supports_semantic_view(&self) -> bool {
570+
fn supports_semantic_view_table_factor(&self) -> bool {
571571
true
572572
}
573573
}

src/parser/mod.rs

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4251,9 +4251,8 @@ impl<'a> Parser<'a> {
42514251
/// Peeks to see if the current token is the `expected` keyword followed by specified tokens
42524252
/// without consuming them.
42534253
///
4254-
/// Note that if the length of `tokens` is too long, this function will not be efficient as it
4255-
/// does a loop on the tokens with `peek_nth_token` each time.
4256-
pub fn peek_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
4254+
/// See [Self::parse_keyword_with_tokens] for details.
4255+
pub(crate) fn peek_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
42574256
self.keyword_with_tokens(expected, tokens, false)
42584257
}
42594258

@@ -13528,7 +13527,7 @@ impl<'a> Parser<'a> {
1352813527
} else if self.parse_keyword_with_tokens(Keyword::XMLTABLE, &[Token::LParen]) {
1352913528
self.prev_token();
1353013529
self.parse_xml_table_factor()
13531-
} else if self.dialect.supports_semantic_view()
13530+
} else if self.dialect.supports_semantic_view_table_factor()
1353213531
&& self.peek_keyword_with_tokens(Keyword::SEMANTIC_VIEW, &[Token::LParen])
1353313532
{
1353413533
self.parse_semantic_view_table_factor()
@@ -18067,18 +18066,4 @@ mod tests {
1806718066
assert!(Parser::parse_sql(&GenericDialect, &sql).is_err());
1806818067
}
1806918068
}
18070-
18071-
#[test]
18072-
fn test_parse_semantic_view() {
18073-
let sql = r#"SEMANTIC_VIEW(model DIMENSIONS a.b METRICS c.d WHERE x > 0) AS sm"#;
18074-
let mut parser = Parser::new(&GenericDialect {})
18075-
.try_with_sql(sql)
18076-
.expect("failed to create parser");
18077-
18078-
let ast = parser
18079-
.parse_semantic_view_table_factor()
18080-
.expect("should parse SEMANTIC_VIEW");
18081-
18082-
assert!(matches!(ast, TableFactor::SemanticView { .. }));
18083-
}
1808418069
}

tests/sqlparser_common.rs

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16841,3 +16841,126 @@ fn parse_copy_options() {
1684116841
_ => unreachable!(),
1684216842
}
1684316843
}
16844+
16845+
#[test]
16846+
fn test_parse_semantic_view_table_factor() {
16847+
let dialects = all_dialects_where(|d| d.supports_semantic_view_table_factor());
16848+
16849+
let valid_sqls = [
16850+
("SELECT * FROM SEMANTIC_VIEW(model)", None),
16851+
(
16852+
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1, dim2)",
16853+
None,
16854+
),
16855+
("SELECT * FROM SEMANTIC_VIEW(a.b METRICS c.d, c.e)", None),
16856+
(
16857+
"SELECT * FROM SEMANTIC_VIEW(model FACTS fact1, fact2)",
16858+
None,
16859+
),
16860+
(
16861+
"SELECT * FROM SEMANTIC_VIEW(model FACTS DATE_PART('year', col))",
16862+
None,
16863+
),
16864+
(
16865+
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 METRICS met1)",
16866+
None,
16867+
),
16868+
(
16869+
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 WHERE x > 0)",
16870+
None,
16871+
),
16872+
(
16873+
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1) AS sv",
16874+
None,
16875+
),
16876+
(
16877+
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS DATE_PART('year', col))",
16878+
None,
16879+
),
16880+
(
16881+
"SELECT * FROM SEMANTIC_VIEW(model METRICS orders.col, orders.col2)",
16882+
None,
16883+
),
16884+
// We can parse in any order but will always produce a result in a fixed order.
16885+
(
16886+
"SELECT * FROM SEMANTIC_VIEW(model WHERE x > 0 DIMENSIONS dim1)",
16887+
Some("SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 WHERE x > 0)"),
16888+
),
16889+
(
16890+
"SELECT * FROM SEMANTIC_VIEW(model METRICS met1 DIMENSIONS dim1)",
16891+
Some("SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 METRICS met1)"),
16892+
),
16893+
(
16894+
"SELECT * FROM SEMANTIC_VIEW(model FACTS fact1 DIMENSIONS dim1)",
16895+
Some("SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 FACTS fact1)"),
16896+
),
16897+
];
16898+
16899+
for (input_sql, expected_sql) in valid_sqls {
16900+
if let Some(expected) = expected_sql {
16901+
// Test that non-canonical order gets normalized
16902+
let parsed = dialects.parse_sql_statements(input_sql).unwrap();
16903+
let formatted = parsed[0].to_string();
16904+
assert_eq!(formatted, expected);
16905+
} else {
16906+
dialects.verified_stmt(input_sql);
16907+
}
16908+
}
16909+
16910+
let invalid_sqls = [
16911+
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 INVALID inv1)",
16912+
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 DIMENSIONS dim2)",
16913+
"SELECT * FROM SEMANTIC_VIEW(model METRICS SUM(met1.avg))",
16914+
];
16915+
16916+
for sql in invalid_sqls {
16917+
let result = dialects.parse_sql_statements(sql);
16918+
assert!(result.is_err(), "Expected error for invalid SQL: {}", sql);
16919+
}
16920+
16921+
let ast_sql = r#"SELECT * FROM SEMANTIC_VIEW(
16922+
my_model
16923+
DIMENSIONS DATE_PART('year', date_col), region_name
16924+
METRICS orders.revenue, orders.count
16925+
WHERE active = true
16926+
) AS model_alias"#;
16927+
16928+
let stmt = dialects.parse_sql_statements(ast_sql).unwrap();
16929+
match &stmt[0] {
16930+
Statement::Query(q) => {
16931+
if let SetExpr::Select(select) = q.body.as_ref() {
16932+
if let Some(TableWithJoins { relation, .. }) = select.from.first() {
16933+
match relation {
16934+
TableFactor::SemanticView {
16935+
name,
16936+
dimensions,
16937+
metrics,
16938+
facts,
16939+
where_clause,
16940+
alias,
16941+
} => {
16942+
assert_eq!(name.to_string(), "my_model");
16943+
assert_eq!(dimensions.len(), 2);
16944+
assert_eq!(dimensions[0].to_string(), "DATE_PART('year', date_col)");
16945+
assert_eq!(dimensions[1].to_string(), "region_name");
16946+
assert_eq!(metrics.len(), 2);
16947+
assert_eq!(metrics[0].to_string(), "orders.revenue");
16948+
assert_eq!(metrics[1].to_string(), "orders.count");
16949+
assert!(facts.is_empty());
16950+
assert!(where_clause.is_some());
16951+
assert_eq!(where_clause.as_ref().unwrap().to_string(), "active = true");
16952+
assert!(alias.is_some());
16953+
assert_eq!(alias.as_ref().unwrap().name.value, "model_alias");
16954+
}
16955+
_ => panic!("Expected SemanticView table factor"),
16956+
}
16957+
} else {
16958+
panic!("Expected table in FROM clause");
16959+
}
16960+
} else {
16961+
panic!("Expected SELECT statement");
16962+
}
16963+
}
16964+
_ => panic!("Expected Query statement"),
16965+
}
16966+
}

tests/sqlparser_snowflake.rs

Lines changed: 0 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -4613,124 +4613,3 @@ fn test_drop_constraints() {
46134613
snowflake().verified_stmt("ALTER TABLE tbl DROP FOREIGN KEY k1 RESTRICT");
46144614
snowflake().verified_stmt("ALTER TABLE tbl DROP CONSTRAINT c1 CASCADE");
46154615
}
4616-
4617-
#[test]
4618-
fn test_semantic_view() {
4619-
let valid_sqls = [
4620-
("SELECT * FROM SEMANTIC_VIEW(model)", None),
4621-
(
4622-
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1, dim2)",
4623-
None,
4624-
),
4625-
("SELECT * FROM SEMANTIC_VIEW(a.b METRICS c.d, c.e)", None),
4626-
(
4627-
"SELECT * FROM SEMANTIC_VIEW(model FACTS fact1, fact2)",
4628-
None,
4629-
),
4630-
(
4631-
"SELECT * FROM SEMANTIC_VIEW(model FACTS DATE_PART('year', col))",
4632-
None,
4633-
),
4634-
(
4635-
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 METRICS met1)",
4636-
None,
4637-
),
4638-
(
4639-
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 WHERE x > 0)",
4640-
None,
4641-
),
4642-
(
4643-
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1) AS sv",
4644-
None,
4645-
),
4646-
(
4647-
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS DATE_PART('year', col))",
4648-
None,
4649-
),
4650-
(
4651-
"SELECT * FROM SEMANTIC_VIEW(model METRICS orders.col, orders.col2)",
4652-
None,
4653-
),
4654-
// We can parse in any order but will always produce a result in a fixed order.
4655-
(
4656-
"SELECT * FROM SEMANTIC_VIEW(model WHERE x > 0 DIMENSIONS dim1)",
4657-
Some("SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 WHERE x > 0)"),
4658-
),
4659-
(
4660-
"SELECT * FROM SEMANTIC_VIEW(model METRICS met1 DIMENSIONS dim1)",
4661-
Some("SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 METRICS met1)"),
4662-
),
4663-
(
4664-
"SELECT * FROM SEMANTIC_VIEW(model FACTS fact1 DIMENSIONS dim1)",
4665-
Some("SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 FACTS fact1)"),
4666-
),
4667-
];
4668-
4669-
for (input_sql, expected_sql) in valid_sqls {
4670-
if let Some(expected) = expected_sql {
4671-
// Test that non-canonical order gets normalized
4672-
let parsed = snowflake().parse_sql_statements(input_sql).unwrap();
4673-
let formatted = parsed[0].to_string();
4674-
assert_eq!(formatted, expected);
4675-
} else {
4676-
snowflake().verified_stmt(input_sql);
4677-
}
4678-
}
4679-
4680-
let invalid_sqls = [
4681-
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 INVALID inv1)",
4682-
"SELECT * FROM SEMANTIC_VIEW(model DIMENSIONS dim1 DIMENSIONS dim2)",
4683-
"SELECT * FROM SEMANTIC_VIEW(model METRICS SUM(met1.avg))",
4684-
];
4685-
4686-
for sql in invalid_sqls {
4687-
let result = snowflake().parse_sql_statements(sql);
4688-
assert!(result.is_err(), "Expected error for invalid SQL: {}", sql);
4689-
}
4690-
4691-
let ast_sql = r#"SELECT * FROM SEMANTIC_VIEW(
4692-
my_model
4693-
DIMENSIONS DATE_PART('year', date_col), region_name
4694-
METRICS orders.revenue, orders.count
4695-
WHERE active = true
4696-
) AS model_alias"#;
4697-
4698-
let stmt = snowflake().parse_sql_statements(ast_sql).unwrap();
4699-
match &stmt[0] {
4700-
Statement::Query(q) => {
4701-
if let SetExpr::Select(select) = q.body.as_ref() {
4702-
if let Some(TableWithJoins { relation, .. }) = select.from.first() {
4703-
match relation {
4704-
TableFactor::SemanticView {
4705-
name,
4706-
dimensions,
4707-
metrics,
4708-
facts,
4709-
where_clause,
4710-
alias,
4711-
} => {
4712-
assert_eq!(name.to_string(), "my_model");
4713-
assert_eq!(dimensions.len(), 2);
4714-
assert_eq!(dimensions[0].to_string(), "DATE_PART('year', date_col)");
4715-
assert_eq!(dimensions[1].to_string(), "region_name");
4716-
assert_eq!(metrics.len(), 2);
4717-
assert_eq!(metrics[0].to_string(), "orders.revenue");
4718-
assert_eq!(metrics[1].to_string(), "orders.count");
4719-
assert!(facts.is_empty());
4720-
assert!(where_clause.is_some());
4721-
assert_eq!(where_clause.as_ref().unwrap().to_string(), "active = true");
4722-
assert!(alias.is_some());
4723-
assert_eq!(alias.as_ref().unwrap().name.value, "model_alias");
4724-
}
4725-
_ => panic!("Expected SemanticView table factor"),
4726-
}
4727-
} else {
4728-
panic!("Expected table in FROM clause");
4729-
}
4730-
} else {
4731-
panic!("Expected SELECT statement");
4732-
}
4733-
}
4734-
_ => panic!("Expected Query statement"),
4735-
}
4736-
}

0 commit comments

Comments
 (0)