Skip to content

Commit 774b6fd

Browse files
committed
support array_sort([...] (, 'ASC'|'DESC') (, 'NULLS FIRST' | 'NULLS LAST'))
1 parent 578f85c commit 774b6fd

File tree

9 files changed

+101
-93
lines changed

9 files changed

+101
-93
lines changed

src/query/ast/src/ast/expr.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -882,14 +882,14 @@ impl Display for Expr {
882882
write!(f, "ARRAY_SORT(")?;
883883
write!(f, "{expr})")?;
884884
if *asc {
885-
write!(f, " , ASC")?;
885+
write!(f, " , 'ASC'")?;
886886
} else {
887-
write!(f, " , DESC")?;
887+
write!(f, " , 'DESC'")?;
888888
}
889889
if *null_first {
890-
write!(f, " , NULLS FIRST")?;
890+
write!(f, " , 'NULLS FIRST'")?;
891891
} else {
892-
write!(f, " , NULLS LAST")?;
892+
write!(f, " , 'NULLS LAST'")?;
893893
}
894894
write!(f, ")")?;
895895
}

src/query/ast/src/parser/expr.rs

+26-9
Original file line numberDiff line numberDiff line change
@@ -282,9 +282,9 @@ pub enum ExprElement {
282282
ArraySort {
283283
expr: Box<Expr>,
284284
// Optional `ASC` or `DESC`
285-
asc: Option<bool>,
285+
asc: Option<String>,
286286
// Optional `NULLS FIRST` or `NULLS LAST`
287-
nulls_first: Option<bool>,
287+
nulls_first: Option<String>,
288288
},
289289
Interval {
290290
expr: Expr,
@@ -474,9 +474,26 @@ impl<'a, I: Iterator<Item = WithSpan<'a, ExprElement>>> PrattParser<I> for ExprP
474474
asc,
475475
nulls_first,
476476
} => {
477-
let asc = if let Some(asc) = asc { asc } else { true };
477+
let asc = if let Some(asc) = asc {
478+
if asc.to_lowercase() == "asc" {
479+
true
480+
} else if asc.to_lowercase() == "desc" {
481+
false
482+
} else {
483+
return Err("Sorting order must be either ASC or DESC");
484+
}
485+
} else {
486+
true
487+
};
478488
let null_first = if let Some(nulls_first) = nulls_first {
479-
nulls_first
489+
let null_first = nulls_first.trim().to_lowercase();
490+
if null_first == "nulls first" {
491+
true
492+
} else if null_first == "nulls last" {
493+
false
494+
} else {
495+
return Err("Null sorting order must be either NULLS FIRST or NULLS LAST");
496+
}
480497
} else {
481498
true
482499
};
@@ -862,14 +879,14 @@ pub fn expr_element(i: Input) -> IResult<WithSpan<ExprElement>> {
862879
( ARRAY_SORT )
863880
~ "("
864881
~ #subexpr(0)
865-
~ ( "," ~ ( ASC | DESC ) )?
866-
~ ( "," ~ NULLS ~ ( FIRST | LAST ) )?
882+
~ ( "," ~ #literal_string )?
883+
~ ( "," ~ #literal_string )?
867884
~ ")"
868885
},
869886
|(_, _, expr, opt_asc, opt_null_first, _)| ExprElement::ArraySort {
870887
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),
888+
asc: opt_asc.map(|(_, asc)| asc),
889+
nulls_first: opt_null_first.map(|(_, first_last)| first_last),
873890
},
874891
);
875892
let date_add = map(
@@ -932,7 +949,7 @@ pub fn expr_element(i: Input) -> IResult<WithSpan<ExprElement>> {
932949
| #extract : "`EXTRACT((YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | SECOND) FROM ...)`"
933950
| #position : "`POSITION(... IN ...)`"
934951
| #substring : "`SUBSTRING(... [FROM ...] [FOR ...])`"
935-
| #array_sort : "`ARRAY_SORT([...], ASC | DESC, NULLS FIRST | LAST)`"
952+
| #array_sort : "`ARRAY_SORT([...], 'ASC' | 'DESC', 'NULLS FIRST' | 'NULLS LAST')`"
936953
| #trim : "`TRIM(...)`"
937954
| #trim_from : "`TRIM([(BOTH | LEADEING | TRAILING) ... FROM ...)`"
938955
),

src/query/ast/tests/it/parser.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -541,8 +541,8 @@ fn test_expr() {
541541
r#"substring(a from b for c)"#,
542542
r#"substring(a, b, c)"#,
543543
r#"array_sort([2])"#,
544-
r#"array_sort([2,0.1], ASC)"#,
545-
r#"array_sort([3,2], DESC, NULLS FIRST)"#,
544+
r#"array_sort([2,0.1], 'ASC')"#,
545+
r#"array_sort([3,2], 'DESC', 'NULLS FIRST')"#,
546546
r#"col1::UInt8"#,
547547
r#"(arr[0]:a).b"#,
548548
r#"arr[4]["k"]"#,

src/query/ast/tests/it/testdata/expr.txt

+7-7
Original file line numberDiff line numberDiff line change
@@ -1649,7 +1649,7 @@ Substring {
16491649
---------- Input ----------
16501650
array_sort([2])
16511651
---------- Output ---------
1652-
ARRAY_SORT([2]) , ASC , NULLS FIRST)
1652+
ARRAY_SORT([2]) , 'ASC' , 'NULLS FIRST')
16531653
---------- AST ------------
16541654
ArraySort {
16551655
span: Some(
@@ -1676,13 +1676,13 @@ ArraySort {
16761676

16771677

16781678
---------- Input ----------
1679-
array_sort([2,0.1], ASC)
1679+
array_sort([2,0.1], 'ASC')
16801680
---------- Output ---------
1681-
ARRAY_SORT([2, 0.1]) , ASC , NULLS FIRST)
1681+
ARRAY_SORT([2, 0.1]) , 'ASC' , 'NULLS FIRST')
16821682
---------- AST ------------
16831683
ArraySort {
16841684
span: Some(
1685-
0..24,
1685+
0..26,
16861686
),
16871687
expr: Array {
16881688
span: Some(
@@ -1713,13 +1713,13 @@ ArraySort {
17131713

17141714

17151715
---------- Input ----------
1716-
array_sort([3,2], DESC, NULLS FIRST)
1716+
array_sort([3,2], 'DESC', 'NULLS FIRST')
17171717
---------- Output ---------
1718-
ARRAY_SORT([3, 2]) , DESC , NULLS FIRST)
1718+
ARRAY_SORT([3, 2]) , 'DESC' , 'NULLS FIRST')
17191719
---------- AST ------------
17201720
ArraySort {
17211721
span: Some(
1722-
0..36,
1722+
0..40,
17231723
),
17241724
expr: Array {
17251725
span: Some(

src/query/functions/tests/it/scalars/array.rs

+13-12
Original file line numberDiff line numberDiff line change
@@ -485,34 +485,35 @@ fn test_array_any(file: &mut impl Write) {
485485
fn test_array_sort(file: &mut impl Write) {
486486
run_ast(file, "array_sort([])", &[]);
487487
run_ast(file, "array_sort(NULL)", &[]);
488-
run_ast(file, "array_sort([8, 20, 1, 2, 3, 4, 5, 6, 7], ASC)", &[]);
489-
run_ast(file, "array_sort([], ASC)", &[]);
490-
run_ast(file, "array_sort([], DESC)", &[]);
491-
run_ast(file, "array_sort([8, 20, 1, 2, 3, 4, 5, 6, 7], DESC)", &[]);
488+
run_ast(file, "array_sort([8, 20, 1, 2, 3, 4, 5, 6, 7], 'ASC')", &[]);
489+
run_ast(file, "array_sort([], 'ASC')", &[]);
490+
run_ast(file, "array_sort([], 'DESC')", &[]);
491+
run_ast(file, "array_sort([8, 20, 1, 2, 3, 4, 5, 6, 7], 'DESC')", &[
492+
]);
492493
run_ast(file, "array_sort([9.32, 0, 1.2, 3.4, 5.6, 7.8])", &[]);
493494
run_ast(file, "array_sort(['x', 0, 1.2, 3.4, 5.6, 7.8])", &[]);
494495
run_ast(
495496
file,
496-
"array_sort([1.2, NULL, 3.4, 5.6, '2.2', NULL], DESC, NULLS FIRST)",
497+
"array_sort([1.2, NULL, 3.4, 5.6, '2.2', NULL], 'DESC', 'NULLS FIRST')",
497498
&[],
498499
);
499-
run_ast(file, "array_sort([], DESC, NULLS FIRST)", &[]);
500+
run_ast(file, "array_sort([], 'DESC', 'NULLS FIRST')", &[]);
500501
run_ast(
501502
file,
502-
"array_sort([1.2, NULL, 3.4, 5.6, '2.2', NULL], DESC, NULLS LAST)",
503+
"array_sort([1.2, NULL, 3.4, 5.6, '2.2', NULL], 'DESC', 'NULLS LAST')",
503504
&[],
504505
);
505-
run_ast(file, "array_sort([], DESC, NULLS LAST)", &[]);
506+
run_ast(file, "array_sort([], 'DESC', 'NULLS LAST')", &[]);
506507
run_ast(
507508
file,
508-
"array_sort([1.2, NULL, 3.4, 5.6, '2.2', NULL], ASC, NULLS FIRST)",
509+
"array_sort([1.2, NULL, 3.4, 5.6, '2.2', NULL], 'ASC', 'NULLS FIRST')",
509510
&[],
510511
);
511-
run_ast(file, "array_sort([], ASC, NULLS FIRST)", &[]);
512+
run_ast(file, "array_sort([], 'ASC', 'NULLS FIRST')", &[]);
512513
run_ast(
513514
file,
514-
"array_sort(['z', 'a', NULL, 'v', 'd', NULL], ASC, NULLS LAST)",
515+
"array_sort(['z', 'a', NULL, 'v', 'd', NULL], 'ASC', 'NULLS LAST')",
515516
&[],
516517
);
517-
run_ast(file, "array_sort([], ASC, NULLS LAST)", &[]);
518+
run_ast(file, "array_sort([], 'ASC', 'NULLS LAST')", &[]);
518519
}

src/query/functions/tests/it/scalars/parser.rs

+5-8
Original file line numberDiff line numberDiff line change
@@ -285,14 +285,11 @@ pub fn transform_expr(ast: AExpr, columns: &[(&str, DataType)]) -> RawExpr {
285285
asc,
286286
null_first,
287287
} => {
288-
let name = if asc && null_first {
289-
"array_sort_asc_null_first".to_string()
290-
} else if asc && !null_first {
291-
"array_sort_asc_null_last".to_string()
292-
} else if !asc && null_first {
293-
"array_sort_desc_null_first".to_string()
294-
} else {
295-
"array_sort_desc_null_last".to_string()
288+
let name = match (asc, null_first) {
289+
(true, true) => "array_sort_asc_null_first".to_string(),
290+
(true, false) => "array_sort_asc_null_last".to_string(),
291+
(false, true) => "array_sort_desc_null_first".to_string(),
292+
(false, false) => "array_sort_desc_null_last".to_string(),
296293
};
297294
RawExpr::FunctionCall {
298295
span,

src/query/functions/tests/it/scalars/testdata/array.txt

+32-42
Original file line numberDiff line numberDiff line change
@@ -1578,34 +1578,15 @@ evaluation (internal):
15781578
+--------+-------------------------------------------------------------------------+
15791579

15801580

1581-
<<<<<<< HEAD
15821581
ast : array_any([])
15831582
raw expr : array_any(array())
15841583
checked expr : array_any<Array(Nothing)>(array<>())
15851584
optimized expr : NULL
15861585
output type : NULL
1587-
=======
1588-
ast : array_sort([])
1589-
raw expr : array_sort_asc_null_first(array())
1590-
checked expr : array_sort_asc_null_first<Array(Nothing)>(array<>())
1591-
optimized expr : [] :: Array(Nothing)
1592-
output type : Array(Nothing)
1593-
output domain : []
1594-
output : []
1595-
1596-
1597-
ast : array_sort(NULL)
1598-
raw expr : array_sort_asc_null_first(NULL)
1599-
checked expr : array_sort_asc_null_first<Array(Nothing) NULL>(CAST(NULL AS Array(Nothing) NULL))
1600-
optimized expr : NULL
1601-
output type : Array(Nothing) NULL
1602-
>>>>>>> support array_sort array_reverse_sort
16031586
output domain : {NULL}
16041587
output : NULL
16051588

16061589

1607-
<<<<<<< HEAD
1608-
<<<<<<< HEAD
16091590
ast : array_any([1, 2, 3])
16101591
raw expr : array_any(array(1_u8, 2_u8, 3_u8))
16111592
checked expr : array_any<Array(UInt8)>(array<T0=UInt8><T0, T0, T0>(1_u8, 2_u8, 3_u8))
@@ -1692,22 +1673,36 @@ evaluation (internal):
16921673
| d | NullableColumn { column: UInt64([4, 6, 5, 0]), validity: [0b____0111] } |
16931674
| Output | NullableColumn { column: UInt64([1, 2, 5, 4]), validity: [0b____1111] } |
16941675
+--------+-------------------------------------------------------------------------+
1695-
=======
1696-
ast : array_sort([8, 20, 1, 2, 3, 4, 5, 6, 7])
1697-
raw expr : array_sort(array(8_u8, 20_u8, 1_u8, 2_u8, 3_u8, 4_u8, 5_u8, 6_u8, 7_u8))
1698-
checked expr : array_sort<T0=UInt8><Array(T0)>(array<T0=UInt8><T0, T0, T0, T0, T0, T0, T0, T0, T0>(8_u8, 20_u8, 1_u8, 2_u8, 3_u8, 4_u8, 5_u8, 6_u8, 7_u8))
1699-
=======
1700-
ast : array_sort([8, 20, 1, 2, 3, 4, 5, 6, 7], ASC)
1676+
1677+
1678+
ast : array_sort([])
1679+
raw expr : array_sort_asc_null_first(array())
1680+
checked expr : array_sort_asc_null_first<Array(Nothing)>(array<>())
1681+
optimized expr : [] :: Array(Nothing)
1682+
output type : Array(Nothing)
1683+
output domain : []
1684+
output : []
1685+
1686+
1687+
ast : array_sort(NULL)
1688+
raw expr : array_sort_asc_null_first(NULL)
1689+
checked expr : array_sort_asc_null_first<Array(Nothing) NULL>(CAST(NULL AS Array(Nothing) NULL))
1690+
optimized expr : NULL
1691+
output type : Array(Nothing) NULL
1692+
output domain : {NULL}
1693+
output : NULL
1694+
1695+
1696+
ast : array_sort([8, 20, 1, 2, 3, 4, 5, 6, 7], 'ASC')
17011697
raw expr : array_sort_asc_null_first(array(8_u8, 20_u8, 1_u8, 2_u8, 3_u8, 4_u8, 5_u8, 6_u8, 7_u8))
17021698
checked expr : array_sort_asc_null_first<T0=UInt8><Array(T0)>(array<T0=UInt8><T0, T0, T0, T0, T0, T0, T0, T0, T0>(8_u8, 20_u8, 1_u8, 2_u8, 3_u8, 4_u8, 5_u8, 6_u8, 7_u8))
1703-
>>>>>>> support array_sort([...] (, ASC|DESC) (, NULLS FIRST|LAST))
17041699
optimized expr : [1, 2, 3, 4, 5, 6, 7, 8, 20]
17051700
output type : Array(UInt8)
17061701
output domain : [{1..=20}]
17071702
output : [1, 2, 3, 4, 5, 6, 7, 8, 20]
17081703

17091704

1710-
ast : array_sort([], ASC)
1705+
ast : array_sort([], 'ASC')
17111706
raw expr : array_sort_asc_null_first(array())
17121707
checked expr : array_sort_asc_null_first<Array(Nothing)>(array<>())
17131708
optimized expr : [] :: Array(Nothing)
@@ -1716,7 +1711,7 @@ output domain : []
17161711
output : []
17171712

17181713

1719-
ast : array_sort([], DESC)
1714+
ast : array_sort([], 'DESC')
17201715
raw expr : array_sort_desc_null_first(array())
17211716
checked expr : array_sort_desc_null_first<Array(Nothing)>(array<>())
17221717
optimized expr : [] :: Array(Nothing)
@@ -1725,7 +1720,7 @@ output domain : []
17251720
output : []
17261721

17271722

1728-
ast : array_sort([8, 20, 1, 2, 3, 4, 5, 6, 7], DESC)
1723+
ast : array_sort([8, 20, 1, 2, 3, 4, 5, 6, 7], 'DESC')
17291724
raw expr : array_sort_desc_null_first(array(8_u8, 20_u8, 1_u8, 2_u8, 3_u8, 4_u8, 5_u8, 6_u8, 7_u8))
17301725
checked expr : array_sort_desc_null_first<T0=UInt8><Array(T0)>(array<T0=UInt8><T0, T0, T0, T0, T0, T0, T0, T0, T0>(8_u8, 20_u8, 1_u8, 2_u8, 3_u8, 4_u8, 5_u8, 6_u8, 7_u8))
17311726
optimized expr : [20, 8, 7, 6, 5, 4, 3, 2, 1]
@@ -1752,7 +1747,7 @@ output domain : [Undefined]
17521747
output : [0, 1.2, 3.4, 5.6, 7.8, "x"]
17531748

17541749

1755-
ast : array_sort([1.2, NULL, 3.4, 5.6, '2.2', NULL], DESC, NULLS FIRST)
1750+
ast : array_sort([1.2, NULL, 3.4, 5.6, '2.2', NULL], 'DESC', 'NULLS FIRST')
17561751
raw expr : array_sort_desc_null_first(array(1.2_f64, NULL, 3.4_f64, 5.6_f64, "2.2", NULL))
17571752
checked expr : array_sort_desc_null_first<T0=Variant NULL><Array(T0)>(array<T0=Variant NULL><T0, T0, T0, T0, T0, T0>(CAST(1.2_f64 AS Variant NULL), CAST(NULL AS Variant NULL), CAST(3.4_f64 AS Variant NULL), CAST(5.6_f64 AS Variant NULL), CAST("2.2" AS Variant NULL), CAST(NULL AS Variant NULL)))
17581753
optimized expr : [NULL, NULL, "2.2", 5.6, 3.4, 1.2]
@@ -1761,7 +1756,7 @@ output domain : [Undefined ∪ {NULL}]
17611756
output : [NULL, NULL, "2.2", 5.6, 3.4, 1.2]
17621757

17631758

1764-
ast : array_sort([], DESC, NULLS FIRST)
1759+
ast : array_sort([], 'DESC', 'NULLS FIRST')
17651760
raw expr : array_sort_desc_null_first(array())
17661761
checked expr : array_sort_desc_null_first<Array(Nothing)>(array<>())
17671762
optimized expr : [] :: Array(Nothing)
@@ -1770,7 +1765,7 @@ output domain : []
17701765
output : []
17711766

17721767

1773-
ast : array_sort([1.2, NULL, 3.4, 5.6, '2.2', NULL], DESC, NULLS LAST)
1768+
ast : array_sort([1.2, NULL, 3.4, 5.6, '2.2', NULL], 'DESC', 'NULLS LAST')
17741769
raw expr : array_sort_desc_null_last(array(1.2_f64, NULL, 3.4_f64, 5.6_f64, "2.2", NULL))
17751770
checked expr : array_sort_desc_null_last<T0=Variant NULL><Array(T0)>(array<T0=Variant NULL><T0, T0, T0, T0, T0, T0>(CAST(1.2_f64 AS Variant NULL), CAST(NULL AS Variant NULL), CAST(3.4_f64 AS Variant NULL), CAST(5.6_f64 AS Variant NULL), CAST("2.2" AS Variant NULL), CAST(NULL AS Variant NULL)))
17761771
optimized expr : ["2.2", 5.6, 3.4, 1.2, NULL, NULL]
@@ -1779,7 +1774,7 @@ output domain : [Undefined ∪ {NULL}]
17791774
output : ["2.2", 5.6, 3.4, 1.2, NULL, NULL]
17801775

17811776

1782-
ast : array_sort([], DESC, NULLS LAST)
1777+
ast : array_sort([], 'DESC', 'NULLS LAST')
17831778
raw expr : array_sort_desc_null_last(array())
17841779
checked expr : array_sort_desc_null_last<Array(Nothing)>(array<>())
17851780
optimized expr : [] :: Array(Nothing)
@@ -1788,7 +1783,7 @@ output domain : []
17881783
output : []
17891784

17901785

1791-
ast : array_sort([1.2, NULL, 3.4, 5.6, '2.2', NULL], ASC, NULLS FIRST)
1786+
ast : array_sort([1.2, NULL, 3.4, 5.6, '2.2', NULL], 'ASC', 'NULLS FIRST')
17921787
raw expr : array_sort_asc_null_first(array(1.2_f64, NULL, 3.4_f64, 5.6_f64, "2.2", NULL))
17931788
checked expr : array_sort_asc_null_first<T0=Variant NULL><Array(T0)>(array<T0=Variant NULL><T0, T0, T0, T0, T0, T0>(CAST(1.2_f64 AS Variant NULL), CAST(NULL AS Variant NULL), CAST(3.4_f64 AS Variant NULL), CAST(5.6_f64 AS Variant NULL), CAST("2.2" AS Variant NULL), CAST(NULL AS Variant NULL)))
17941789
optimized expr : [NULL, NULL, 1.2, 3.4, 5.6, "2.2"]
@@ -1797,7 +1792,7 @@ output domain : [Undefined ∪ {NULL}]
17971792
output : [NULL, NULL, 1.2, 3.4, 5.6, "2.2"]
17981793

17991794

1800-
ast : array_sort([], ASC, NULLS FIRST)
1795+
ast : array_sort([], 'ASC', 'NULLS FIRST')
18011796
raw expr : array_sort_asc_null_first(array())
18021797
checked expr : array_sort_asc_null_first<Array(Nothing)>(array<>())
18031798
optimized expr : [] :: Array(Nothing)
@@ -1806,26 +1801,21 @@ output domain : []
18061801
output : []
18071802

18081803

1809-
ast : array_sort(['z', 'a', NULL, 'v', 'd', NULL], ASC, NULLS LAST)
1804+
ast : array_sort(['z', 'a', NULL, 'v', 'd', NULL], 'ASC', 'NULLS LAST')
18101805
raw expr : array_sort_asc_null_last(array("z", "a", NULL, "v", "d", NULL))
18111806
checked expr : array_sort_asc_null_last<T0=String NULL><Array(T0)>(array<T0=String NULL><T0, T0, T0, T0, T0, T0>(CAST("z" AS String NULL), CAST("a" AS String NULL), CAST(NULL AS String NULL), CAST("v" AS String NULL), CAST("d" AS String NULL), CAST(NULL AS String NULL)))
18121807
optimized expr : ["a", "d", "v", "z", NULL, NULL]
18131808
output type : Array(String NULL)
18141809
output domain : [{""..="z"} ∪ {NULL}]
1815-
<<<<<<< HEAD
1816-
output : ["z", "v", "d", "a", NULL, NULL]
1817-
>>>>>>> support array_sort array_reverse_sort
1818-
=======
18191810
output : ["a", "d", "v", "z", NULL, NULL]
18201811

18211812

1822-
ast : array_sort([], ASC, NULLS LAST)
1813+
ast : array_sort([], 'ASC', 'NULLS LAST')
18231814
raw expr : array_sort_asc_null_last(array())
18241815
checked expr : array_sort_asc_null_last<Array(Nothing)>(array<>())
18251816
optimized expr : [] :: Array(Nothing)
18261817
output type : Array(Nothing)
18271818
output domain : []
18281819
output : []
1829-
>>>>>>> support array_sort([...] (, ASC|DESC) (, NULLS FIRST|LAST))
18301820

18311821

0 commit comments

Comments
 (0)