From a90fa0e6d613bc5dfae1eded591b47a88c69f5be Mon Sep 17 00:00:00 2001 From: Chongchen Chen Date: Thu, 24 Jul 2025 19:29:08 +0800 Subject: [PATCH 1/2] fix: begin statement for bigquery --- src/dialect/bigquery.rs | 10 ++++++++++ tests/sqlparser_bigquery.rs | 11 +++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/dialect/bigquery.rs b/src/dialect/bigquery.rs index d53c9db05..4a2da84d4 100644 --- a/src/dialect/bigquery.rs +++ b/src/dialect/bigquery.rs @@ -19,6 +19,7 @@ use crate::ast::Statement; use crate::dialect::Dialect; use crate::keywords::Keyword; use crate::parser::{Parser, ParserError}; +use crate::tokenizer::Token; /// These keywords are disallowed as column identifiers. Such that /// `SELECT 5 AS FROM T` is rejected by BigQuery. @@ -47,6 +48,15 @@ pub struct BigQueryDialect; impl Dialect for BigQueryDialect { fn parse_statement(&self, parser: &mut Parser) -> Option> { if parser.parse_keyword(Keyword::BEGIN) { + if parser.peek_keyword(Keyword::TRANSACTION) { + parser.prev_token(); + return None; + } + let peek_token = parser.peek_token_ref(); + if peek_token.token == Token::SemiColon || peek_token.token == Token::EOF { + parser.prev_token(); + return None; + } return Some(parser.parse_begin_exception_end()); } diff --git a/tests/sqlparser_bigquery.rs b/tests/sqlparser_bigquery.rs index 2ba54d3e1..0d23546f5 100644 --- a/tests/sqlparser_bigquery.rs +++ b/tests/sqlparser_bigquery.rs @@ -2566,3 +2566,14 @@ fn test_struct_trailing_and_nested_bracket() { ) ); } + +// https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#begin_transaction +#[test] +fn test_begin_transaction() { + bigquery().verified_stmt("BEGIN TRANSACTION"); +} + +#[test] +fn test_begin_statement() { + bigquery().verified_stmt("BEGIN"); +} From 2305dff469afe8cb420becd8ffbd3f39370571d2 Mon Sep 17 00:00:00 2001 From: Chongchen Chen Date: Fri, 25 Jul 2025 08:22:16 +0800 Subject: [PATCH 2/2] update --- src/dialect/bigquery.rs | 10 ++++------ tests/sqlparser_bigquery.rs | 1 - 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/dialect/bigquery.rs b/src/dialect/bigquery.rs index 4a2da84d4..27fd3cca3 100644 --- a/src/dialect/bigquery.rs +++ b/src/dialect/bigquery.rs @@ -48,12 +48,10 @@ pub struct BigQueryDialect; impl Dialect for BigQueryDialect { fn parse_statement(&self, parser: &mut Parser) -> Option> { if parser.parse_keyword(Keyword::BEGIN) { - if parser.peek_keyword(Keyword::TRANSACTION) { - parser.prev_token(); - return None; - } - let peek_token = parser.peek_token_ref(); - if peek_token.token == Token::SemiColon || peek_token.token == Token::EOF { + if parser.peek_keyword(Keyword::TRANSACTION) + || parser.peek_token_ref().token == Token::SemiColon + || parser.peek_token_ref().token == Token::EOF + { parser.prev_token(); return None; } diff --git a/tests/sqlparser_bigquery.rs b/tests/sqlparser_bigquery.rs index 0d23546f5..bc03011d8 100644 --- a/tests/sqlparser_bigquery.rs +++ b/tests/sqlparser_bigquery.rs @@ -2567,7 +2567,6 @@ fn test_struct_trailing_and_nested_bracket() { ); } -// https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#begin_transaction #[test] fn test_begin_transaction() { bigquery().verified_stmt("BEGIN TRANSACTION");