@@ -366,6 +366,13 @@ pub struct Parser<'a> {
366366 failed_in_subquery_positions: BTreeMap<usize, Option<usize>>,
367367}
368368
369+ /// Whether an alias names a select item or a table.
370+ #[derive(Debug, Clone, Copy)]
371+ enum AliasKind {
372+ Column,
373+ Table,
374+ }
375+
369376/// Copy marker for a [`ParserError`] cached by the `parse_prefix` failure
370377/// memoization, so the caches hold no strings.
371378#[derive(Debug, Clone, Copy)]
@@ -1414,7 +1421,7 @@ impl<'a> Parser<'a> {
14141421 fn validator(explicit: bool, kw: &Keyword, _parser: &mut Parser) -> bool {
14151422 explicit || !&[Keyword::ASC, Keyword::DESC, Keyword::GROUP].contains(kw)
14161423 }
1417- let alias = self.parse_optional_alias_inner(None, validator)?;
1424+ let alias = self.parse_optional_alias_inner(None, AliasKind::Column, validator)?;
14181425 let order_by = OrderByOptions {
14191426 sort: self.parse_optional_order_by_sort(),
14201427 nulls_first: None,
@@ -13605,7 +13612,7 @@ impl<'a> Parser<'a> {
1360513612 fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
1360613613 parser.dialect.is_select_item_alias(explicit, kw, parser)
1360713614 }
13608- self.parse_optional_alias_inner(None, validator)
13615+ self.parse_optional_alias_inner(None, AliasKind::Column, validator)
1360913616 }
1361013617
1361113618 /// Optionally parses an alias for a table like in `... FROM generate_series(1, 10) AS t (col)`.
@@ -13616,7 +13623,7 @@ impl<'a> Parser<'a> {
1361613623 parser.dialect.is_table_factor_alias(explicit, kw, parser)
1361713624 }
1361813625 let explicit = self.peek_keyword(Keyword::AS);
13619- match self.parse_optional_alias_inner(None, validator)? {
13626+ match self.parse_optional_alias_inner(None, AliasKind::Table, validator)? {
1362013627 Some(name) => {
1362113628 let columns = self.parse_table_alias_column_defs()?;
1362213629 let at = if self.dialect.supports_partiql() && self.parse_keyword(Keyword::AT) {
@@ -13704,7 +13711,7 @@ impl<'a> Parser<'a> {
1370413711 fn validator(_explicit: bool, _kw: &Keyword, _parser: &mut Parser) -> bool {
1370513712 false
1370613713 }
13707- self.parse_optional_alias_inner(Some(reserved_kwds), validator)
13714+ self.parse_optional_alias_inner(Some(reserved_kwds), AliasKind::Column, validator)
1370813715 }
1370913716
1371013717 /// Parses an optional alias after a SQL element such as a select list item
@@ -13716,6 +13723,7 @@ impl<'a> Parser<'a> {
1371613723 fn parse_optional_alias_inner<F>(
1371713724 &mut self,
1371813725 reserved_kwds: Option<&[Keyword]>,
13726+ kind: AliasKind,
1371913727 validator: F,
1372013728 ) -> Result<Option<Ident>, ParserError>
1372113729 where
@@ -13739,7 +13747,14 @@ impl<'a> Parser<'a> {
1373913747 Token::Word(w) if validator(after_as, &w.keyword, self) => {
1374013748 Ok(Some(w.into_ident(next_token.span)))
1374113749 }
13742- Token::SingleQuotedString(s) if self.dialect.supports_string_literal_alias() => {
13750+ Token::SingleQuotedString(s)
13751+ if match kind {
13752+ AliasKind::Column => {
13753+ self.dialect.supports_string_literal_column_alias(after_as)
13754+ }
13755+ AliasKind::Table => self.dialect.supports_string_literal_table_alias(after_as),
13756+ } =>
13757+ {
1374313758 Ok(Some(Ident::with_quote('\'', s)))
1374413759 }
1374513760 Token::DoubleQuotedString(s) => Ok(Some(Ident::with_quote('\"', s))),
@@ -17883,7 +17898,7 @@ impl<'a> Parser<'a> {
1788317898 // ~ for a PIVOT aggregate function the alias must not be a "FOR"; in any dialect
1788417899 kw != &Keyword::FOR && parser.dialect.is_select_item_alias(explicit, kw, parser)
1788517900 }
17886- self.parse_optional_alias_inner(None, validator)?
17901+ self.parse_optional_alias_inner(None, AliasKind::Column, validator)?
1788717902 };
1788817903 Ok(ExprWithAlias { expr, alias })
1788917904 }
0 commit comments