Skip to content

Commit cfecd33

Browse files
committed
Add helper to simplify tests & add canonical string
1 parent 94abfb7 commit cfecd33

File tree

2 files changed

+62
-31
lines changed

2 files changed

+62
-31
lines changed

src/test_utils.rs

Lines changed: 28 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,32 @@ 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(
173+
&self,
174+
sql: &str,
175+
statement_count: usize,
176+
canonical: &str,
177+
) -> Vec<Statement> {
178+
let statements = self.parse_sql_statements(sql).expect(sql);
179+
assert_eq!(statements.len(), statement_count);
180+
181+
if !canonical.is_empty() && sql != canonical {
182+
assert_eq!(self.parse_sql_statements(canonical).unwrap(), statements);
183+
} else {
184+
assert_eq!(
185+
sql,
186+
statements
187+
.iter()
188+
.map(|s| s.to_string())
189+
.collect::<Vec<_>>()
190+
.join("; ")
191+
);
192+
}
193+
194+
statements
195+
}
196+
169197
/// Ensures that `sql` parses as an [`Expr`], and that
170198
/// re-serializing the parse result produces canonical
171199
pub fn expr_parses_to(&self, sql: &str, canonical: &str) -> Expr {

tests/sqlparser_mssql.rs

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2161,28 +2161,27 @@ fn parse_print() {
21612161
#[test]
21622162
fn parse_mssql_go_keyword() {
21632163
let single_go_keyword = "USE some_database;\nGO";
2164-
let stmts = ms().parse_sql_statements(single_go_keyword).unwrap();
2165-
assert_eq!(stmts.len(), 2);
2166-
assert_eq!(stmts[1], Statement::Go(GoStatement { count: None }),);
2164+
let stmts = ms().multiple_statements_parse_to(single_go_keyword, 2, "USE some_database\nGO");
2165+
assert_eq!(stmts[1], Statement::Go(GoStatement { count: None }));
21672166

21682167
let go_with_count = "SELECT 1;\nGO 5";
2169-
let stmts = ms().parse_sql_statements(go_with_count).unwrap();
2170-
assert_eq!(stmts.len(), 2);
2168+
let stmts = ms().multiple_statements_parse_to(go_with_count, 2, "SELECT 1\nGO 5");
21712169
assert_eq!(stmts[1], Statement::Go(GoStatement { count: Some(5) }));
21722170

21732171
let go_statement_delimiter = "SELECT 1\nGO";
2174-
let stmts = ms().parse_sql_statements(go_statement_delimiter).unwrap();
2175-
assert_eq!(stmts.len(), 2);
2172+
let stmts = ms().multiple_statements_parse_to(go_statement_delimiter, 2, "SELECT 1; \nGO");
21762173
assert_eq!(stmts[1], Statement::Go(GoStatement { count: None }));
21772174

21782175
let bare_go = "GO";
2179-
let stmts = ms().parse_sql_statements(bare_go).unwrap();
2180-
assert_eq!(stmts.len(), 1);
2181-
assert_eq!(stmts[0], Statement::Go(GoStatement { count: None }));
2176+
let stmt = ms().one_statement_parses_to(bare_go, "GO");
2177+
assert_eq!(stmt, Statement::Go(GoStatement { count: None }));
21822178

21832179
let go_then_statements = "/* whitespace */ GO\nRAISERROR('This is a test', 16, 1);";
2184-
let stmts = ms().parse_sql_statements(go_then_statements).unwrap();
2185-
assert_eq!(stmts.len(), 2);
2180+
let stmts = ms().multiple_statements_parse_to(
2181+
go_then_statements,
2182+
2,
2183+
"GO\nRAISERROR('This is a test', 16, 1)",
2184+
);
21862185
assert_eq!(stmts[0], Statement::Go(GoStatement { count: None }));
21872186
assert_eq!(
21882187
stmts[1],
@@ -2198,41 +2197,45 @@ fn parse_mssql_go_keyword() {
21982197
);
21992198

22002199
let multiple_gos = "SELECT 1;\nGO 5\nSELECT 2;\n GO";
2201-
let stmts = ms().parse_sql_statements(multiple_gos).unwrap();
2202-
assert_eq!(stmts.len(), 4);
2200+
let stmts = ms().multiple_statements_parse_to(multiple_gos, 4, "SELECT 1\nGO 5\nSELECT 2\nGO");
22032201
assert_eq!(stmts[1], Statement::Go(GoStatement { count: Some(5) }));
22042202
assert_eq!(stmts[3], Statement::Go(GoStatement { count: None }));
22052203

22062204
let single_line_comment_preceding_go = "USE some_database; -- okay\nGO";
2207-
let stmts = ms()
2208-
.parse_sql_statements(single_line_comment_preceding_go)
2209-
.unwrap();
2210-
assert_eq!(stmts.len(), 2);
2205+
let stmts = ms().multiple_statements_parse_to(
2206+
single_line_comment_preceding_go,
2207+
2,
2208+
"USE some_database\nGO",
2209+
);
22112210
assert_eq!(stmts[1], Statement::Go(GoStatement { count: None }));
22122211

22132212
let multi_line_comment_preceding_go = "USE some_database; /* okay */\nGO";
2214-
let stmts = ms()
2215-
.parse_sql_statements(multi_line_comment_preceding_go)
2216-
.unwrap();
2217-
assert_eq!(stmts.len(), 2);
2213+
let stmts = ms().multiple_statements_parse_to(
2214+
multi_line_comment_preceding_go,
2215+
2,
2216+
"USE some_database\nGO",
2217+
);
22182218
assert_eq!(stmts[1], Statement::Go(GoStatement { count: None }));
22192219

22202220
let single_line_comment_following_go = "USE some_database;\nGO -- okay";
2221-
let stmts = ms().parse_sql_statements(single_line_comment_following_go).unwrap();
2222-
assert_eq!(stmts.len(), 2);
2221+
let stmts = ms().multiple_statements_parse_to(
2222+
single_line_comment_following_go,
2223+
2,
2224+
"USE some_database\nGO",
2225+
);
22232226
assert_eq!(stmts[1], Statement::Go(GoStatement { count: None }));
22242227

22252228
let multi_line_comment_following = "USE some_database;\nGO/* okay */42";
2226-
let stmts = ms()
2227-
.parse_sql_statements(multi_line_comment_following)
2228-
.unwrap();
2229-
assert_eq!(stmts.len(), 2);
2229+
let stmts = ms().multiple_statements_parse_to(
2230+
multi_line_comment_following,
2231+
2,
2232+
"USE some_database\nGO 42",
2233+
);
22302234
assert_eq!(stmts[1], Statement::Go(GoStatement { count: Some(42) }));
22312235

22322236
let actually_column_alias = "SELECT NULL GO";
2233-
let stmts = ms().parse_sql_statements(actually_column_alias).unwrap();
2234-
assert_eq!(stmts.len(), 1);
2235-
match &stmts[0] {
2237+
let stmt = ms().one_statement_parses_to(actually_column_alias, "SELECT NULL AS GO");
2238+
match &stmt {
22362239
Statement::Query(query) => {
22372240
let select = query.body.as_select().unwrap();
22382241
assert_eq!(

0 commit comments

Comments
 (0)