File tree 2 files changed +76
-0
lines changed
2 files changed +76
-0
lines changed Original file line number Diff line number Diff line change @@ -434,6 +434,16 @@ impl<'a> Parser<'a> {
434
434
let statement = self . parse_statement ( ) ?;
435
435
stmts. push ( statement) ;
436
436
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
+ } ;
437
447
}
438
448
Ok ( stmts)
439
449
}
Original file line number Diff line number Diff line change @@ -628,6 +628,72 @@ fn parse_mssql_declare() {
628
628
} ] ,
629
629
ast
630
630
) ;
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
+ ) ;
631
697
}
632
698
633
699
#[ test]
You can’t perform that action at this time.
0 commit comments