Skip to content

Commit a72ea54

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 334a5bf commit a72ea54

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

633699
#[test]

0 commit comments

Comments
 (0)