Skip to content

Commit 1727546

Browse files
committed
Add parse_conditional_statements & use it
1 parent 000fe3f commit 1727546

File tree

2 files changed

+23
-26
lines changed

2 files changed

+23
-26
lines changed

src/dialect/mssql.rs

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -240,22 +240,7 @@ impl MsSqlDialect {
240240
let events = parser.parse_comma_separated(Parser::parse_trigger_event)?;
241241

242242
parser.expect_keyword_is(Keyword::AS)?;
243-
244-
let trigger_statements_body = if parser.peek_keyword(Keyword::BEGIN) {
245-
let begin_token = parser.expect_keyword(Keyword::BEGIN)?;
246-
let statements = parser.parse_statement_list(&[Keyword::END])?;
247-
let end_token = parser.expect_keyword(Keyword::END)?;
248-
249-
ConditionalStatements::BeginEnd(BeginEndStatements {
250-
begin_token: AttachedToken(begin_token),
251-
statements,
252-
end_token: AttachedToken(end_token),
253-
})
254-
} else {
255-
ConditionalStatements::Sequence {
256-
statements: parser.parse_statements()?,
257-
}
258-
};
243+
let statements = Some(parser.parse_conditional_statements(&[Keyword::END])?);
259244

260245
Ok(Statement::CreateTrigger {
261246
or_alter,
@@ -271,7 +256,7 @@ impl MsSqlDialect {
271256
include_each: false,
272257
condition: None,
273258
exec_body: None,
274-
statements: Some(trigger_statements_body),
259+
statements,
275260
characteristics: None,
276261
})
277262
}

src/parser/mod.rs

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -745,26 +745,38 @@ impl<'a> Parser<'a> {
745745
}
746746
};
747747

748+
let conditional_statements = self.parse_conditional_statements(terminal_keywords)?;
749+
750+
Ok(ConditionalStatementBlock {
751+
start_token: AttachedToken(start_token),
752+
condition,
753+
then_token,
754+
conditional_statements,
755+
})
756+
}
757+
758+
/// Parse a BEGIN/END block or a sequence of statements
759+
/// This could be inside of a conditional (IF, CASE, WHILE etc.) or an object body defined optionally BEGIN/END and one or more statements.
760+
pub(crate) fn parse_conditional_statements(
761+
&mut self,
762+
terminal_keywords: &[Keyword],
763+
) -> Result<ConditionalStatements, ParserError> {
748764
let conditional_statements = if self.peek_keyword(Keyword::BEGIN) {
749765
let begin_token = self.expect_keyword(Keyword::BEGIN)?;
750766
let statements = self.parse_statement_list(terminal_keywords)?;
751767
let end_token = self.expect_keyword(Keyword::END)?;
768+
752769
ConditionalStatements::BeginEnd(BeginEndStatements {
753770
begin_token: AttachedToken(begin_token),
754771
statements,
755772
end_token: AttachedToken(end_token),
756773
})
757774
} else {
758-
let statements = self.parse_statement_list(terminal_keywords)?;
759-
ConditionalStatements::Sequence { statements }
775+
ConditionalStatements::Sequence {
776+
statements: self.parse_statements()?,
777+
}
760778
};
761-
762-
Ok(ConditionalStatementBlock {
763-
start_token: AttachedToken(start_token),
764-
condition,
765-
then_token,
766-
conditional_statements,
767-
})
779+
Ok(conditional_statements)
768780
}
769781

770782
/// Parse a `RAISE` statement.

0 commit comments

Comments
 (0)