diff --git a/src/parser/mod.rs b/src/parser/mod.rs index d00f28a55..4a8442e84 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -10309,7 +10309,7 @@ impl<'a> Parser<'a> { Expr::Wildcard => Ok(SelectItem::Wildcard( self.parse_wildcard_additional_options()?, )), - Expr::Identifier(v) if v.value.to_lowercase() == "from" => { + Expr::Identifier(v) if v.value.to_lowercase() == "from" && v.quote_style.is_none() => { parser_err!( format!("Expected an expression, found: {}", v), self.peek_token().location diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 1adda149e..d9622babd 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -8959,7 +8959,7 @@ fn parse_non_latin_identifiers() { #[test] fn parse_trailing_comma() { - // At the moment, Duck DB is the only dialect that allows + // At the moment, DuckDB is the only dialect that allows // trailing commas anywhere in the query let trailing_commas = TestedDialects { dialects: vec![Box::new(DuckDbDialect {})], @@ -8992,11 +8992,16 @@ fn parse_trailing_comma() { ); trailing_commas.verified_stmt("SELECT album_id, name FROM track"); - trailing_commas.verified_stmt("SELECT * FROM track ORDER BY milliseconds"); - trailing_commas.verified_stmt("SELECT DISTINCT ON (album_id) name FROM track"); + // check quoted "from" identifier edge-case + trailing_commas.one_statement_parses_to( + r#"SELECT "from", FROM "from""#, + r#"SELECT "from" FROM "from""#, + ); + trailing_commas.verified_stmt(r#"SELECT "from" FROM "from""#); + // doesn't allow any trailing commas let trailing_commas = TestedDialects { dialects: vec![Box::new(GenericDialect {})],