File tree Expand file tree Collapse file tree 2 files changed +76
-0
lines changed
Expand file tree Collapse file tree 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> {
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 }
Original file line number Diff line number Diff 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]
You can’t perform that action at this time.
0 commit comments