@@ -5321,55 +5321,61 @@ impl<'a> Parser<'a> {
53215321 /// ```
53225322 /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/declare-local-variable-transact-sql?view=sql-server-ver16
53235323 pub fn parse_mssql_declare ( & mut self ) -> Result < Statement , ParserError > {
5324- let mut stmts = vec ! [ ] ;
5325-
5326- loop {
5327- let name = {
5328- let ident = self . parse_identifier ( false ) ?;
5329- if !ident. value . starts_with ( '@' ) {
5330- Err ( ParserError :: TokenizerError (
5331- "Invalid MsSql variable declaration." . to_string ( ) ,
5332- ) )
5333- } else {
5334- Ok ( ident)
5335- }
5336- } ?;
5324+ let stmts = self . parse_comma_separated ( Parser :: parse_mssql_declare_stmt) ?;
53375325
5338- let ( declare_type, data_type) = match self . peek_token ( ) . token {
5339- Token :: Word ( w) => match w. keyword {
5340- Keyword :: CURSOR => {
5341- self . next_token ( ) ;
5342- ( Some ( DeclareType :: Cursor ) , None )
5343- }
5344- Keyword :: AS => {
5345- self . next_token ( ) ;
5346- ( None , Some ( self . parse_data_type ( ) ?) )
5347- }
5348- _ => ( None , Some ( self . parse_data_type ( ) ?) ) ,
5349- } ,
5350- _ => ( None , Some ( self . parse_data_type ( ) ?) ) ,
5351- } ;
5326+ Ok ( Statement :: Declare { stmts } )
5327+ }
53525328
5353- let assignment = self . parse_mssql_variable_declaration_expression ( ) ?;
5329+ /// Parse the body of a [MsSql] `DECLARE`statement.
5330+ ///
5331+ /// Syntax:
5332+ /// ```text
5333+ // {
5334+ // { @local_variable [AS] data_type [ = value ] }
5335+ // | { @cursor_variable_name CURSOR }
5336+ // } [ ,...n ]
5337+ /// ```
5338+ /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/declare-local-variable-transact-sql?view=sql-server-ver16
5339+ pub fn parse_mssql_declare_stmt ( & mut self ) -> Result < Declare , ParserError > {
5340+ let name = {
5341+ let ident = self . parse_identifier ( false ) ?;
5342+ if !ident. value . starts_with ( '@' ) {
5343+ Err ( ParserError :: TokenizerError (
5344+ "Invalid MsSql variable declaration." . to_string ( ) ,
5345+ ) )
5346+ } else {
5347+ Ok ( ident)
5348+ }
5349+ } ?;
53545350
5355- stmts. push ( Declare {
5356- names : vec ! [ name] ,
5357- data_type,
5358- assignment,
5359- declare_type,
5360- binary : None ,
5361- sensitive : None ,
5362- scroll : None ,
5363- hold : None ,
5364- for_query : None ,
5365- } ) ;
5351+ let ( declare_type, data_type) = match self . peek_token ( ) . token {
5352+ Token :: Word ( w) => match w. keyword {
5353+ Keyword :: CURSOR => {
5354+ self . next_token ( ) ;
5355+ ( Some ( DeclareType :: Cursor ) , None )
5356+ }
5357+ Keyword :: AS => {
5358+ self . next_token ( ) ;
5359+ ( None , Some ( self . parse_data_type ( ) ?) )
5360+ }
5361+ _ => ( None , Some ( self . parse_data_type ( ) ?) ) ,
5362+ } ,
5363+ _ => ( None , Some ( self . parse_data_type ( ) ?) ) ,
5364+ } ;
53665365
5367- if self . next_token ( ) != Token :: Comma {
5368- break ;
5369- }
5370- }
5366+ let assignment = self . parse_mssql_variable_declaration_expression ( ) ?;
53715367
5372- Ok ( Statement :: Declare { stmts } )
5368+ Ok ( Declare {
5369+ names : vec ! [ name] ,
5370+ data_type,
5371+ assignment,
5372+ declare_type,
5373+ binary : None ,
5374+ sensitive : None ,
5375+ scroll : None ,
5376+ hold : None ,
5377+ for_query : None ,
5378+ } )
53735379 }
53745380
53755381 /// Parses the assigned expression in a variable declaration.
0 commit comments