This is an automated email from the ASF dual-hosted git repository.

github-merge-queue[bot] pushed a commit to branch 
gh-readonly-queue/main/pr-2332-ab8e6adade1568ee7e40a60f1548ba6a070f1e21
in repository https://gitbox.apache.org/repos/asf/datafusion-sqlparser-rs.git

commit 05af09cd1ddc3e56419dc48b5d5b0bfdce7d89fd
Author: Ning Sun <[email protected]>
AuthorDate: Mon May 18 05:58:25 2026 -0700

    PostgreSQL: add support for `ABORT TRANSACTION` (#2332)
---
 src/parser/mod.rs         | 15 +++++++++++++++
 tests/sqlparser_common.rs | 16 ++++++++++++++++
 2 files changed, 31 insertions(+)

diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index 9655a580..763b876d 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -675,6 +675,7 @@ impl<'a> Parser<'a> {
                     self.parse_throw().map(Into::into)
                 }
                 Keyword::ROLLBACK => self.parse_rollback(),
+                Keyword::ABORT => self.parse_abort(),
                 Keyword::ASSERT => self.parse_assert(),
                 // `PREPARE`, `EXECUTE` and `DEALLOCATE` are Postgres-specific
                 // syntaxes. They are used for Postgres prepared statement.
@@ -19393,6 +19394,20 @@ impl<'a> Parser<'a> {
         Ok(Statement::Rollback { chain, savepoint })
     }
 
+    /// Parse an 'ABORT' statement
+    ///
+    /// ```sql
+    /// ABORT [ TRANSACTION | WORK ] [ AND [ NO ] CHAIN ]
+    /// ```
+    pub fn parse_abort(&mut self) -> Result<Statement, ParserError> {
+        let chain = self.parse_commit_rollback_chain()?;
+
+        Ok(Statement::Rollback {
+            chain,
+            savepoint: None,
+        })
+    }
+
     /// Parse an optional `AND [NO] CHAIN` clause for `COMMIT` and `ROLLBACK` 
statements
     pub fn parse_commit_rollback_chain(&mut self) -> Result<bool, ParserError> 
{
         let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, 
Keyword::WORK, Keyword::TRAN]);
diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs
index b36998bf..bcf3c1d5 100644
--- a/tests/sqlparser_common.rs
+++ b/tests/sqlparser_common.rs
@@ -9536,6 +9536,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");
+
+    assert_eq!(
+        parse_sql_statements("ABORT TO test1").unwrap_err(),
+        ParserError::ParserError("Expected: end of statement, found: 
TO".to_string()),
+    );
+}
+
 #[test]
 #[should_panic(expected = "Parse results with GenericDialect are different 
from PostgreSqlDialect")]
 fn ensure_multiple_dialects_are_tested() {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to