Fix "BEGIN TRANSACTION" being serialized as "START TRANSACTION" (#935)

This commit is contained in:
Ophir LOJKINE 2023-07-27 14:32:55 +03:00 committed by GitHub
parent 0ddb853410
commit 10a6ec5637
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 9 deletions

View file

@ -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<TransactionMode> },
/// `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 {
modes: Vec<TransactionMode>,
@ -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))?;
}

View file

@ -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,
})
}

View file

@ -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");