diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 1cf5a7688..d08ef0e2b 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -1540,8 +1540,15 @@ pub enum Statement { /// /// Note: This is a MySQL-specific statement. Use { db_name: Ident }, - /// `{ BEGIN [ TRANSACTION | WORK ] | START TRANSACTION } ...` - StartTransaction { modes: Vec }, + /// `START [ TRANSACTION | WORK ] | START TRANSACTION } ...` + /// If `begin` is false. + /// + /// `BEGIN [ TRANSACTION | WORK ] | START TRANSACTION } ...` + /// If `begin` is true + StartTransaction { + modes: Vec, + begin: bool, + }, /// `SET TRANSACTION ...` SetTransaction { modes: Vec, @@ -2720,8 +2727,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))?; } diff --git a/src/parser.rs b/src/parser.rs index b8f36332e..7dd07d050 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -6905,6 +6905,7 @@ impl<'a> Parser<'a> { self.expect_keyword(Keyword::TRANSACTION)?; Ok(Statement::StartTransaction { modes: self.parse_transaction_modes()?, + begin: false, }) } @@ -6912,6 +6913,7 @@ impl<'a> Parser<'a> { let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]); Ok(Statement::StartTransaction { modes: self.parse_transaction_modes()?, + begin: true, }) } diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 31f252204..444e6d346 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -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), @@ -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), @@ -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");