NobiGo commented on code in PR #3320:
URL: https://github.com/apache/calcite/pull/3320#discussion_r1291249025
##########
core/src/main/java/org/apache/calcite/util/BuiltInMethod.java:
##########
@@ -658,6 +658,7 @@ public enum BuiltInMethod {
ARRAYS_OVERLAP(SqlFunctions.class, "arraysOverlap", List.class, List.class),
ARRAYS_ZIP(SqlFunctions.class, "arraysZip", List.class, List.class),
SORT_ARRAY(SqlFunctions.class, "sortArray", List.class, boolean.class),
+ ARRAY_INSERT(SqlFunctions.class, "arrayInsert", List.class, Integer.class,
Object.class),
Review Comment:
Put this line to
`https://github.com/apache/calcite/pull/3320/files#diff-5207c1dd4af072b3ecbebf9bf87ab0677171bd47309eda809013ef66ae9f77d6R655`.
Alphabetic order.
##########
site/_docs/reference.md:
##########
@@ -2658,6 +2658,7 @@ BigQuery's type system uses confusingly different names
for types and functions:
| s | ARRAY_CONTAINS(array, element) | Returns true if the
*array* contains the *element*
| s | ARRAY_DISTINCT(array) | Removes duplicate
values from the *array* that keeps ordering of elements
| s | ARRAY_EXCEPT(array1, array2) | Returns an array of the
elements in *array1* but not in *array2*, without duplicates
+| s | ARRAY_INSERT(array, pos, element) | Places *element* into
index *pos* of *array*. Array index start at 1, or start from the end if index
is negative. Index above array size appends the array, or prepends the array if
index is negative, with 'NULL' elements.
Review Comment:
Usually, We use `` to bracket the keyword. Like:
https://github.com/apache/calcite/pull/3320/files#diff-9cda2b29a1b9206e0daa6e6d722eb476575f83eadea1a6e302225afd08d9f0d2R2663
##########
core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java:
##########
@@ -4107,6 +4113,93 @@ public static List arrayExcept(List list1, List list2) {
return new ArrayList<>(result);
}
+ /** Support the ARRAY_INSERT function. */
+ public static @Nullable List arrayInsert(List baselist, Object pos, Object
val) {
+ if (baselist == null || pos == null) {
+ return null;
+ }
+ int posInt = (int) pos;
+ Object[] baseArray = baselist.toArray();
+ if (posInt == 0) {
+ throw new IllegalArgumentException("The index 0 is invalid. "
+ + "An index shall be either < 0 or > 0 (the first element has index
1)");
+ }
+
+ boolean usePositivePos = posInt > 0;
+
+ if (usePositivePos) {
+ int newArrayLength = Math.max(baseArray.length + 1, posInt);
+
+ if (newArrayLength > MAX_ARRAY_LENGTH) {
+ throw new IndexOutOfBoundsException(
+ String.format(Locale.ROOT, "The new array length %s exceeds the
allowed limit.",
+ newArrayLength));
+ }
+
+ Object[] newArray = new Object[newArrayLength];
+
+ int posIndex = posInt - 1;
+ if (posIndex < baseArray.length) {
+ System.arraycopy(baseArray, 0, newArray, 0, posIndex);
+ newArray[posIndex] = val;
+ System.arraycopy(baseArray, posIndex, newArray, posIndex + 1,
baseArray.length - posIndex);
+ } else {
+ System.arraycopy(baseArray, 0, newArray, 0, baseArray.length);
+ newArray[posIndex] = val;
+ }
+
+ return Arrays.asList(newArray);
+ } else {
+ int posIndex = posInt;
+
+ boolean newPosExtendsArrayLeft = baseArray.length + posIndex < 0;
+
+ if (newPosExtendsArrayLeft) {
+ // special case, if the new position is negative but larger than the
current array size
+ // place the new item at start of array, place the current array
contents at the end
+ // and fill the newly created array elements in middle with a null
+ int newArrayLength = -posIndex + 1;
Review Comment:
same question -posIndex maybe having a number overflow exception? Maybe we
can use:
`int newArrayLength = Integer.MAX_VALUE - (Integer.MAX_VALUE + posIndex);`
Then the next copy code will be :
`System.arraycopy(baseArray, 0, newArray, newArrayLength - baseArray.length
+ 1, baseArray.length);`
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]