@@ -278,6 +278,14 @@ pub enum ExprElement {
278
278
Array {
279
279
exprs : Vec < Expr > ,
280
280
} ,
281
+ /// ARRAY_SORT([1,2,3], ASC|DESC, NULLS FIRST|LAST)
282
+ ArraySort {
283
+ expr : Box < Expr > ,
284
+ // Optional `ASC` or `DESC`
285
+ asc : Option < bool > ,
286
+ // Optional `NULLS FIRST` or `NULLS LAST`
287
+ nulls_first : Option < bool > ,
288
+ } ,
281
289
Interval {
282
290
expr : Expr ,
283
291
unit : IntervalKind ,
@@ -461,6 +469,24 @@ impl<'a, I: Iterator<Item = WithSpan<'a, ExprElement>>> PrattParser<I> for ExprP
461
469
span : transform_span ( elem. span . 0 ) ,
462
470
exprs,
463
471
} ,
472
+ ExprElement :: ArraySort {
473
+ expr,
474
+ asc,
475
+ nulls_first,
476
+ } => {
477
+ let asc = if let Some ( asc) = asc { asc } else { true } ;
478
+ let null_first = if let Some ( nulls_first) = nulls_first {
479
+ nulls_first
480
+ } else {
481
+ true
482
+ } ;
483
+ Expr :: ArraySort {
484
+ span : transform_span ( elem. span . 0 ) ,
485
+ expr,
486
+ asc,
487
+ null_first,
488
+ }
489
+ }
464
490
ExprElement :: Interval { expr, unit } => Expr :: Interval {
465
491
span : transform_span ( elem. span . 0 ) ,
466
492
expr : Box :: new ( expr) ,
@@ -830,6 +856,22 @@ pub fn expr_element(i: Input) -> IResult<WithSpan<ExprElement>> {
830
856
ExprElement :: Array { exprs }
831
857
} ,
832
858
) ;
859
+ // ARRAY_SORT([...], ASC | DESC, NULLS FIRST | LAST)
860
+ let array_sort = map (
861
+ rule ! {
862
+ ( ARRAY_SORT )
863
+ ~ "("
864
+ ~ #subexpr( 0 )
865
+ ~ ( "," ~ ( ASC | DESC ) ) ?
866
+ ~ ( "," ~ NULLS ~ ( FIRST | LAST ) ) ?
867
+ ~ ")"
868
+ } ,
869
+ |( _, _, expr, opt_asc, opt_null_first, _) | ExprElement :: ArraySort {
870
+ expr : Box :: new ( expr) ,
871
+ asc : opt_asc. map ( |( _, asc) | asc. kind == ASC ) ,
872
+ nulls_first : opt_null_first. map ( |( _, _, first_last) | first_last. kind == FIRST ) ,
873
+ } ,
874
+ ) ;
833
875
let date_add = map (
834
876
rule ! {
835
877
DATE_ADD ~ "(" ~ #interval_kind ~ "," ~ #subexpr( 0 ) ~ "," ~ #subexpr( 0 ) ~ ")"
@@ -890,6 +932,7 @@ pub fn expr_element(i: Input) -> IResult<WithSpan<ExprElement>> {
890
932
| #extract : "`EXTRACT((YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | SECOND) FROM ...)`"
891
933
| #position : "`POSITION(... IN ...)`"
892
934
| #substring : "`SUBSTRING(... [FROM ...] [FOR ...])`"
935
+ | #array_sort : "`ARRAY_SORT([...], ASC | DESC, NULLS FIRST | LAST)`"
893
936
| #trim : "`TRIM(...)`"
894
937
| #trim_from : "`TRIM([(BOTH | LEADEING | TRAILING) ... FROM ...)`"
895
938
) ,
0 commit comments