Skip to content

Commit 8c4ed1e

Browse files
committed
HHH-17335 Add array_get function
1 parent d5404fd commit 8c4ed1e

File tree

17 files changed

+350
-0
lines changed

17 files changed

+350
-0
lines changed

documentation/src/main/asciidoc/userguide/chapters/query/hql/QueryLanguage.adoc

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,6 +1123,11 @@ The following functions deal with SQL array types, which are not supported on ev
11231123
| `array_position()` | Determines the position of an element in an array
11241124
| `array_length()` | Determines the length of an array
11251125
| `array_concat()` | Concatenates array with each other in order
1126+
| `array_contains_all()` | Determines if one array holds all elements of another array
1127+
| `array_contains_all_nullable()` | Determines if one array holds all elements of another array, supporting null elements
1128+
| `array_contains_any()` | Determines if one array holds at least one element of another array
1129+
| `array_contains_any_nullable()` | Determines if one array holds at least one element of another array, supporting null elements
1130+
| `array_get()` | Accesses the element of an array by index
11261131
|===
11271132
11281133
===== `array()`
@@ -1241,6 +1246,20 @@ include::{array-example-dir-hql}/ArrayContainsAnyTest.java[tags=hql-array-contai
12411246
----
12421247
====
12431248
1249+
[[hql-array-get-functions]]
1250+
===== `array_get()`
1251+
1252+
Returns the element of an array at the given 1-based index. Returns `null` if either of the arguments is `null`,
1253+
and also if the index is bigger than the array length.
1254+
1255+
[[hql-array-get-example]]
1256+
====
1257+
[source, JAVA, indent=0]
1258+
----
1259+
include::{array-example-dir-hql}/ArrayGetTest.java[tags=hql-array-get-example]
1260+
----
1261+
====
1262+
12441263
[[hql-user-defined-functions]]
12451264
==== Native and user-defined functions
12461265

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/CockroachLegacyDialect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
472472
functionFactory.arrayContainsAny_operator();
473473
functionFactory.arrayContainsAllNullable_operator();
474474
functionFactory.arrayContainsAnyNullable_operator();
475+
functionFactory.arrayGet_bracket();
475476

476477
functionContributions.getFunctionRegistry().register(
477478
"trunc",

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/H2LegacyDialect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
380380
functionFactory.arrayContainsAny_h2();
381381
functionFactory.arrayContainsAllNullable_h2();
382382
functionFactory.arrayContainsAnyNullable_h2();
383+
functionFactory.arrayGet_h2();
383384
}
384385
else {
385386
// Use group_concat until 2.x as listagg was buggy

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/HSQLLegacyDialect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
258258
functionFactory.arrayContainsAny_hsql();
259259
functionFactory.arrayContainsAllNullable_hsql();
260260
functionFactory.arrayContainsAnyNullable_hsql();
261+
functionFactory.arrayGet_unnest();
261262
}
262263

263264
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/OracleLegacyDialect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
294294
functionFactory.arrayContainsAny_oracle();
295295
functionFactory.arrayContainsAllNullable_oracle();
296296
functionFactory.arrayContainsAnyNullable_oracle();
297+
functionFactory.arrayGet_oracle();
297298
}
298299

299300
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/PostgreSQLLegacyDialect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
592592
functionFactory.arrayContainsAny_operator();
593593
functionFactory.arrayContainsAllNullable_operator();
594594
functionFactory.arrayContainsAnyNullable_operator();
595+
functionFactory.arrayGet_bracket();
595596

596597
if ( getVersion().isSameOrAfter( 9, 4 ) ) {
597598
functionFactory.makeDateTimeTimestamp();

hibernate-core/src/main/java/org/hibernate/dialect/CockroachDialect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
459459
functionFactory.arrayContainsAny_operator();
460460
functionFactory.arrayContainsAllNullable_operator();
461461
functionFactory.arrayContainsAnyNullable_operator();
462+
functionFactory.arrayGet_bracket();
462463

463464
functionContributions.getFunctionRegistry().register(
464465
"trunc",

hibernate-core/src/main/java/org/hibernate/dialect/H2Dialect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
320320
functionFactory.arrayContainsAny_h2();
321321
functionFactory.arrayContainsAllNullable_h2();
322322
functionFactory.arrayContainsAnyNullable_h2();
323+
functionFactory.arrayGet_h2();
323324
}
324325

325326
@Override

hibernate-core/src/main/java/org/hibernate/dialect/HSQLDialect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
198198
functionFactory.arrayContainsAny_hsql();
199199
functionFactory.arrayContainsAllNullable_hsql();
200200
functionFactory.arrayContainsAnyNullable_hsql();
201+
functionFactory.arrayGet_unnest();
201202
}
202203

203204
@Override

hibernate-core/src/main/java/org/hibernate/dialect/OracleArrayJdbcType.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,22 @@ public void addAuxiliaryDatabaseObjects(
327327
false
328328
)
329329
);
330+
database.addAuxiliaryDatabaseObject(
331+
new NamedAuxiliaryDatabaseObject(
332+
arrayTypeName + "_get",
333+
database.getDefaultNamespace(),
334+
new String[]{
335+
"create or replace function " + arrayTypeName + "_get(arr in " + arrayTypeName +
336+
", idx in number) return " + getRawTypeName( elementType ) + " deterministic is begin " +
337+
"if arr is null or idx is null or arr.count < idx then return null; end if; " +
338+
"return arr(idx); " +
339+
"end;"
340+
},
341+
new String[] { "drop function " + arrayTypeName + "_get" },
342+
emptySet(),
343+
false
344+
)
345+
);
330346
}
331347

332348
protected String createOrReplaceConcatFunction(String arrayTypeName) {

0 commit comments

Comments
 (0)