mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-22 23:14:07 +00:00
Adds support for PostgreSQL "END" (#1035)
Signed-off-by: Toby Hede <toby@cipherstash.com>
This commit is contained in:
parent
3d2773a794
commit
541d684fba
3 changed files with 27 additions and 1 deletions
1
.tool-versions
Normal file
1
.tool-versions
Normal file
|
@ -0,0 +1 @@
|
||||||
|
rust 1.73.0
|
|
@ -420,7 +420,11 @@ impl<'a> Parser<'a> {
|
||||||
Token::EOF => break,
|
Token::EOF => break,
|
||||||
|
|
||||||
// end of statement
|
// end of statement
|
||||||
Token::Word(word) if word.keyword == Keyword::END => break,
|
Token::Word(word) => {
|
||||||
|
if expecting_statement_delimiter && word.keyword == Keyword::END {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -501,6 +505,10 @@ impl<'a> Parser<'a> {
|
||||||
// standard `START TRANSACTION` statement. It is supported
|
// standard `START TRANSACTION` statement. It is supported
|
||||||
// by at least PostgreSQL and MySQL.
|
// by at least PostgreSQL and MySQL.
|
||||||
Keyword::BEGIN => Ok(self.parse_begin()?),
|
Keyword::BEGIN => Ok(self.parse_begin()?),
|
||||||
|
// `END` is a nonstandard but common alias for the
|
||||||
|
// standard `COMMIT TRANSACTION` statement. It is supported
|
||||||
|
// by PostgreSQL.
|
||||||
|
Keyword::END => Ok(self.parse_end()?),
|
||||||
Keyword::SAVEPOINT => Ok(self.parse_savepoint()?),
|
Keyword::SAVEPOINT => Ok(self.parse_savepoint()?),
|
||||||
Keyword::RELEASE => Ok(self.parse_release()?),
|
Keyword::RELEASE => Ok(self.parse_release()?),
|
||||||
Keyword::COMMIT => Ok(self.parse_commit()?),
|
Keyword::COMMIT => Ok(self.parse_commit()?),
|
||||||
|
@ -7821,6 +7829,12 @@ impl<'a> Parser<'a> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn parse_end(&mut self) -> Result<Statement, ParserError> {
|
||||||
|
Ok(Statement::Commit {
|
||||||
|
chain: self.parse_commit_rollback_chain()?,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
pub fn parse_transaction_modes(&mut self) -> Result<Vec<TransactionMode>, ParserError> {
|
pub fn parse_transaction_modes(&mut self) -> Result<Vec<TransactionMode>, ParserError> {
|
||||||
let mut modes = vec![];
|
let mut modes = vec![];
|
||||||
let mut required = false;
|
let mut required = false;
|
||||||
|
|
|
@ -6336,6 +6336,17 @@ fn parse_commit() {
|
||||||
one_statement_parses_to("COMMIT TRANSACTION", "COMMIT");
|
one_statement_parses_to("COMMIT TRANSACTION", "COMMIT");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_end() {
|
||||||
|
one_statement_parses_to("END AND NO CHAIN", "COMMIT");
|
||||||
|
one_statement_parses_to("END WORK AND NO CHAIN", "COMMIT");
|
||||||
|
one_statement_parses_to("END TRANSACTION AND NO CHAIN", "COMMIT");
|
||||||
|
one_statement_parses_to("END WORK AND CHAIN", "COMMIT AND CHAIN");
|
||||||
|
one_statement_parses_to("END TRANSACTION AND CHAIN", "COMMIT AND CHAIN");
|
||||||
|
one_statement_parses_to("END WORK", "COMMIT");
|
||||||
|
one_statement_parses_to("END TRANSACTION", "COMMIT");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_rollback() {
|
fn parse_rollback() {
|
||||||
match verified_stmt("ROLLBACK") {
|
match verified_stmt("ROLLBACK") {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue