Skip to content

Commit 9c85b04

Browse files
committed
Support for T-SQL
1 parent fd4934e commit 9c85b04

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed

src/parser/mod.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,16 +219,22 @@ impl From<bool> for MatchedTrailingBracket {
219219
#[derive(Debug, Clone, PartialEq, Eq)]
220220
pub struct ParserOptions {
221221
pub trailing_commas: bool,
222+
222223
/// Controls how literal values are unescaped. See
223224
/// [`Tokenizer::with_unescape`] for more details.
224225
pub unescape: bool,
226+
227+
/// Controls if the parser expects a semi-colon token
228+
/// between statements.
229+
pub require_semicolon_stmt_delimiter: bool,
225230
}
226231

227232
impl Default for ParserOptions {
228233
fn default() -> Self {
229234
Self {
230235
trailing_commas: false,
231236
unescape: true,
237+
require_semicolon_stmt_delimiter: true,
232238
}
233239
}
234240
}
@@ -467,6 +473,10 @@ impl<'a> Parser<'a> {
467473
expecting_statement_delimiter = false;
468474
}
469475

476+
if !self.options.require_semicolon_stmt_delimiter {
477+
expecting_statement_delimiter = false;
478+
}
479+
470480
match self.peek_token().token {
471481
Token::EOF => break,
472482

tests/sqlparser_mssql.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use sqlparser::ast::DeclareAssignment::MsSqlAssignment;
3232
use sqlparser::ast::Value::SingleQuotedString;
3333
use sqlparser::ast::*;
3434
use sqlparser::dialect::{GenericDialect, MsSqlDialect};
35-
use sqlparser::parser::{Parser, ParserError};
35+
use sqlparser::parser::{Parser, ParserError, ParserOptions};
3636

3737
#[test]
3838
fn parse_mssql_identifiers() {
@@ -2324,6 +2324,18 @@ fn ms() -> TestedDialects {
23242324
TestedDialects::new(vec![Box::new(MsSqlDialect {})])
23252325
}
23262326

2327+
// MS SQL dialect with support for optional semi-colon statement delimiters
2328+
fn tsql() -> TestedDialects {
2329+
TestedDialects::new_with_options(
2330+
vec![Box::new(MsSqlDialect {})],
2331+
ParserOptions {
2332+
trailing_commas: false,
2333+
unescape: true,
2334+
require_semicolon_stmt_delimiter: false,
2335+
},
2336+
)
2337+
}
2338+
23272339
fn ms_and_generic() -> TestedDialects {
23282340
TestedDialects::new(vec![Box::new(MsSqlDialect {}), Box::new(GenericDialect {})])
23292341
}
@@ -2480,3 +2492,18 @@ fn parse_mssql_grant() {
24802492
fn parse_mssql_deny() {
24812493
ms().verified_stmt("DENY SELECT ON my_table TO public, db_admin");
24822494
}
2495+
2496+
#[test]
2497+
fn test_tsql_no_semicolon_delimiter() {
2498+
let sql = r#"
2499+
DECLARE @X AS NVARCHAR(MAX)='x'
2500+
DECLARE @Y AS NVARCHAR(MAX)='y'
2501+
"#;
2502+
2503+
let stmts = tsql().parse_sql_statements(sql).unwrap();
2504+
assert_eq!(stmts.len(), 2);
2505+
assert_eq!(
2506+
stmts.iter().all(|s| matches!(s, Statement::Declare { .. })),
2507+
true
2508+
);
2509+
}

tests/sqlparser_mysql.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1441,6 +1441,7 @@ fn parse_escaped_quote_identifiers_with_no_escape() {
14411441
ParserOptions {
14421442
trailing_commas: false,
14431443
unescape: false,
1444+
require_semicolon_stmt_delimiter: true,
14441445
}
14451446
)
14461447
.verified_stmt(sql),

0 commit comments

Comments
 (0)