Skip to content

Commit 74ce546

Browse files
committed
Refactor logic to mod.rs
Signed-off-by: Guan-Ming (Wesley) Chiu <105915352+guan404ming@users.noreply.github.com>
1 parent bf35213 commit 74ce546

2 files changed

Lines changed: 28 additions & 16 deletions

File tree

src/dialect/mssql.rs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -146,20 +146,27 @@ impl Dialect for MsSqlDialect {
146146

147147
fn parse_statement(&self, parser: &mut Parser) -> Option<Result<Statement, ParserError>> {
148148
if parser.parse_keyword(Keyword::BEGIN) {
149-
if parser.peek_keyword(Keyword::TRANSACTION)
150-
|| parser.peek_keyword(Keyword::WORK)
151-
|| parser.peek_keyword(Keyword::TRY)
152-
|| parser.peek_keyword(Keyword::CATCH)
153-
|| parser.peek_keyword(Keyword::DEFERRED)
154-
|| parser.peek_keyword(Keyword::IMMEDIATE)
155-
|| parser.peek_keyword(Keyword::EXCLUSIVE)
156-
|| parser.peek_token_ref().token == Token::SemiColon
157-
|| parser.peek_token_ref().token == Token::EOF
158-
{
149+
// Check if this is a BEGIN...END block rather than BEGIN TRANSACTION
150+
let is_block = parser
151+
.maybe_parse(|p| {
152+
if p.parse_transaction_modifier().is_some()
153+
|| p.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK])
154+
.is_some()
155+
|| matches!(p.peek_token_ref().token, Token::SemiColon | Token::EOF)
156+
{
157+
p.expected("statement", p.peek_token())
158+
} else {
159+
Ok(())
160+
}
161+
})
162+
.unwrap_or(None)
163+
.is_some();
164+
if is_block {
165+
Some(parser.parse_begin_exception_end())
166+
} else {
159167
parser.prev_token();
160-
return None;
168+
None
161169
}
162-
Some(parser.parse_begin_exception_end())
163170
} else if parser.peek_keyword(Keyword::IF) {
164171
Some(self.parse_if_stmt(parser))
165172
} else if parser.parse_keywords(&[Keyword::CREATE, Keyword::TRIGGER]) {

src/parser/mod.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17925,9 +17925,9 @@ impl<'a> Parser<'a> {
1792517925
})
1792617926
}
1792717927

17928-
/// Parse a 'BEGIN' statement
17929-
pub fn parse_begin(&mut self) -> Result<Statement, ParserError> {
17930-
let modifier = if !self.dialect.supports_start_transaction_modifier() {
17928+
/// Parse a transaction modifier keyword that can follow a BEGIN statement.
17929+
pub fn parse_transaction_modifier(&mut self) -> Option<TransactionModifier> {
17930+
if !self.dialect.supports_start_transaction_modifier() {
1793117931
None
1793217932
} else if self.parse_keyword(Keyword::DEFERRED) {
1793317933
Some(TransactionModifier::Deferred)
@@ -17941,7 +17941,12 @@ impl<'a> Parser<'a> {
1794117941
Some(TransactionModifier::Catch)
1794217942
} else {
1794317943
None
17944-
};
17944+
}
17945+
}
17946+
17947+
/// Parse a 'BEGIN' statement
17948+
pub fn parse_begin(&mut self) -> Result<Statement, ParserError> {
17949+
let modifier = self.parse_transaction_modifier();
1794517950
let transaction = match self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]) {
1794617951
Some(Keyword::TRANSACTION) => Some(BeginTransactionKind::Transaction),
1794717952
Some(Keyword::WORK) => Some(BeginTransactionKind::Work),

0 commit comments

Comments
 (0)