Skip to content

Commit 34bbeb4

Browse files
authored
Revert "BigQuery: Fix column identifier reserved keywords list (apache#1678)"
This reverts commit 31e7a44.
1 parent 9af6c48 commit 34bbeb4

File tree

5 files changed

+34
-120
lines changed

5 files changed

+34
-120
lines changed

src/dialect/bigquery.rs

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,28 +16,6 @@
1616
// under the License.
1717

1818
use crate::dialect::Dialect;
19-
use crate::keywords::Keyword;
20-
use crate::parser::Parser;
21-
22-
/// These keywords are disallowed as column identifiers. Such that
23-
/// `SELECT 5 AS <col> FROM T` is rejected by BigQuery.
24-
const RESERVED_FOR_COLUMN_ALIAS: &[Keyword] = &[
25-
Keyword::WITH,
26-
Keyword::SELECT,
27-
Keyword::WHERE,
28-
Keyword::GROUP,
29-
Keyword::HAVING,
30-
Keyword::ORDER,
31-
Keyword::LATERAL,
32-
Keyword::LIMIT,
33-
Keyword::FETCH,
34-
Keyword::UNION,
35-
Keyword::EXCEPT,
36-
Keyword::INTERSECT,
37-
Keyword::FROM,
38-
Keyword::INTO,
39-
Keyword::END,
40-
];
4119

4220
/// A [`Dialect`] for [Google Bigquery](https://cloud.google.com/bigquery/)
4321
#[derive(Debug, Default)]
@@ -114,8 +92,4 @@ impl Dialect for BigQueryDialect {
11492
fn supports_timestamp_versioning(&self) -> bool {
11593
true
11694
}
117-
118-
fn is_column_alias(&self, kw: &Keyword, _parser: &mut Parser) -> bool {
119-
!RESERVED_FOR_COLUMN_ALIAS.contains(kw)
120-
}
12195
}

src/dialect/mod.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -804,7 +804,7 @@ pub trait Dialect: Debug + Any {
804804
keywords::RESERVED_FOR_IDENTIFIER.contains(&kw)
805805
}
806806

