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