Adds support for PostgreSQL "END" (#1035)

Signed-off-by: Toby Hede <toby@cipherstash.com>
This commit is contained in:
Toby Hede 2023-11-22 07:21:35 +11:00 committed by GitHub
parent 3d2773a794
commit 541d684fba
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 1 deletions

1
.tool-versions Normal file
View file

@ -0,0 +1 @@
rust 1.73.0

View file

@ -420,7 +420,11 @@ impl<'a> Parser<'a> {
Token::EOF => break,
// 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
// by at least PostgreSQL and MySQL.
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::RELEASE => Ok(self.parse_release()?),
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> {
let mut modes = vec![];
let mut required = false;

View file

@ -6336,6 +6336,17 @@ fn parse_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]
fn parse_rollback() {
match verified_stmt("ROLLBACK") {