Skip to content

Commit

Permalink
Fix "BEGIN TRANSACTION" being serialized as "START TRANSACTION" (apac…
Browse files Browse the repository at this point in the history
  • Loading branch information
lovasoa authored and serprex committed Nov 6, 2023
1 parent eb7f186 commit 45a12c3
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 8 deletions.
18 changes: 15 additions & 3 deletions src/ast/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1651,9 +1651,14 @@ pub enum Statement {
Use {
db_name: Ident,
},
/// `{ BEGIN [ TRANSACTION | WORK ] | START TRANSACTION } ...`
/// `START [ TRANSACTION | WORK ] | START TRANSACTION } ...`
/// If `begin` is false.
///
/// `BEGIN [ TRANSACTION | WORK ] | START TRANSACTION } ...`
/// If `begin` is true
StartTransaction {
modes: Vec<TransactionMode>,
begin: bool,
},
/// `SET TRANSACTION ...`
SetTransaction {
Expand Down Expand Up @@ -2910,8 +2915,15 @@ impl fmt::Display for Statement {
}
Ok(())
}
Statement::StartTransaction { modes } => {
write!(f, "START TRANSACTION")?;
Statement::StartTransaction {
modes,
begin: syntax_begin,
} => {
if *syntax_begin {
write!(f, "BEGIN TRANSACTION")?;
} else {
write!(f, "START TRANSACTION")?;
}
if !modes.is_empty() {
write!(f, " {}", display_comma_separated(modes))?;
}
Expand Down
2 changes: 2 additions & 0 deletions src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6952,13 +6952,15 @@ impl<'a> Parser<'a> {
self.expect_keyword(Keyword::TRANSACTION)?;
Ok(Statement::StartTransaction {
modes: self.parse_transaction_modes()?,
begin: false,
})
}

pub fn parse_begin(&mut self) -> Result<Statement, ParserError> {
let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]);
Ok(Statement::StartTransaction {
modes: self.parse_transaction_modes()?,
begin: true,
})
}

Expand Down
10 changes: 5 additions & 5 deletions tests/sqlparser_common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5732,7 +5732,7 @@ fn lateral_derived() {
#[test]
fn parse_start_transaction() {
match verified_stmt("START TRANSACTION READ ONLY, READ WRITE, ISOLATION LEVEL SERIALIZABLE") {
Statement::StartTransaction { modes } => assert_eq!(
Statement::StartTransaction { modes, .. } => assert_eq!(
modes,
vec![
TransactionMode::AccessMode(TransactionAccessMode::ReadOnly),
Expand All @@ -5749,7 +5749,7 @@ fn parse_start_transaction() {
"START TRANSACTION READ ONLY READ WRITE ISOLATION LEVEL SERIALIZABLE",
"START TRANSACTION READ ONLY, READ WRITE, ISOLATION LEVEL SERIALIZABLE",
) {
Statement::StartTransaction { modes } => assert_eq!(
Statement::StartTransaction { modes, .. } => assert_eq!(
modes,
vec![
TransactionMode::AccessMode(TransactionAccessMode::ReadOnly),
Expand All @@ -5761,9 +5761,9 @@ fn parse_start_transaction() {
}

verified_stmt("START TRANSACTION");
one_statement_parses_to("BEGIN", "START TRANSACTION");
one_statement_parses_to("BEGIN WORK", "START TRANSACTION");
one_statement_parses_to("BEGIN TRANSACTION", "START TRANSACTION");
one_statement_parses_to("BEGIN", "BEGIN TRANSACTION");
one_statement_parses_to("BEGIN WORK", "BEGIN TRANSACTION");
one_statement_parses_to("BEGIN TRANSACTION", "BEGIN TRANSACTION");

verified_stmt("START TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
verified_stmt("START TRANSACTION ISOLATION LEVEL READ COMMITTED");
Expand Down

0 comments on commit 45a12c3

Please sign in to comment.