From 60eb8ba4d4dba58e08674f7cdc599394324861ec Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Thu, 2 Nov 2023 21:08:41 +1100 Subject: [PATCH 1/3] Adds support for PostgreSQL "END" Signed-off-by: Toby Hede --- src/parser/mod.rs | 17 ++++++++++++++++- tests/sqlparser_common.rs | 11 +++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 1735b9618..a57bab57f 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -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()?), @@ -7808,6 +7816,13 @@ impl<'a> Parser<'a> { }) } + pub fn parse_end(&mut self) -> Result { + // let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]); + Ok(Statement::Commit { + chain: self.parse_commit_rollback_chain()?, + }) + } + pub fn parse_transaction_modes(&mut self) -> Result, ParserError> { let mut modes = vec![]; let mut required = false; diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index e28db9278..cea9b529e 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -6231,6 +6231,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") { From 9d7c62d5d2677539b8a6f4d37faad55a0a9386fd Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Mon, 20 Nov 2023 11:26:44 +1100 Subject: [PATCH 2/3] Fix for lint warning --- .tool-versions | 1 + 1 file changed, 1 insertion(+) create mode 100644 .tool-versions diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 000000000..d090dbab8 --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +rust 1.73.0 \ No newline at end of file From 5f261408e4af65f37be06cd88386f6a73a0e32aa Mon Sep 17 00:00:00 2001 From: Toby Hede Date: Tue, 21 Nov 2023 12:00:58 +1100 Subject: [PATCH 3/3] Remove old comment Signed-off-by: Toby Hede --- src/parser/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index a57bab57f..670242b79 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -7817,7 +7817,6 @@ impl<'a> Parser<'a> { } pub fn parse_end(&mut self) -> Result { - // let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]); Ok(Statement::Commit { chain: self.parse_commit_rollback_chain()?, })