From 7b38d193960b278d852a88fd479f2e1887e25b29 Mon Sep 17 00:00:00 2001 From: TzeYiing Date: Tue, 29 Nov 2022 12:20:43 +0800 Subject: [PATCH 1/2] fix: unnest join constraint with alias parsing for BigQuery dialect --- src/parser.rs | 7 +++++-- tests/sqlparser_bigquery.rs | 28 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index 8361e02ad..e04e8bdc3 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -4913,12 +4913,15 @@ impl<'a> Parser<'a> { Err(_) => false, }; - let with_offset_alias = + let with_offset_alias = if with_offset { match self.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS) { Ok(Some(alias)) => Some(alias), Ok(None) => None, Err(e) => return Err(e), - }; + } + } else { + None + }; Ok(TableFactor::UNNEST { alias, diff --git a/tests/sqlparser_bigquery.rs b/tests/sqlparser_bigquery.rs index 8ada172cf..f79947286 100644 --- a/tests/sqlparser_bigquery.rs +++ b/tests/sqlparser_bigquery.rs @@ -94,6 +94,34 @@ fn parse_table_identifiers() { test_table_ident("abc5.GROUP", vec![Ident::new("abc5"), Ident::new("GROUP")]); } +#[test] +fn parse_join_constraint_unnest_alias() { + assert_eq!( + only( + bigquery() + .verified_only_select(&"SELECT * FROM t1 JOIN UNNEST(t1.a) AS f ON c1 = c2") + .from + ) + .joins, + vec![Join { + relation: TableFactor::UNNEST { + alias: table_alias("f"), + array_expr: Box::new(Expr::CompoundIdentifier(vec![ + Ident::new("t1"), + Ident::new("a") + ])), + with_offset: false, + with_offset_alias: None + }, + join_operator: JoinOperator::Inner(JoinConstraint::On(Expr::BinaryOp { + left: Box::new(Expr::Identifier("c1".into())), + op: BinaryOperator::Eq, + right: Box::new(Expr::Identifier("c2".into())), + })), + }] + ); +} + #[test] fn parse_trailing_comma() { for (sql, canonical) in [ From 7f6f3b715f72886a9bcf173762bef8a54cc77e49 Mon Sep 17 00:00:00 2001 From: TzeYiing Date: Tue, 6 Dec 2022 03:31:25 +0800 Subject: [PATCH 2/2] chore: fix failing tests --- tests/sqlparser_bigquery.rs | 2 +- tests/sqlparser_common.rs | 19 ------------------- 2 files changed, 1 insertion(+), 20 deletions(-) diff --git a/tests/sqlparser_bigquery.rs b/tests/sqlparser_bigquery.rs index f79947286..3dd516a29 100644 --- a/tests/sqlparser_bigquery.rs +++ b/tests/sqlparser_bigquery.rs @@ -99,7 +99,7 @@ fn parse_join_constraint_unnest_alias() { assert_eq!( only( bigquery() - .verified_only_select(&"SELECT * FROM t1 JOIN UNNEST(t1.a) AS f ON c1 = c2") + .verified_only_select("SELECT * FROM t1 JOIN UNNEST(t1.a) AS f ON c1 = c2") .from ) .joins, diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index ec4c2f257..c4343dc70 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -3555,25 +3555,6 @@ fn parse_unnest() { joins: vec![], }], ); - // 5. WITH OFFSET and WITH OFFSET Alias - chk( - true, - false, - true, - &dialects, - vec![TableWithJoins { - relation: TableFactor::UNNEST { - alias: Some(TableAlias { - name: Ident::new("numbers"), - columns: vec![], - }), - array_expr: Box::new(Expr::Identifier(Ident::new("expr"))), - with_offset: false, - with_offset_alias: Some(Ident::new("with_offset_alias")), - }, - joins: vec![], - }], - ); } #[test]