@@ -9336,18 +9336,45 @@ impl<'a> Parser<'a> {
93369336 })
93379337 }
93389338
9339- /// Parse a parenthesized comma-separated list of unqualified, possibly quoted identifiers
9339+ /// Parses a parenthesized comma-separated list of unqualified, possibly quoted identifiers.
9340+ /// For example: `(col1, "col 2", ...)`
93409341 pub fn parse_parenthesized_column_list(
93419342 &mut self,
93429343 optional: IsOptional,
93439344 allow_empty: bool,
93449345 ) -> Result<Vec<Ident>, ParserError> {
9346+ self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| p.parse_identifier())
9347+ }
9348+
9349+ /// Parses a parenthesized comma-separated list of qualified, possibly quoted identifiers.
9350+ /// For example: `(db1.sc1.tbl1.col1, db1.sc1.tbl1."col 2", ...)`
9351+ pub fn parse_parenthesized_qualified_column_list(
9352+ &mut self,
9353+ optional: IsOptional,
9354+ allow_empty: bool,
9355+ ) -> Result<Vec<ObjectName>, ParserError> {
9356+ self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
9357+ p.parse_object_name(true)
9358+ })
9359+ }
9360+
9361+ /// Parses a parenthesized comma-separated list of columns using
9362+ /// the provided function to parse each element.
9363+ fn parse_parenthesized_column_list_inner<F, T>(
9364+ &mut self,
9365+ optional: IsOptional,
9366+ allow_empty: bool,
9367+ mut f: F,
9368+ ) -> Result<Vec<T>, ParserError>
9369+ where
9370+ F: FnMut(&mut Parser) -> Result<T, ParserError>,
9371+ {
93459372 if self.consume_token(&Token::LParen) {
93469373 if allow_empty && self.peek_token().token == Token::RParen {
93479374 self.next_token();
93489375 Ok(vec![])
93499376 } else {
9350- let cols = self.parse_comma_separated(|p| p.parse_identifier( ))?;
9377+ let cols = self.parse_comma_separated(|p| f(p ))?;
93519378 self.expect_token(&Token::RParen)?;
93529379 Ok(cols)
93539380 }
@@ -9358,7 +9385,7 @@ impl<'a> Parser<'a> {
93589385 }
93599386 }
93609387
9361- /// Parse a parenthesized comma-separated list of table alias column definitions.
9388+ /// Parses a parenthesized comma-separated list of table alias column definitions.
93629389 fn parse_table_alias_column_defs(&mut self) -> Result<Vec<TableAliasColumnDef>, ParserError> {
93639390 if self.consume_token(&Token::LParen) {
93649391 let cols = self.parse_comma_separated(|p| {
@@ -11853,7 +11880,7 @@ impl<'a> Parser<'a> {
1185311880 let constraint = self.parse_expr()?;
1185411881 Ok(JoinConstraint::On(constraint))
1185511882 } else if self.parse_keyword(Keyword::USING) {
11856- let columns = self.parse_parenthesized_column_list (Mandatory, false)?;
11883+ let columns = self.parse_parenthesized_qualified_column_list (Mandatory, false)?;
1185711884 Ok(JoinConstraint::Using(columns))
1185811885 } else {
1185911886 Ok(JoinConstraint::None)
0 commit comments