@@ -18083,7 +18083,32 @@ impl<'a> Parser<'a> {
1808318083 None
1808418084 };
1808518085
18086- let options = self.parse_order_by_options()?;
18086+ let using_operator = if !with_operator_class
18087+ && self.dialect.supports_order_by_using_operator()
18088+ && self.parse_keyword(Keyword::USING)
18089+ {
18090+ Some(self.parse_order_by_using_operator()?)
18091+ } else {
18092+ None
18093+ };
18094+
18095+ let options = if using_operator.is_some() {
18096+ if self
18097+ .peek_one_of_keywords(&[Keyword::ASC, Keyword::DESC])
18098+ .is_some()
18099+ {
18100+ return parser_err!(
18101+ "ASC/DESC cannot be used together with USING in ORDER BY".to_string(),
18102+ self.peek_token_ref().span.start
18103+ );
18104+ }
18105+ OrderByOptions {
18106+ asc: None,
18107+ nulls_first: self.parse_order_by_nulls_first_last(),
18108+ }
18109+ } else {
18110+ self.parse_order_by_options()?
18111+ };
1808718112
1808818113 let with_fill = if self.dialect.supports_with_fill()
1808918114 && self.parse_keywords(&[Keyword::WITH, Keyword::FILL])
@@ -18096,23 +18121,61 @@ impl<'a> Parser<'a> {
1809618121 Ok((
1809718122 OrderByExpr {
1809818123 expr,
18124+ using_operator,
1809918125 options,
1810018126 with_fill,
1810118127 },
1810218128 operator_class,
1810318129 ))
1810418130 }
1810518131
18106- fn parse_order_by_options (&mut self) -> Result<OrderByOptions , ParserError> {
18107- let asc = self.parse_asc_desc() ;
18132+ fn parse_order_by_using_operator (&mut self) -> Result<ObjectName , ParserError> {
18133+ let dialect = self.dialect ;
1810818134
18109- let nulls_first = if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
18135+ if self.parse_keyword(Keyword::OPERATOR) {
18136+ self.expect_token(&Token::LParen)?;
18137+ let operator_name = self.parse_operator_name()?;
18138+ let Some(last_part) = operator_name.0.last() else {
18139+ return self.expected_ref("an operator name", self.peek_token_ref());
18140+ };
18141+ let operator = last_part.to_string();
18142+ if operator.is_empty()
18143+ || !operator
18144+ .chars()
18145+ .all(|ch| dialect.is_custom_operator_part(ch))
18146+ {
18147+ return self.expected_ref("an operator name", self.peek_token_ref());
18148+ }
18149+ self.expect_token(&Token::RParen)?;
18150+ return Ok(operator_name);
18151+ }
18152+
18153+ let token = self.next_token();
18154+ let operator = token.token.to_string();
18155+ if !operator.is_empty()
18156+ && operator
18157+ .chars()
18158+ .all(|ch| dialect.is_custom_operator_part(ch))
18159+ {
18160+ Ok(ObjectName::from(vec![Ident::new(operator)]))
18161+ } else {
18162+ self.expected_ref("an ordering operator after USING", &token)
18163+ }
18164+ }
18165+
18166+ fn parse_order_by_nulls_first_last(&mut self) -> Option<bool> {
18167+ if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
1811018168 Some(true)
1811118169 } else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
1811218170 Some(false)
1811318171 } else {
1811418172 None
18115- };
18173+ }
18174+ }
18175+
18176+ fn parse_order_by_options(&mut self) -> Result<OrderByOptions, ParserError> {
18177+ let asc = self.parse_asc_desc();
18178+ let nulls_first = self.parse_order_by_nulls_first_last();
1811618179
1811718180 Ok(OrderByOptions { asc, nulls_first })
1811818181 }
@@ -20309,6 +20372,7 @@ mod tests {
2030920372 asc: None,
2031020373 nulls_first: None,
2031120374 },
20375+ using_operator: None,
2031220376 with_fill: None,
2031320377 },
2031420378 operator_class: None,
0 commit comments