From 2bb38c9b277b72f1d384ce83cb7377b1bf0225c3 Mon Sep 17 00:00:00 2001 From: gaffneyk Date: Fri, 13 Sep 2019 13:36:35 -0500 Subject: [PATCH] Parse START TRANSACTION when followed by a semicolon Co-authored-by: Nikhil Benesch --- src/parser.rs | 2 +- tests/sqlparser_common.rs | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index f7719157..38bf4ef3 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -2026,7 +2026,7 @@ impl Parser { TransactionMode::AccessMode(TransactionAccessMode::ReadOnly) } else if self.parse_keywords(vec!["READ", "WRITE"]) { TransactionMode::AccessMode(TransactionAccessMode::ReadWrite) - } else if required || self.peek_token().is_some() { + } else if required { self.expected("transaction mode", self.peek_token())? } else { break; diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index abe6e8f1..ba5bd973 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -2455,6 +2455,17 @@ fn parse_start_transaction() { verified_stmt("START TRANSACTION ISOLATION LEVEL REPEATABLE READ"); verified_stmt("START TRANSACTION ISOLATION LEVEL SERIALIZABLE"); + // Regression test for https://github.com/andygrove/sqlparser-rs/pull/139, + // in which START TRANSACTION would fail to parse if followed by a statement + // terminator. + assert_eq!( + parse_sql_statements("START TRANSACTION; SELECT 1"), + Ok(vec![ + verified_stmt("START TRANSACTION"), + verified_stmt("SELECT 1"), + ]) + ); + let res = parse_sql_statements("START TRANSACTION ISOLATION LEVEL BAD"); assert_eq!( ParserError::ParserError("Expected isolation level, found: BAD".to_string()), @@ -2463,7 +2474,7 @@ fn parse_start_transaction() { let res = parse_sql_statements("START TRANSACTION BAD"); assert_eq!( - ParserError::ParserError("Expected transaction mode, found: BAD".to_string()), + ParserError::ParserError("Expected end of statement, found: BAD".to_string()), res.unwrap_err() );