Skip to content

Commit f7253a0

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

File tree

2 files changed

+62
-31
lines changed

2 files changed

+62
-31
lines changed

src/test_utils.rs

+28
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

+34-31
Original file line numberDiff line numberDiff line change
@@ -2075,28 +2075,27 @@ 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(
2095+
go_then_statements,
2096+
2,
2097+
"GO\nRAISERROR('This is a test', 16, 1)",
2098+
);
21002099
assert_eq!(stmts[0], Statement::Go(GoStatement { count: None }));
21012100
assert_eq!(
21022101
stmts[1],
@@ -2112,41 +2111,45 @@ fn parse_mssql_go_keyword() {
21122111
);
21132112

21142113
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);
2114+
let stmts = ms().multiple_statements_parse_to(multiple_gos, 4, "SELECT 1\nGO 5\nSELECT 2\nGO");
21172115
assert_eq!(stmts[1], Statement::Go(GoStatement { count: Some(5) }));
21182116
assert_eq!(stmts[3], Statement::Go(GoStatement { count: None }));
21192117

21202118
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);
2119+
let stmts = ms().multiple_statements_parse_to(
2120+
single_line_comment_preceding_go,
2121+
2,
2122+
"USE some_database\nGO",
2123+
);
21252124
assert_eq!(stmts[1], Statement::Go(GoStatement { count: None }));
21262125

21272126
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);
2127+
let stmts = ms().multiple_statements_parse_to(
2128+
multi_line_comment_preceding_go,
2129+
2,
2130+
"USE some_database\nGO",
2131+
);
21322132
assert_eq!(stmts[1], Statement::Go(GoStatement { count: None }));
21332133

21342134
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);
2135+
let stmts = ms().multiple_statements_parse_to(
2136+
single_line_comment_following_go,
2137+
2,
2138+
"USE some_database\nGO",
2139+
);
21372140
assert_eq!(stmts[1], Statement::Go(GoStatement { count: None }));
21382141

21392142
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);
2143+
let stmts = ms().multiple_statements_parse_to(
2144+
multi_line_comment_following,
2145+
2,
2146+
"USE some_database\nGO 42",
2147+
);
21442148
assert_eq!(stmts[1], Statement::Go(GoStatement { count: Some(42) }));
21452149

21462150
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] {
2151+
let stmt = ms().one_statement_parses_to(actually_column_alias, "SELECT NULL AS GO");
2152+
match &stmt {
21502153
Statement::Query(query) => {
21512154
let select = query.body.as_select().unwrap();
21522155
assert_eq!(

0 commit comments

Comments
 (0)