Skip to content

Commit 8314ff5

Browse files
committed
Add helper to simplify tests & add canonical string
1 parent 5d0a5ea commit 8314ff5

File tree

2 files changed

+30
-31
lines changed

2 files changed

+30
-31
lines changed

src/test_utils.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,8 @@ impl TestedDialects {
151151
///
152152
/// 2. re-serializing the result of parsing `sql` produces the same
153153
/// `canonical` sql string
154+
///
155+
/// For multiple statements, use [`multiple_statements_parse_to`].
154156
pub fn one_statement_parses_to(&self, sql: &str, canonical: &str) -> Statement {
155157
let mut statements = self.parse_sql_statements(sql).expect(sql);
156158
assert_eq!(statements.len(), 1);
@@ -166,6 +168,20 @@ impl TestedDialects {
166168
only_statement
167169
}
168170

171+
/// The same as [`one_statement_parses_to`] but it works for a multiple statements
172+
pub fn multiple_statements_parse_to(&self, sql: &str, statement_count: usize, canonical: &str) -> Vec<Statement> {
173+
let statements = self.parse_sql_statements(sql).expect(sql);
174+
assert_eq!(statements.len(), statement_count);
175+
176+
if !canonical.is_empty() && sql != canonical {
177+
assert_eq!(self.parse_sql_statements(canonical).unwrap(), statements);
178+
} else {
179+
assert_eq!(sql, statements.iter().map(|s| s.to_string()).collect::<Vec<_>>().join("; "));
180+
}
181+
182+
statements
183+
}
184+
169185
/// Ensures that `sql` parses as an [`Expr`], and that
170186
/// re-serializing the parse result produces canonical
171187
pub fn expr_parses_to(&self, sql: &str, canonical: &str) -> Expr {

tests/sqlparser_mssql.rs

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2075,28 +2075,23 @@ fn parse_print() {
20752075
#[test]
20762076
fn parse_mssql_go_keyword() {
20772077
let single_go_keyword = "USE some_database;\nGO";
2078-
let stmts = ms().parse_sql_statements(single_go_keyword).unwrap();
2079-
assert_eq!(stmts.len(), 2);
2080-
assert_eq!(stmts[1], Statement::Go(GoStatement { count: None }),);
2078+
let stmts = ms().multiple_statements_parse_to(single_go_keyword, 2, "USE some_database\nGO");
2079+
assert_eq!(stmts[1], Statement::Go(GoStatement { count: None }));
20812080

20822081
let go_with_count = "SELECT 1;\nGO 5";
2083-
let stmts = ms().parse_sql_statements(go_with_count).unwrap();
2084-
assert_eq!(stmts.len(), 2);
2082+
let stmts = ms().multiple_statements_parse_to(go_with_count, 2, "SELECT 1\nGO 5");
20852083
assert_eq!(stmts[1], Statement::Go(GoStatement { count: Some(5) }));
20862084

20872085
let go_statement_delimiter = "SELECT 1\nGO";
2088-
let stmts = ms().parse_sql_statements(go_statement_delimiter).unwrap();
2089-
assert_eq!(stmts.len(), 2);
2086+
let stmts = ms().multiple_statements_parse_to(go_statement_delimiter, 2, "SELECT 1; \nGO");
20902087
assert_eq!(stmts[1], Statement::Go(GoStatement { count: None }));
20912088

20922089
let bare_go = "GO";
2093-
let stmts = ms().parse_sql_statements(bare_go).unwrap();
2094-
assert_eq!(stmts.len(), 1);
2095-
assert_eq!(stmts[0], Statement::Go(GoStatement { count: None }));
2090+
let stmt = ms().one_statement_parses_to(bare_go, "GO");
2091+
assert_eq!(stmt, Statement::Go(GoStatement { count: None }));
20962092

20972093
let go_then_statements = "/* whitespace */ GO\nRAISERROR('This is a test', 16, 1);";
2098-
let stmts = ms().parse_sql_statements(go_then_statements).unwrap();
2099-
assert_eq!(stmts.len(), 2);
2094+
let stmts = ms().multiple_statements_parse_to(go_then_statements, 2, "GO\nRAISERROR('This is a test', 16, 1)");
21002095
assert_eq!(stmts[0], Statement::Go(GoStatement { count: None }));
21012096
assert_eq!(
21022097
stmts[1],
@@ -2112,41 +2107,29 @@ fn parse_mssql_go_keyword() {
21122107
);
21132108

21142109
let multiple_gos = "SELECT 1;\nGO 5\nSELECT 2;\n GO";
2115-
let stmts = ms().parse_sql_statements(multiple_gos).unwrap();
2116-
assert_eq!(stmts.len(), 4);
2110+
let stmts = ms().multiple_statements_parse_to(multiple_gos, 4, "SELECT 1\nGO 5\nSELECT 2\nGO");
21172111
assert_eq!(stmts[1], Statement::Go(GoStatement { count: Some(5) }));
21182112
assert_eq!(stmts[3], Statement::Go(GoStatement { count: None }));
21192113

21202114
let single_line_comment_preceding_go = "USE some_database; -- okay\nGO";
2121-
let stmts = ms()
2122-
.parse_sql_statements(single_line_comment_preceding_go)
2123-
.unwrap();
2124-
assert_eq!(stmts.len(), 2);
2115+
let stmts = ms().multiple_statements_parse_to(single_line_comment_preceding_go, 2, "USE some_database\nGO");
21252116
assert_eq!(stmts[1], Statement::Go(GoStatement { count: None }));
21262117

21272118
let multi_line_comment_preceding_go = "USE some_database; /* okay */\nGO";
2128-
let stmts = ms()
2129-
.parse_sql_statements(multi_line_comment_preceding_go)
2130-
.unwrap();
2131-
assert_eq!(stmts.len(), 2);
2119+
let stmts = ms().multiple_statements_parse_to(multi_line_comment_preceding_go, 2, "USE some_database\nGO");
21322120
assert_eq!(stmts[1], Statement::Go(GoStatement { count: None }));
21332121

21342122
let single_line_comment_following_go = "USE some_database;\nGO -- okay";
2135-
let stmts = ms().parse_sql_statements(single_line_comment_following_go).unwrap();
2136-
assert_eq!(stmts.len(), 2);
2123+
let stmts = ms().multiple_statements_parse_to(single_line_comment_following_go, 2, "USE some_database\nGO");
21372124
assert_eq!(stmts[1], Statement::Go(GoStatement { count: None }));
21382125

21392126
let multi_line_comment_following = "USE some_database;\nGO/* okay */42";
2140-
let stmts = ms()
2141-
.parse_sql_statements(multi_line_comment_following)
2142-
.unwrap();
2143-
assert_eq!(stmts.len(), 2);
2127+
let stmts = ms().multiple_statements_parse_to(multi_line_comment_following, 2, "USE some_database\nGO 42");
21442128
assert_eq!(stmts[1], Statement::Go(GoStatement { count: Some(42) }));
21452129

21462130
let actually_column_alias = "SELECT NULL GO";
2147-
let stmts = ms().parse_sql_statements(actually_column_alias).unwrap();
2148-
assert_eq!(stmts.len(), 1);
2149-
match &stmts[0] {
2131+
let stmt = ms().one_statement_parses_to(actually_column_alias, "SELECT NULL AS GO");
2132+
match &stmt {
21502133
Statement::Query(query) => {
21512134
let select = query.body.as_select().unwrap();
21522135
assert_eq!(

0 commit comments

Comments
 (0)