@@ -536,6 +536,10 @@ impl<'a> Parser<'a> {
536536 self.prev_token();
537537 self.parse_if_stmt()
538538 }
539+ Keyword::WHILE => {
540+ self.prev_token();
541+ self.parse_while()
542+ }
539543 Keyword::RAISE => {
540544 self.prev_token();
541545 self.parse_raise_stmt()
@@ -704,8 +708,18 @@ impl<'a> Parser<'a> {
704708 }))
705709 }
706710
711+ /// Parse a `WHILE` statement.
712+ ///
713+ /// See [Statement::While]
714+ fn parse_while(&mut self) -> Result<Statement, ParserError> {
715+ self.expect_keyword_is(Keyword::WHILE)?;
716+ let while_block = self.parse_conditional_statement_block(&[Keyword::END])?;
717+
718+ Ok(Statement::While(WhileStatement { while_block }))
719+ }
720+
707721 /// Parses an expression and associated list of statements
708- /// belonging to a conditional statement like `IF` or `WHEN`.
722+ /// belonging to a conditional statement like `IF` or `WHEN` or `WHILE` .
709723 ///
710724 /// Example:
711725 /// ```sql
@@ -720,20 +734,36 @@ impl<'a> Parser<'a> {
720734
721735 let condition = match &start_token.token {
722736 Token::Word(w) if w.keyword == Keyword::ELSE => None,
737+ Token::Word(w) if w.keyword == Keyword::WHILE => {
738+ let expr = self.parse_expr()?;
739+ Some(expr)
740+ }
723741 _ => {
724742 let expr = self.parse_expr()?;
725743 then_token = Some(AttachedToken(self.expect_keyword(Keyword::THEN)?));
726744 Some(expr)
727745 }
728746 };
729747
730- let statements = self.parse_statement_list(terminal_keywords)?;
748+ let conditional_statements = if self.peek_keyword(Keyword::BEGIN) {
749+ let begin_token = self.expect_keyword(Keyword::BEGIN)?;
750+ let statements = self.parse_statement_list(terminal_keywords)?;
751+ let end_token = self.expect_keyword(Keyword::END)?;
752+ ConditionalStatements::BeginEnd(BeginEndStatements {
753+ begin_token: AttachedToken(begin_token),
754+ statements,
755+ end_token: AttachedToken(end_token),
756+ })
757+ } else {
758+ let statements = self.parse_statement_list(terminal_keywords)?;
759+ ConditionalStatements::Sequence { statements }
760+ };
731761
732762 Ok(ConditionalStatementBlock {
733763 start_token: AttachedToken(start_token),
734764 condition,
735765 then_token,
736- conditional_statements: ConditionalStatements::Sequence { statements } ,
766+ conditional_statements,
737767 })
738768 }
739769
@@ -4457,6 +4487,9 @@ impl<'a> Parser<'a> {
44574487 break;
44584488 }
44594489 }
4490+ if let Token::EOF = self.peek_nth_token_ref(0).token {
4491+ break;
4492+ }
44604493 values.push(self.parse_statement()?);
44614494 self.expect_token(&Token::SemiColon)?;
44624495 }
0 commit comments