Skip to content

Commit 541d684

Browse files
authored
Adds support for PostgreSQL "END" (#1035)
Signed-off-by: Toby Hede <[email protected]>
1 parent 3d2773a commit 541d684

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

.tool-versions

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
rust 1.73.0

src/parser/mod.rs

Lines changed: 15 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()?),
@@ -7821,6 +7829,12 @@ impl<'a> Parser<'a> {
78217829
})
78227830
}
78237831

7832+
pub fn parse_end(&mut self) -> Result<Statement, ParserError> {
7833+
Ok(Statement::Commit {
7834+
chain: self.parse_commit_rollback_chain()?,
7835+
})
7836+
}
7837+
78247838
pub fn parse_transaction_modes(&mut self) -> Result<Vec<TransactionMode>, ParserError> {
78257839
let mut modes = vec![];
78267840
let mut required = false;

tests/sqlparser_common.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6336,6 +6336,17 @@ fn parse_commit() {
63366336
one_statement_parses_to("COMMIT TRANSACTION", "COMMIT");
63376337
}
63386338

6339+
#[test]
6340+
fn parse_end() {
6341+
one_statement_parses_to("END AND NO CHAIN", "COMMIT");
6342+
one_statement_parses_to("END WORK AND NO CHAIN", "COMMIT");
6343+
one_statement_parses_to("END TRANSACTION AND NO CHAIN", "COMMIT");
6344+
one_statement_parses_to("END WORK AND CHAIN", "COMMIT AND CHAIN");
6345+
one_statement_parses_to("END TRANSACTION AND CHAIN", "COMMIT AND CHAIN");
6346+
one_statement_parses_to("END WORK", "COMMIT");
6347+
one_statement_parses_to("END TRANSACTION", "COMMIT");
6348+
}
6349+
63396350
#[test]
63406351
fn parse_rollback() {
63416352
match verified_stmt("ROLLBACK") {

0 commit comments

Comments
 (0)