mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-10-09 21:42:05 +00:00
Extend exception handling (#1884)
Some checks are pending
license / Release Audit Tool (RAT) (push) Waiting to run
Rust / codestyle (push) Waiting to run
Rust / lint (push) Waiting to run
Rust / benchmark-lint (push) Waiting to run
Rust / compile (push) Waiting to run
Rust / docs (push) Waiting to run
Rust / compile-no-std (push) Waiting to run
Rust / test (beta) (push) Waiting to run
Rust / test (nightly) (push) Waiting to run
Rust / test (stable) (push) Waiting to run
Some checks are pending
license / Release Audit Tool (RAT) (push) Waiting to run
Rust / codestyle (push) Waiting to run
Rust / lint (push) Waiting to run
Rust / benchmark-lint (push) Waiting to run
Rust / compile (push) Waiting to run
Rust / docs (push) Waiting to run
Rust / compile-no-std (push) Waiting to run
Rust / test (beta) (push) Waiting to run
Rust / test (nightly) (push) Waiting to run
Rust / test (stable) (push) Waiting to run
This commit is contained in:
parent
185a490218
commit
204d3b484d
8 changed files with 178 additions and 67 deletions
|
@ -15092,7 +15092,7 @@ impl<'a> Parser<'a> {
|
|||
transaction: Some(BeginTransactionKind::Transaction),
|
||||
modifier: None,
|
||||
statements: vec![],
|
||||
exception_statements: None,
|
||||
exception: None,
|
||||
has_end_keyword: false,
|
||||
})
|
||||
}
|
||||
|
@ -15124,11 +15124,56 @@ impl<'a> Parser<'a> {
|
|||
transaction,
|
||||
modifier,
|
||||
statements: vec![],
|
||||
exception_statements: None,
|
||||
exception: None,
|
||||
has_end_keyword: false,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn parse_begin_exception_end(&mut self) -> Result<Statement, ParserError> {
|
||||
let statements = self.parse_statement_list(&[Keyword::EXCEPTION, Keyword::END])?;
|
||||
|
||||
let exception = if self.parse_keyword(Keyword::EXCEPTION) {
|
||||
let mut when = Vec::new();
|
||||
|
||||
// We can have multiple `WHEN` arms so we consume all cases until `END`
|
||||
while !self.peek_keyword(Keyword::END) {
|
||||
self.expect_keyword(Keyword::WHEN)?;
|
||||
|
||||
// Each `WHEN` case can have one or more conditions, e.g.
|
||||
// WHEN EXCEPTION_1 [OR EXCEPTION_2] THEN
|
||||
// So we parse identifiers until the `THEN` keyword.
|
||||
let mut idents = Vec::new();
|
||||
|
||||
while !self.parse_keyword(Keyword::THEN) {
|
||||
let ident = self.parse_identifier()?;
|
||||
idents.push(ident);
|
||||
|
||||
self.maybe_parse(|p| p.expect_keyword(Keyword::OR))?;
|
||||
}
|
||||
|
||||
let statements = self.parse_statement_list(&[Keyword::WHEN, Keyword::END])?;
|
||||
|
||||
when.push(ExceptionWhen { idents, statements });
|
||||
}
|
||||
|
||||
Some(when)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
self.expect_keyword(Keyword::END)?;
|
||||
|
||||
Ok(Statement::StartTransaction {
|
||||
begin: true,
|
||||
statements,
|
||||
exception,
|
||||
has_end_keyword: true,
|
||||
transaction: None,
|
||||
modifier: None,
|
||||
modes: Default::default(),
|
||||
})
|
||||
}
|
||||
|
||||
pub fn parse_end(&mut self) -> Result<Statement, ParserError> {
|
||||
let modifier = if !self.dialect.supports_end_transaction_modifier() {
|
||||
None
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue