Skip to content

Commit 60eb8ba

Browse files
committed
Adds support for PostgreSQL "END"
Signed-off-by: Toby Hede <[email protected]>
1 parent 5bdf2e6 commit 60eb8ba

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

src/parser/mod.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,11 @@ impl<'a> Parser<'a> {
420420
Token::EOF => break,
421421

422422
// end of statement
423-
Token::Word(word) if word.keyword == Keyword::END => break,
423+
Token::Word(word) => {
424+
if expecting_statement_delimiter && word.keyword == Keyword::END {
425+
break;
426+
}
427+
}
424428
_ => {}
425429
}
426430

@@ -501,6 +505,10 @@ impl<'a> Parser<'a> {
501505
// standard `START TRANSACTION` statement. It is supported
502506
// by at least PostgreSQL and MySQL.
503507
Keyword::BEGIN => Ok(self.parse_begin()?),
508+
// `END` is a nonstandard but common alias for the
509+
// standard `COMMIT TRANSACTION` statement. It is supported
510+
// by PostgreSQL.
511+
Keyword::END => Ok(self.parse_end()?),
504512
Keyword::SAVEPOINT => Ok(self.parse_savepoint()?),
505513
Keyword::RELEASE => Ok(self.parse_release()?),
506514
Keyword::COMMIT => Ok(self.parse_commit()?),
@@ -7808,6 +7816,13 @@ impl<'a> Parser<'a> {
78087816
})
78097817
}
78107818

7819+
pub fn parse_end(&mut self) -> Result<Statement, ParserError> {
7820+
// let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]);
7821+
Ok(Statement::Commit {
7822+
chain: self.parse_commit_rollback_chain()?,
7823+
})
7824+
}
7825+
78117826
pub fn parse_transaction_modes(&mut self) -> Result<Vec<TransactionMode>, ParserError> {
78127827
let mut modes = vec![];
78137828
let mut required = false;

tests/sqlparser_common.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6231,6 +6231,17 @@ fn parse_commit() {
62316231
one_statement_parses_to("COMMIT TRANSACTION", "COMMIT");
62326232
}
62336233

6234+
#[test]
6235+
fn parse_end() {
6236+
one_statement_parses_to("END AND NO CHAIN", "COMMIT");
6237+
one_statement_parses_to("END WORK AND NO CHAIN", "COMMIT");
6238+
one_statement_parses_to("END TRANSACTION AND NO CHAIN", "COMMIT");
6239+
one_statement_parses_to("END WORK AND CHAIN", "COMMIT AND CHAIN");
6240+
one_statement_parses_to("END TRANSACTION AND CHAIN", "COMMIT AND CHAIN");
6241+
one_statement_parses_to("END WORK", "COMMIT");
6242+
one_statement_parses_to("END TRANSACTION", "COMMIT");
6243+
}
6244+
62346245
#[test]
62356246
fn parse_rollback() {
62366247
match verified_stmt("ROLLBACK") {

0 commit comments

Comments
 (0)