Skip to content

Commit c19bfae

Browse files
committed
Fix the parsing error in MSSQL for multiple statements that include DECLARE statements.
before parse sql in mssql ``` declare @A int; set @A = 2; select @A * 4; ``` raise error ``` Error during parsing: ParserError("Expected: end of statement, found: set at Line: 2, Column: 1") ```
1 parent ee90373 commit c19bfae

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

src/parser/mod.rs

+10
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,16 @@ impl<'a> Parser<'a> {
434434
let statement = self.parse_statement()?;
435435
stmts.push(statement);
436436
expecting_statement_delimiter = true;
437+
if self.peek_token().token != Token::SemiColon {
438+
// If the next valid character is not a semicolon,
439+
// check whether the previous valid character is a semicolon.
440+
// If it is, revert to the previous valid character (i.e., the semicolon);
441+
// otherwise, do nothing.
442+
self.prev_token();
443+
if self.peek_token().token != Token::SemiColon {
444+
self.next_token();
445+
}
446+
};
437447
}
438448
Ok(stmts)
439449
}

tests/sqlparser_mssql.rs

+66
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,72 @@ fn parse_mssql_declare() {
626626
}],
627627
ast
628628
);
629+
630+
let sql = "DECLARE @bar INT;SET @bar = 2;SELECT @bar * 4";
631+
let ast = Parser::parse_sql(&MsSqlDialect {}, sql).unwrap();
632+
assert_eq!(
633+
vec![
634+
Statement::Declare {
635+
stmts: vec![Declare {
636+
names: vec![Ident {
637+
value: "@bar".to_string(),
638+
quote_style: None
639+
}],
640+
data_type: Some(Int(None)),
641+
assignment: None,
642+
declare_type: None,
643+
binary: None,
644+
sensitive: None,
645+
scroll: None,
646+
hold: None,
647+
for_query: None
648+
}]
649+
},
650+
Statement::SetVariable {
651+
local: false,
652+
hivevar: false,
653+
variables: OneOrManyWithParens::One(ObjectName(vec![Ident::new("@bar")])),
654+
value: vec![Expr::Value(Value::Number("2".parse().unwrap(), false))],
655+
},
656+
Statement::Query(Box::new(Query {
657+
with: None,
658+
limit: None,
659+
limit_by: vec![],
660+
offset: None,
661+
fetch: None,
662+
locks: vec![],
663+
for_clause: None,
664+
order_by: None,
665+
settings: None,
666+
format_clause: None,
667+
body: Box::new(SetExpr::Select(Box::new(Select {
668+
distinct: None,
669+
top: None,
670+
projection: vec![SelectItem::UnnamedExpr(Expr::BinaryOp {
671+
left: Box::new(Expr::Identifier(Ident::new("@bar"))),
672+
op: BinaryOperator::Multiply,
673+
right: Box::new(Expr::Value(Value::Number("4".parse().unwrap(), false))),
674+
})],
675+
into: None,
676+
from: vec![],
677+
lateral_views: vec![],
678+
prewhere: None,
679+
selection: None,
680+
group_by: GroupByExpr::Expressions(vec![], vec![]),
681+
cluster_by: vec![],
682+
distribute_by: vec![],
683+
sort_by: vec![],
684+
having: None,
685+
named_window: vec![],
686+
window_before_qualify: false,
687+
qualify: None,
688+
value_table_mode: None,
689+
connect_by: None,
690+
})))
691+
}))
692+
],
693+
ast
694+
);
629695
}
630696

631697
#[test]

0 commit comments

Comments
 (0)