807-
/// Returns reserved keywords when looking to parse a `TableFactor`.
807+
// Returns reserved keywords when looking to parse a [TableFactor].
808808
/// See [Self::supports_from_trailing_commas]
809809
fn get_reserved_keywords_for_table_factor(&self) -> &[Keyword] {
810810
keywords::RESERVED_FOR_TABLE_FACTOR
@@ -844,17 +844,11 @@ pub trait Dialect: Debug + Any {
844844
false
845845
}
846846

847-
/// Returns true if the specified keyword should be parsed as a column identifier.
848-
/// See [keywords::RESERVED_FOR_COLUMN_ALIAS]
849-
fn is_column_alias(&self, kw: &Keyword, _parser: &mut Parser) -> bool {
850-
!keywords::RESERVED_FOR_COLUMN_ALIAS.contains(kw)
851-
}
852-
853847
/// Returns true if the specified keyword should be parsed as a select item alias.
854848
/// When explicit is true, the keyword is preceded by an `AS` word. Parser is provided
855849
/// to enable looking ahead if needed.
856-
fn is_select_item_alias(&self, explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
857-
explicit || self.is_column_alias(kw, parser)
850+
fn is_select_item_alias(&self, explicit: bool, kw: &Keyword, _parser: &mut Parser) -> bool {
851+
explicit || !keywords::RESERVED_FOR_COLUMN_ALIAS.contains(kw)
858852
}
859853

860854
/// Returns true if the specified keyword should be parsed as a table factor alias.

src/parser/mod.rs

Lines changed: 18 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3951,7 +3951,7 @@ impl<'a> Parser<'a> {
39513951
self.parse_comma_separated_with_trailing_commas(
39523952
|p| p.parse_select_item(),
39533953
trailing_commas,
3954-
Self::is_reserved_for_column_alias,
3954+
None,
39553955
)
39563956
}
39573957

@@ -3985,42 +3985,30 @@ impl<'a> Parser<'a> {
39853985
self.parse_comma_separated_with_trailing_commas(
39863986
Parser::parse_table_and_joins,
39873987
trailing_commas,
3988-
|kw, _parser| {
3989-
self.dialect
3990-
.get_reserved_keywords_for_table_factor()
3991-
.contains(kw)
3992-
},
3988+
Some(self.dialect.get_reserved_keywords_for_table_factor()),
39933989
)
39943990
}
39953991

39963992
/// Parse the comma of a comma-separated syntax element.
3997-
/// `R` is a predicate that should return true if the next
3998-
/// keyword is a reserved keyword.
39993993
/// Allows for control over trailing commas
4000-
///
40013994
/// Returns true if there is a next element
4002-
fn is_parse_comma_separated_end_with_trailing_commas<R>(
3995+
fn is_parse_comma_separated_end_with_trailing_commas(
40033996
&mut self,
40043997
trailing_commas: bool,
4005-
is_reserved_keyword: &R,
4006-
) -> bool
4007-
where
4008-
R: Fn(&Keyword, &mut Parser) -> bool,
4009-
{
3998+
reserved_keywords: Option<&[Keyword]>,
3999+
) -> bool {
4000+
let reserved_keywords = reserved_keywords.unwrap_or(keywords::RESERVED_FOR_COLUMN_ALIAS);
40104001
if !self.consume_token(&Token::Comma) {
40114002
true
40124003
} else if trailing_commas {
4013-
let token = self.next_token().token;
4014-
let is_end = match token {
4015-
Token::Word(ref kw) if is_reserved_keyword(&kw.keyword, self) => true,
4004+
let token = self.peek_token().token;
4005+
match token {
4006+
Token::Word(ref kw) if reserved_keywords.contains(&kw.keyword) => true,
40164007
Token::RParen | Token::SemiColon | Token::EOF | Token::RBracket | Token::RBrace => {
40174008
true
40184009
}
40194010
_ => false,
4020-
};
4021-
self.prev_token();
4022-
4023-
is_end
4011+
}
40244012
} else {
40254013
false
40264014
}
@@ -4029,44 +4017,34 @@ impl<'a> Parser<'a> {
40294017
/// Parse the comma of a comma-separated syntax element.
40304018
/// Returns true if there is a next element
40314019
fn is_parse_comma_separated_end(&mut self) -> bool {
4032-
self.is_parse_comma_separated_end_with_trailing_commas(
4033-
self.options.trailing_commas,
4034-
&Self::is_reserved_for_column_alias,
4035-
)
4020+
self.is_parse_comma_separated_end_with_trailing_commas(self.options.trailing_commas, None)
40364021
}
40374022

40384023
/// Parse a comma-separated list of 1+ items accepted by `F`
40394024
pub fn parse_comma_separated<T, F>(&mut self, f: F) -> Result<Vec<T>, ParserError>
40404025
where
40414026
F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
40424027
{
4043-
self.parse_comma_separated_with_trailing_commas(
4044-
f,
4045-
self.options.trailing_commas,
4046-
Self::is_reserved_for_column_alias,
4047-
)
4028+
self.parse_comma_separated_with_trailing_commas(f, self.options.trailing_commas, None)
40484029
}
40494030

4050-
/// Parse a comma-separated list of 1+ items accepted by `F`.
4051-
/// `R` is a predicate that should return true if the next
4052-
/// keyword is a reserved keyword.
4053-
/// Allows for control over trailing commas.
4054-
fn parse_comma_separated_with_trailing_commas<T, F, R>(
4031+
/// Parse a comma-separated list of 1+ items accepted by `F`
4032+
/// Allows for control over trailing commas
4033+
fn parse_comma_separated_with_trailing_commas<T, F>(
40554034
&mut self,
40564035
mut f: F,
40574036
trailing_commas: bool,
4058-
is_reserved_keyword: R,
4037+
reserved_keywords: Option<&[Keyword]>,
40594038
) -> Result<Vec<T>, ParserError>
40604039
where
40614040
F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
4062-
R: Fn(&Keyword, &mut Parser) -> bool,
40634041
{
40644042
let mut values = vec![];
40654043
loop {
40664044
values.push(f(self)?);
40674045
if self.is_parse_comma_separated_end_with_trailing_commas(
40684046
trailing_commas,
4069-
&is_reserved_keyword,
4047+
reserved_keywords,
40704048
) {
40714049
break;
40724050
}
@@ -4140,13 +4118,6 @@ impl<'a> Parser<'a> {
41404118
self.parse_comma_separated(f)
41414119
}
41424120

4143-
/// Default implementation of a predicate that returns true if
4144-
/// the specified keyword is reserved for column alias.
4145-
/// See [Dialect::is_column_alias]
4146-
fn is_reserved_for_column_alias(kw: &Keyword, parser: &mut Parser) -> bool {
4147-
!parser.dialect.is_column_alias(kw, parser)
4148-
}
4149-
41504121
/// Run a parser method `f`, reverting back to the current position if unsuccessful.
41514122
/// Returns `None` if `f` returns an error
41524123
pub fn maybe_parse<T, F>(&mut self, f: F) -> Result<Option<T>, ParserError>
@@ -9423,7 +9394,7 @@ impl<'a> Parser<'a> {
94239394
let cols = self.parse_comma_separated_with_trailing_commas(
94249395
Parser::parse_view_column,
94259396
self.dialect.supports_column_definition_trailing_commas(),
9426-
Self::is_reserved_for_column_alias,
9397+
None,
94279398
)?;
94289399
self.expect_token(&Token::RParen)?;
94299400
Ok(cols)

tests/sqlparser_bigquery.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -213,15 +213,6 @@ fn parse_raw_literal() {
213213
);
214214
}
215215

216-
#[test]
217-
fn parse_big_query_non_reserved_column_alias() {
218-
let sql = r#"SELECT OFFSET, EXPLAIN, ANALYZE, SORT, TOP, VIEW FROM T"#;
219-
bigquery().verified_stmt(sql);
220-
221-
let sql = r#"SELECT 1 AS OFFSET, 2 AS EXPLAIN, 3 AS ANALYZE FROM T"#;
222-
bigquery().verified_stmt(sql);
223-
}
224-
225216
#[test]
226217
fn parse_delete_statement() {
227218
let sql = "DELETE \"table\" WHERE 1";

tests/sqlparser_common.rs

Lines changed: 13 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -253,13 +253,8 @@ fn parse_insert_default_values() {
253253

254254
#[test]
255255
fn parse_insert_select_returning() {
256-
// Dialects that support `RETURNING` as a column identifier do
257-
// not support this syntax.
258-
let dialects =
259-
all_dialects_where(|d| !d.is_column_alias(&Keyword::RETURNING, &mut Parser::new(d)));
260-
261-
dialects.verified_stmt("INSERT INTO t SELECT 1 RETURNING 2");
262-
let stmt = dialects.verified_stmt("INSERT INTO t SELECT x RETURNING x AS y");
256+
verified_stmt("INSERT INTO t SELECT 1 RETURNING 2");
257+
let stmt = verified_stmt("INSERT INTO t SELECT x RETURNING x AS y");
263258
match stmt {
264259
Statement::Insert(Insert {
265260
returning: Some(ret),
@@ -6998,6 +6993,9 @@ fn parse_union_except_intersect_minus() {
69986993
verified_stmt("SELECT 1 EXCEPT SELECT 2");
69996994
verified_stmt("SELECT 1 EXCEPT ALL SELECT 2");
70006995
verified_stmt("SELECT 1 EXCEPT DISTINCT SELECT 1");
6996+
verified_stmt("SELECT 1 MINUS SELECT 2");
6997+
verified_stmt("SELECT 1 MINUS ALL SELECT 2");
6998+
verified_stmt("SELECT 1 MINUS DISTINCT SELECT 1");
70016999
verified_stmt("SELECT 1 INTERSECT SELECT 2");
70027000
verified_stmt("SELECT 1 INTERSECT ALL SELECT 2");
70037001
verified_stmt("SELECT 1 INTERSECT DISTINCT SELECT 1");
@@ -7016,13 +7014,6 @@ fn parse_union_except_intersect_minus() {
70167014
verified_stmt("SELECT 1 AS x, 2 AS y INTERSECT BY NAME SELECT 9 AS y, 8 AS x");
70177015
verified_stmt("SELECT 1 AS x, 2 AS y INTERSECT ALL BY NAME SELECT 9 AS y, 8 AS x");
70187016
verified_stmt("SELECT 1 AS x, 2 AS y INTERSECT DISTINCT BY NAME SELECT 9 AS y, 8 AS x");
7019-
7020-
// Dialects that support `MINUS` as column identifier
7021-
// do not support `MINUS` as a set operator.
7022-
let dialects = all_dialects_where(|d| !d.is_column_alias(&Keyword::MINUS, &mut Parser::new(d)));
7023-
dialects.verified_stmt("SELECT 1 MINUS SELECT 2");
7024-
dialects.verified_stmt("SELECT 1 MINUS ALL SELECT 2");
7025-
dialects.verified_stmt("SELECT 1 MINUS DISTINCT SELECT 1");
70267017
}
70277018

70287019
#[test]
@@ -7699,26 +7690,19 @@ fn parse_invalid_subquery_without_parens() {
76997690

77007691
#[test]
77017692
fn parse_offset() {
7702-
// Dialects that support `OFFSET` as column identifiers
7703-
// don't support this syntax.
7704-
let dialects =
7705-
all_dialects_where(|d| !d.is_column_alias(&Keyword::OFFSET, &mut Parser::new(d)));
7706-
77077693
let expect = Some(Offset {
77087694
value: Expr::Value(number("2")),
77097695
rows: OffsetRows::Rows,
77107696
});
7711-
let ast = dialects.verified_query("SELECT foo FROM bar OFFSET 2 ROWS");
7697+
let ast = verified_query("SELECT foo FROM bar OFFSET 2 ROWS");
77127698
assert_eq!(ast.offset, expect);
7713-
let ast = dialects.verified_query("SELECT foo FROM bar WHERE foo = 4 OFFSET 2 ROWS");
7699+
let ast = verified_query("SELECT foo FROM bar WHERE foo = 4 OFFSET 2 ROWS");
77147700
assert_eq!(ast.offset, expect);
7715-
let ast = dialects.verified_query("SELECT foo FROM bar ORDER BY baz OFFSET 2 ROWS");
7701+
let ast = verified_query("SELECT foo FROM bar ORDER BY baz OFFSET 2 ROWS");
77167702
assert_eq!(ast.offset, expect);
7717-
let ast =
7718-
dialects.verified_query("SELECT foo FROM bar WHERE foo = 4 ORDER BY baz OFFSET 2 ROWS");
7703+
let ast = verified_query("SELECT foo FROM bar WHERE foo = 4 ORDER BY baz OFFSET 2 ROWS");
77197704
assert_eq!(ast.offset, expect);
7720-
let ast =
7721-
dialects.verified_query("SELECT foo FROM (SELECT * FROM bar OFFSET 2 ROWS) OFFSET 2 ROWS");
7705+
let ast = verified_query("SELECT foo FROM (SELECT * FROM bar OFFSET 2 ROWS) OFFSET 2 ROWS");
77227706
assert_eq!(ast.offset, expect);
77237707
match *ast.body {
77247708
SetExpr::Select(s) => match only(s.from).relation {
@@ -7729,23 +7713,23 @@ fn parse_offset() {
77297713
},
77307714
_ => panic!("Test broke"),
77317715
}
7732-
let ast = dialects.verified_query("SELECT 'foo' OFFSET 0 ROWS");
7716+
let ast = verified_query("SELECT 'foo' OFFSET 0 ROWS");
77337717
assert_eq!(
77347718
ast.offset,
77357719
Some(Offset {
77367720
value: Expr::Value(number("0")),
77377721
rows: OffsetRows::Rows,
77387722
})
77397723
);
7740-
let ast = dialects.verified_query("SELECT 'foo' OFFSET 1 ROW");
7724+
let ast = verified_query("SELECT 'foo' OFFSET 1 ROW");
77417725
assert_eq!(
77427726
ast.offset,
77437727
Some(Offset {
77447728
value: Expr::Value(number("1")),
77457729
rows: OffsetRows::Row,
77467730
})
77477731
);
7748-
let ast = dialects.verified_query("SELECT 'foo' OFFSET 1");
7732+
let ast = verified_query("SELECT 'foo' OFFSET 1");
77497733
assert_eq!(
77507734
ast.offset,
77517735
Some(Offset {

0 commit comments

Comments
 (0)