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