@@ -32,7 +32,7 @@ use sqlparser::ast::DeclareAssignment::MsSqlAssignment;
3232use sqlparser:: ast:: Value :: SingleQuotedString ;
3333use sqlparser:: ast:: * ;
3434use sqlparser:: dialect:: { GenericDialect , MsSqlDialect } ;
35- use sqlparser:: parser:: { Parser , ParserError } ;
35+ use sqlparser:: parser:: { Parser , ParserError , ParserOptions } ;
3636
3737#[ test]
3838fn 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+
23272339fn ms_and_generic ( ) -> TestedDialects {
23282340 TestedDialects :: new ( vec ! [ Box :: new( MsSqlDialect { } ) , Box :: new( GenericDialect { } ) ] )
23292341}
@@ -2480,3 +2492,18 @@ fn parse_mssql_grant() {
24802492fn 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+ }
0 commit comments