Skip to content

Commit b8b8a87

Browse files
committed
HHH-17335 Add array_set function
1 parent 8c4ed1e commit b8b8a87

File tree

19 files changed

+477
-0
lines changed

19 files changed

+477
-0
lines changed

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,6 +1128,7 @@ The following functions deal with SQL array types, which are not supported on ev
11281128
| `array_contains_any()` | Determines if one array holds at least one element of another array
11291129
| `array_contains_any_nullable()` | Determines if one array holds at least one element of another array, supporting null elements
11301130
| `array_get()` | Accesses the element of an array by index
1131+
| `array_set()` | Creates array copy with given element at given index
11311132
|===
11321133
11331134
===== `array()`
@@ -1260,6 +1261,19 @@ include::{array-example-dir-hql}/ArrayGetTest.java[tags=hql-array-get-example]
12601261
----
12611262
====
12621263
1264+
[[hql-array-set-functions]]
1265+
===== `array_set()`
1266+
1267+
Returns an array copy with the given element placed at the given 1-based index, filling up prior slots with `null` if necessary.
1268+
1269+
[[hql-array-set-example]]
1270+
====
1271+
[source, JAVA, indent=0]
1272+
----
1273+
include::{array-example-dir-hql}/ArraySetTest.java[tags=hql-array-set-example]
1274+
----
1275+
====
1276+
12631277
[[hql-user-defined-functions]]
12641278
==== Native and user-defined functions
12651279

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
@@ -473,6 +473,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
473473
functionFactory.arrayContainsAllNullable_operator();
474474
functionFactory.arrayContainsAnyNullable_operator();
475475
functionFactory.arrayGet_bracket();
476+
functionFactory.arraySet_unnest();
476477

477478
functionContributions.getFunctionRegistry().register(
478479
"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
@@ -381,6 +381,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
381381
functionFactory.arrayContainsAllNullable_h2();
382382
functionFactory.arrayContainsAnyNullable_h2();
383383
functionFactory.arrayGet_h2();
384+
functionFactory.arraySet_h2();
384385
}
385386
else {
386387
// 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
@@ -259,6 +259,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
259259
functionFactory.arrayContainsAllNullable_hsql();
260260
functionFactory.arrayContainsAnyNullable_hsql();
261261
functionFactory.arrayGet_unnest();
262+
functionFactory.arraySet_hsql();
262263
}
263264

264265
@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
@@ -295,6 +295,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
295295
functionFactory.arrayContainsAllNullable_oracle();
296296
functionFactory.arrayContainsAnyNullable_oracle();
297297
functionFactory.arrayGet_oracle();
298+
functionFactory.arraySet_oracle();
298299
}
299300

300301
@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
@@ -593,6 +593,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
593593
functionFactory.arrayContainsAllNullable_operator();
594594
functionFactory.arrayContainsAnyNullable_operator();
595595
functionFactory.arrayGet_bracket();
596+
functionFactory.arraySet_unnest();
596597

597598
if ( getVersion().isSameOrAfter( 9, 4 ) ) {
598599
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
@@ -460,6 +460,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
460460
functionFactory.arrayContainsAllNullable_operator();
461461
functionFactory.arrayContainsAnyNullable_operator();
462462
functionFactory.arrayGet_bracket();
463+
functionFactory.arraySet_unnest();
463464

464465
functionContributions.getFunctionRegistry().register(
465466
"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
@@ -321,6 +321,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
321321
functionFactory.arrayContainsAllNullable_h2();
322322
functionFactory.arrayContainsAnyNullable_h2();
323323
functionFactory.arrayGet_h2();
324+
functionFactory.arraySet_h2();
324325
}
325326

326327
@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
@@ -199,6 +199,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
199199
functionFactory.arrayContainsAllNullable_hsql();
200200
functionFactory.arrayContainsAnyNullable_hsql();
201201
functionFactory.arrayGet_unnest();
202+
functionFactory.arraySet_hsql();
202203
}
203204

204205
@Override

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,36 @@ public void addAuxiliaryDatabaseObjects(
343343
false
344344
)
345345
);
346+
database.addAuxiliaryDatabaseObject(
347+
new NamedAuxiliaryDatabaseObject(
348+
arrayTypeName + "_set",
349+
database.getDefaultNamespace(),
350+
new String[]{
351+
"create or replace function " + arrayTypeName + "_set(arr in " + arrayTypeName +
352+
", idx in number, elem in " + getRawTypeName( elementType ) + ") return " + arrayTypeName + " deterministic is " +
353+
"res " + arrayTypeName + ":=" + arrayTypeName + "(); begin " +
354+
"if arr is not null then " +
355+
"for i in 1 .. arr.count loop " +
356+
"res.extend; " +
357+
"res(i) := arr(i); " +
358+
"end loop; " +
359+
"for i in arr.count+1 .. idx loop " +
360+
"res.extend; " +
361+
"end loop; " +
362+
"else " +
363+
"for i in 1 .. idx loop " +
364+
"res.extend; " +
365+
"end loop; " +
366+
"end if; " +
367+
"res(idx) := elem; " +
368+
"return res; " +
369+
"end;"
370+
},
371+
new String[] { "drop function " + arrayTypeName + "_set" },
372+
emptySet(),
373+
false
374+
)
375+
);
346376
}
347377

348378
protected String createOrReplaceConcatFunction(String arrayTypeName) {

0 commit comments

Comments
 (0)