Skip to content

Commit 12a3e97

Browse files
authored
add support for SAVEPOINT statement (#438)
1 parent 497a3b0 commit 12a3e97

File tree

3 files changed

+22
-0
lines changed

3 files changed

+22
-0
lines changed

src/ast/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,8 @@ pub enum Statement {
956956
/// A SQL query that specifies what to explain
957957
statement: Box<Statement>,
958958
},
959+
/// SAVEPOINT -- define a new savepoint within the current transaction
960+
Savepoint { name: Ident },
959961
// MERGE INTO statement, based on Snowflake. See <https://docs.snowflake.com/en/sql-reference/sql/merge.html>
960962
Merge {
961963
// Specifies the table to merge
@@ -1619,6 +1621,10 @@ impl fmt::Display for Statement {
16191621
write!(f, "NULL")
16201622
}
16211623
}
1624+
Statement::Savepoint { name } => {
1625+
write!(f, "SAVEPOINT ")?;
1626+
write!(f, "{}", name)
1627+
}
16221628
Statement::Merge {
16231629
table,
16241630
source,

src/parser.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ impl<'a> Parser<'a> {
179179
// standard `START TRANSACTION` statement. It is supported
180180
// by at least PostgreSQL and MySQL.
181181
Keyword::BEGIN => Ok(self.parse_begin()?),
182+
Keyword::SAVEPOINT => Ok(self.parse_savepoint()?),
182183
Keyword::COMMIT => Ok(self.parse_commit()?),
183184
Keyword::ROLLBACK => Ok(self.parse_rollback()?),
184185
Keyword::ASSERT => Ok(self.parse_assert()?),
@@ -367,6 +368,11 @@ impl<'a> Parser<'a> {
367368
Ok(Statement::Assert { condition, message })
368369
}
369370

371+
pub fn parse_savepoint(&mut self) -> Result<Statement, ParserError> {
372+
let name = self.parse_identifier()?;
373+
Ok(Statement::Savepoint { name })
374+
}
375+
370376
/// Parse an expression prefix
371377
pub fn parse_prefix(&mut self) -> Result<Expr, ParserError> {
372378
// PostgreSQL allows any string literal to be preceded by a type name, indicating that the

tests/sqlparser_postgres.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -871,6 +871,16 @@ fn test_transaction_statement() {
871871
);
872872
}
873873

874+
#[test]
875+
fn test_savepoint() {
876+
match pg().verified_stmt("SAVEPOINT test1") {
877+
Statement::Savepoint { name } => {
878+
assert_eq!(Ident::new("test1"), name);
879+
}
880+
_ => unreachable!(),
881+
}
882+
}
883+
874884
#[test]
875885
fn parse_comments() {
876886
match pg().verified_stmt("COMMENT ON COLUMN tab.name IS 'comment'") {

0 commit comments

Comments
 (0)