@@ -670,6 +670,7 @@ impl<'a> Parser<'a> {
670670 Keyword::RELEASE => self.parse_release(),
671671 Keyword::COMMIT => self.parse_commit(),
672672 Keyword::RAISERROR => Ok(self.parse_raiserror()?),
673+ Keyword::THROW => Ok(self.parse_throw()?),
673674 Keyword::ROLLBACK => self.parse_rollback(),
674675 Keyword::ASSERT => self.parse_assert(),
675676 // `PREPARE`, `EXECUTE` and `DEALLOCATE` are Postgres-specific
@@ -18260,6 +18261,31 @@ impl<'a> Parser<'a> {
1826018261 }
1826118262 }
1826218263
18264+ /// Parse a MSSQL `THROW` statement
18265+ /// See <https://learn.microsoft.com/en-us/sql/t-sql/language-elements/throw-transact-sql>
18266+ pub fn parse_throw(&mut self) -> Result<Statement, ParserError> {
18267+ // THROW with no arguments is a re-throw inside a CATCH block
18268+ if self.peek_token_ref().token == Token::SemiColon
18269+ || self.peek_token_ref().token == Token::EOF
18270+ {
18271+ return Ok(Statement::Throw {
18272+ error_number: None,
18273+ message: None,
18274+ state: None,
18275+ });
18276+ }
18277+ let error_number = Box::new(self.parse_expr()?);
18278+ self.expect_token(&Token::Comma)?;
18279+ let message = Box::new(self.parse_expr()?);
18280+ self.expect_token(&Token::Comma)?;
18281+ let state = Box::new(self.parse_expr()?);
18282+ Ok(Statement::Throw {
18283+ error_number: Some(error_number),
18284+ message: Some(message),
18285+ state: Some(state),
18286+ })
18287+ }
18288+
1826318289 /// Parse a SQL `DEALLOCATE` statement
1826418290 pub fn parse_deallocate(&mut self) -> Result<Statement, ParserError> {
1826518291 let prepare = self.parse_keyword(Keyword::PREPARE);
0 commit comments