diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 668c520e5..0f1009ab1 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -674,7 +674,7 @@ impl<'a> Parser<'a> { self.prev_token(); self.parse_throw().map(Into::into) } - Keyword::ROLLBACK => self.parse_rollback(), + Keyword::ROLLBACK | Keyword::ABORT => self.parse_rollback(), Keyword::ASSERT => self.parse_assert(), // `PREPARE`, `EXECUTE` and `DEALLOCATE` are Postgres-specific // syntaxes. They are used for Postgres prepared statement. diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 739238c82..dc9583450 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -9475,6 +9475,22 @@ fn parse_rollback() { ); } +#[test] +fn parse_abort() { + one_statement_parses_to("ABORT", "ROLLBACK"); + one_statement_parses_to("ABORT TRANSACTION", "ROLLBACK"); + one_statement_parses_to("ABORT WORK", "ROLLBACK"); + one_statement_parses_to("ABORT AND CHAIN", "ROLLBACK AND CHAIN"); + one_statement_parses_to("ABORT AND NO CHAIN", "ROLLBACK"); + one_statement_parses_to("ABORT TRANSACTION AND CHAIN", "ROLLBACK AND CHAIN"); + one_statement_parses_to("ABORT WORK AND NO CHAIN", "ROLLBACK"); + one_statement_parses_to("ABORT TO test1", "ROLLBACK TO SAVEPOINT test1"); + one_statement_parses_to( + "ABORT AND CHAIN TO test1", + "ROLLBACK AND CHAIN TO SAVEPOINT test1", + ); +} + #[test] #[should_panic(expected = "Parse results with GenericDialect are different from PostgreSqlDialect")] fn ensure_multiple_dialects_are_tested() {