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 @@ -626,6 +626,72 @@ fn parse_mssql_declare() {
626
626
} ] ,
627
627
ast
628
628
) ;
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
+ ) ;
629
695
}
630
696
631
697
#[ test]
You can’t perform that action at this time.
0 commit comments