This is an automated email from the ASF dual-hosted git repository.
xuzifu666 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new 073942c193 [CALCITE-7367] NULLS FIRST throws ClassCastException when
sorting arrays
073942c193 is described below
commit 073942c19377ef527892b0c2ecb2fa3f3a9f3db6
Author: Zhen Chen <[email protected]>
AuthorDate: Sat Jan 10 12:21:34 2026 +0800
[CALCITE-7367] NULLS FIRST throws ClassCastException when sorting arrays
---
core/src/test/resources/sql/sort.iq | 43 ++++++++++++++++++++++
.../apache/calcite/linq4j/function/Functions.java | 16 ++++++--
2 files changed, 55 insertions(+), 4 deletions(-)
diff --git a/core/src/test/resources/sql/sort.iq
b/core/src/test/resources/sql/sort.iq
index ce34c82d09..fb69970e41 100644
--- a/core/src/test/resources/sql/sort.iq
+++ b/core/src/test/resources/sql/sort.iq
@@ -422,4 +422,47 @@ select * from "hr"."emps" limit 3000000000 offset
2500000000;
java.lang.ArithmeticException: Integer overflow: 2500000000 is out of range
for INT
!error
+# [CALCITE-7367] NULLS FIRST throws ClassCastException when sorting arrays
+select * from
+(values
+ (2, array[null, 3]),
+ (3, array[3, 4]),
+ (1, array[1, 2]),
+ (4, array[4, 5]),
+ (5, cast(null as integer array))) as t(id, arr)
+order by arr nulls first;
++----+-----------+
+| ID | ARR |
++----+-----------+
+| 5 | |
+| 1 | [1, 2] |
+| 3 | [3, 4] |
+| 4 | [4, 5] |
+| 2 | [null, 3] |
++----+-----------+
+(5 rows)
+
+!ok
+
+select * from
+(values
+ (2, array[null, 3]),
+ (3, array[3, 4]),
+ (1, array[1, 2]),
+ (4, array[4, 5]),
+ (5, cast(null as integer array))) as t(id, arr)
+order by arr desc nulls first;
++----+-----------+
+| ID | ARR |
++----+-----------+
+| 5 | |
+| 2 | [null, 3] |
+| 4 | [4, 5] |
+| 3 | [3, 4] |
+| 1 | [1, 2] |
++----+-----------+
+(5 rows)
+
+!ok
+
# End sort.iq
diff --git
a/linq4j/src/main/java/org/apache/calcite/linq4j/function/Functions.java
b/linq4j/src/main/java/org/apache/calcite/linq4j/function/Functions.java
index 5f7aa258d4..73a06f42bd 100644
--- a/linq4j/src/main/java/org/apache/calcite/linq4j/function/Functions.java
+++ b/linq4j/src/main/java/org/apache/calcite/linq4j/function/Functions.java
@@ -537,8 +537,8 @@ private static final class SelectorEqualityComparer<T, T2>
/** Nulls first comparator. */
private static class NullsFirstComparator
- implements Comparator<Comparable>, Serializable {
- @Override public int compare(Comparable o1, Comparable o2) {
+ implements Comparator<Object>, Serializable {
+ @Override public int compare(@Nullable Object o1, @Nullable Object o2) {
if (o1 == o2) {
return 0;
}
@@ -548,8 +548,16 @@ private static class NullsFirstComparator
if (o2 == null) {
return 1;
}
- //noinspection unchecked
- return o1.compareTo(o2);
+ if (o1 instanceof Comparable && o2 instanceof Comparable) {
+ //noinspection unchecked
+ return ((Comparable) o1).compareTo(o2);
+ } else if (o1 instanceof List && o2 instanceof List) {
+ return compareLists((List<?>) o1, (List<?>) o2);
+ } else if (o1 instanceof Object[] && o2 instanceof Object[]) {
+ return compareObjectArrays((Object[]) o1, (Object[]) o2);
+ } else {
+ throw new IllegalArgumentException();
+ }
}
}