Skip to content

Commit da2ce86

Browse files
committed
Use all_dialects_where to test backslash escape for every dialect
1 parent 78c4580 commit da2ce86

File tree

2 files changed

+39
-11
lines changed

2 files changed

+39
-11
lines changed

src/test_utils.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use core::fmt::Debug;
3333

3434
use crate::dialect::*;
3535
use crate::parser::{Parser, ParserError};
36-
use crate::tokenizer::Tokenizer;
36+
use crate::tokenizer::{Tokenizer, Token};
3737
use crate::{ast::*, parser::ParserOptions};
3838

3939
#[cfg(test)]
@@ -237,6 +237,18 @@ impl TestedDialects {
237237
pub fn verified_expr(&self, sql: &str) -> Expr {
238238
self.expr_parses_to(sql, sql)
239239
}
240+
241+
/// Check that the tokenizer returns the expected tokens for the given SQL.
242+
pub fn tokenizes_to(&self, sql: &str, expected: Vec<Token>) {
243+
self.dialects.iter().for_each(|dialect| {
244+
let mut tokenizer = Tokenizer::new(&**dialect, sql);
245+
if let Some(options) = &self.options {
246+
tokenizer = tokenizer.with_unescape(options.unescape);
247+
}
248+
let tokens = tokenizer.tokenize().unwrap();
249+
assert_eq!(expected, tokens);
250+
});
251+
}
240252
}
241253

242254
/// Returns all available dialects.

src/tokenizer.rs

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2159,6 +2159,7 @@ mod tests {
21592159
BigQueryDialect, ClickHouseDialect, HiveDialect, MsSqlDialect, MySqlDialect, SQLiteDialect,
21602160
};
21612161
use core::fmt::Debug;
2162+
use crate::test_utils::all_dialects_where;
21622163

21632164
#[test]
21642165
fn tokenizer_error_impl() {
@@ -3548,15 +3549,30 @@ mod tests {
35483549
}
35493550

35503551
#[test]
3551-
fn test_national_strings() {
3552-
let dialect = PostgreSqlDialect {};
3553-
let sql = "select n'''''\\'";
3554-
let tokens = Tokenizer::new(&dialect, sql).tokenize().unwrap();
3555-
let expected = vec![
3556-
Token::make_keyword("select"),
3557-
Token::Whitespace(Whitespace::Space),
3558-
Token::NationalStringLiteral("''\\".to_string()),
3559-
];
3560-
compare(expected, tokens);
3552+
fn test_national_strings_backslash_escape_not_supported() {
3553+
all_dialects_where(
3554+
|dialect| !dialect.supports_string_literal_backslash_escape(),
3555+
).tokenizes_to(
3556+
"select n'''''\\'",
3557+
vec![
3558+
Token::make_keyword("select"),
3559+
Token::Whitespace(Whitespace::Space),
3560+
Token::NationalStringLiteral("''\\".to_string()),
3561+
],
3562+
);
3563+
}
3564+
3565+
#[test]
3566+
fn test_national_strings_backslash_escape_supported() {
3567+
all_dialects_where(
3568+
|dialect| dialect.supports_string_literal_backslash_escape(),
3569+
).tokenizes_to(
3570+
"select n'''''\\''",
3571+
vec![
3572+
Token::make_keyword("select"),
3573+
Token::Whitespace(Whitespace::Space),
3574+
Token::NationalStringLiteral("'''".to_string()),
3575+
],
3576+
);
35613577
}
35623578
}

0 commit comments

Comments
 (0)