From 29381d0197f7eff6a40e6bcb8d9a11cfa112a6a2 Mon Sep 17 00:00:00 2001 From: Mosha Pasumansky Date: Thu, 13 Aug 2026 14:16:05 -0700 Subject: [PATCH 1/5] BigQuery: enable FROM-first SELECT BigQuery allows a query to start with `FROM`, e.g. `FROM t` and `FROM t SELECT *`, which is also the entry form for pipe syntax (`FROM t |> ...`). The parser already supports FROM-first `SELECT` behind `Dialect::supports_from_first_select()` (enabled for ClickHouse, DuckDB and Generic); this enables it for BigQuery as well. The existing `test_select_from_first` / `test_select_from_first_with_cte`, parameterized over `all_dialects_where(|d| d.supports_from_first_select())`, now cover BigQuery. Docs: https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#from_queries Co-authored-by: Claude Opus 4.8 --- src/dialect/bigquery.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/dialect/bigquery.rs b/src/dialect/bigquery.rs index 544be23e0..d34be9a40 100644 --- a/src/dialect/bigquery.rs +++ b/src/dialect/bigquery.rs @@ -136,6 +136,14 @@ impl Dialect for BigQueryDialect { true } + /// BigQuery allows a query to start with `FROM` (e.g. `FROM t`, and the + /// entry form for pipe syntax, `FROM t |> ...`). + /// + /// See + fn supports_from_first_select(&self) -> bool { + true + } + /// See fn supports_execute_immediate(&self) -> bool { true From f2af9c533786328dcc89e328ab13e561f38cb4db Mon Sep 17 00:00:00 2001 From: Mosha Pasumansky Date: Tue, 18 Aug 2026 17:36:25 -0700 Subject: [PATCH 2/5] Add BigQuery FROM-first SELECT tests Add regression tests for the BigQuery dialect's FROM-first `SELECT`: the bare `FROM t` (`FromFirstNoSelect`) and `FROM t SELECT ...` (`FromFirst`) forms, and `FROM t |> ...` as the entry form for pipe syntax. Co-authored-by: Claude Opus 4.8 --- tests/sqlparser_bigquery.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/sqlparser_bigquery.rs b/tests/sqlparser_bigquery.rs index f6d4483c2..4c17a3e53 100644 --- a/tests/sqlparser_bigquery.rs +++ b/tests/sqlparser_bigquery.rs @@ -2950,3 +2950,31 @@ fn test_create_snapshot_table() { "CREATE SNAPSHOT TABLE IF NOT EXISTS dataset_id.table1 CLONE dataset_id.table2 FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR) OPTIONS(expiration_timestamp = TIMESTAMP '2025-01-01 00:00:00 UTC')", ); } + +#[test] +fn parse_from_first_select() { + // BigQuery allows a query to begin with `FROM`, both on its own and as the + // entry form for pipe syntax. + bigquery().verified_stmt("FROM t"); + bigquery().verified_stmt("FROM t SELECT a, b"); + bigquery().verified_stmt("FROM t |> WHERE a > 1 |> SELECT a"); + + // The bare form has no explicit SELECT and parses as `FromFirstNoSelect`; + // adding a SELECT switches it to `FromFirst`. + match bigquery().verified_stmt("FROM t") { + Statement::Query(query) => match *query.body { + SetExpr::Select(select) => { + assert_eq!(select.flavor, SelectFlavor::FromFirstNoSelect) + } + other => panic!("expected a select, got {other:?}"), + }, + other => panic!("expected a query, got {other:?}"), + } + match bigquery().verified_stmt("FROM t SELECT a, b") { + Statement::Query(query) => match *query.body { + SetExpr::Select(select) => assert_eq!(select.flavor, SelectFlavor::FromFirst), + other => panic!("expected a select, got {other:?}"), + }, + other => panic!("expected a query, got {other:?}"), + } +} From aef002a48c2432553e0cf142e2b17fe9d65344b2 Mon Sep 17 00:00:00 2001 From: Mosha Pasumansky <93998884+moshap-firebolt@users.noreply.github.com> Date: Wed, 19 Aug 2026 19:13:54 -0700 Subject: [PATCH 3/5] Update tests/sqlparser_bigquery.rs Co-authored-by: Ifeanyi Ubah --- tests/sqlparser_bigquery.rs | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/tests/sqlparser_bigquery.rs b/tests/sqlparser_bigquery.rs index 4c17a3e53..92bc4183c 100644 --- a/tests/sqlparser_bigquery.rs +++ b/tests/sqlparser_bigquery.rs @@ -2958,23 +2958,5 @@ fn parse_from_first_select() { bigquery().verified_stmt("FROM t"); bigquery().verified_stmt("FROM t SELECT a, b"); bigquery().verified_stmt("FROM t |> WHERE a > 1 |> SELECT a"); - - // The bare form has no explicit SELECT and parses as `FromFirstNoSelect`; - // adding a SELECT switches it to `FromFirst`. - match bigquery().verified_stmt("FROM t") { - Statement::Query(query) => match *query.body { - SetExpr::Select(select) => { - assert_eq!(select.flavor, SelectFlavor::FromFirstNoSelect) - } - other => panic!("expected a select, got {other:?}"), - }, - other => panic!("expected a query, got {other:?}"), - } - match bigquery().verified_stmt("FROM t SELECT a, b") { - Statement::Query(query) => match *query.body { - SetExpr::Select(select) => assert_eq!(select.flavor, SelectFlavor::FromFirst), - other => panic!("expected a select, got {other:?}"), - }, - other => panic!("expected a query, got {other:?}"), } } From 88ab7a516890d1d1bf934dacb90042ed85e1ae4e Mon Sep 17 00:00:00 2001 From: Mosha Pasumansky <93998884+moshap-firebolt@users.noreply.github.com> Date: Wed, 19 Aug 2026 19:14:02 -0700 Subject: [PATCH 4/5] Update tests/sqlparser_bigquery.rs Co-authored-by: Ifeanyi Ubah --- tests/sqlparser_bigquery.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/sqlparser_bigquery.rs b/tests/sqlparser_bigquery.rs index 92bc4183c..74fe8fe98 100644 --- a/tests/sqlparser_bigquery.rs +++ b/tests/sqlparser_bigquery.rs @@ -2953,8 +2953,6 @@ fn test_create_snapshot_table() { #[test] fn parse_from_first_select() { - // BigQuery allows a query to begin with `FROM`, both on its own and as the - // entry form for pipe syntax. bigquery().verified_stmt("FROM t"); bigquery().verified_stmt("FROM t SELECT a, b"); bigquery().verified_stmt("FROM t |> WHERE a > 1 |> SELECT a"); From 9dd9cfb8549eb1bba4763cf3c8619e40ab8a95bc Mon Sep 17 00:00:00 2001 From: moshap Date: Wed, 19 Aug 2026 19:20:40 -0700 Subject: [PATCH 5/5] Fix stray closing brace in parse_from_first_select test Co-Authored-By: Claude Opus 4.8 (1M context) --- tests/sqlparser_bigquery.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/sqlparser_bigquery.rs b/tests/sqlparser_bigquery.rs index 74fe8fe98..97f71cfe7 100644 --- a/tests/sqlparser_bigquery.rs +++ b/tests/sqlparser_bigquery.rs @@ -2956,5 +2956,4 @@ fn parse_from_first_select() { bigquery().verified_stmt("FROM t"); bigquery().verified_stmt("FROM t SELECT a, b"); bigquery().verified_stmt("FROM t |> WHERE a > 1 |> SELECT a"); - } }