Skip to content

Commit 1a5184e

Browse files
committed
HHH-17355 Add array_fill function
1 parent 6d392f5 commit 1a5184e

37 files changed

+521
-79
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
@@ -1135,6 +1135,7 @@ The following functions deal with SQL array types, which are not supported on ev
11351135
| `array_slice()` | Creates a sub-array of the based on lower and upper index
11361136
| `array_replace()` | Creates array copy replacing a given element with another
11371137
| `array_trim()` | Creates array copy trimming the last _N_ elements
1138+
| `array_fill()` | Creates array filled with the same element _N_ times
11381139
|===
11391140
11401141
===== `array()`
@@ -1399,6 +1400,19 @@ include::{array-example-dir-hql}/ArrayTrimTest.java[tags=hql-array-trim-example]
13991400
----
14001401
====
14011402
1403+
===== `array_fill()`
1404+
1405+
Creates an array filled with the same element _N_ times as specified by the arguments.
1406+
It is an error to supply an array length smaller than 0.
1407+
1408+
[[hql-array-fill-example]]
1409+
====
1410+
[source, JAVA, indent=0]
1411+
----
1412+
include::{array-example-dir-hql}/ArrayFillTest.java[tags=hql-array-fill-example]
1413+
----
1414+
====
1415+
14021416
[[hql-user-defined-functions]]
14031417
==== Native and user-defined functions
14041418

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
@@ -477,6 +477,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
477477
functionFactory.arraySlice_operator();
478478
functionFactory.arrayReplace();
479479
functionFactory.arrayTrim_trim_array();
480+
functionFactory.arrayFill_postgresql();
480481

481482
functionContributions.getFunctionRegistry().register(
482483
"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
@@ -385,6 +385,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
385385
functionFactory.arraySlice();
386386
functionFactory.arrayReplace_h2( getMaximumArraySize() );
387387
functionFactory.arrayTrim_trim_array();
388+
functionFactory.arrayFill_h2();
388389
}
389390
else {
390391
// 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
@@ -263,6 +263,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
263263
functionFactory.arraySlice_unnest();
264264
functionFactory.arrayReplace_unnest();
265265
functionFactory.arrayTrim_trim_array();
266+
functionFactory.arrayFill_hsql();
266267
}
267268

268269
@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
@@ -299,6 +299,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
299299
functionFactory.arraySlice_oracle();
300300
functionFactory.arrayReplace_oracle();
301301
functionFactory.arrayTrim_oracle();
302+
functionFactory.arrayFill_oracle();
302303
}
303304

304305
@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
@@ -597,6 +597,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
597597
functionFactory.arraySlice_operator();
598598
functionFactory.arrayReplace();
599599
functionFactory.arrayTrim_trim_array();
600+
functionFactory.arrayFill_postgresql();
600601

601602
if ( getVersion().isSameOrAfter( 9, 4 ) ) {
602603
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
@@ -464,6 +464,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
464464
functionFactory.arraySlice_operator();
465465
functionFactory.arrayReplace();
466466
functionFactory.arrayTrim_trim_array();
467+
functionFactory.arrayFill_postgresql();
467468

468469
functionContributions.getFunctionRegistry().register(
469470
"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
@@ -324,6 +324,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
324324
functionFactory.arraySlice();
325325
functionFactory.arrayReplace_h2( getMaximumArraySize() );
326326
functionFactory.arrayTrim_trim_array();
327+
functionFactory.arrayFill_h2();
327328
}
328329

329330
/**

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
203203
functionFactory.arraySlice_unnest();
204204
functionFactory.arrayReplace_unnest();
205205
functionFactory.arrayTrim_trim_array();
206+
functionFactory.arrayFill_hsql();
206207
}
207208

208209
@Override

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,28 @@ public void addAuxiliaryDatabaseObjects(
493493
false
494494
)
495495
);
496+
database.addAuxiliaryDatabaseObject(
497+
new NamedAuxiliaryDatabaseObject(
498+
arrayTypeName + "_fill",
499+
database.getDefaultNamespace(),
500+
new String[]{
501+
"create or replace function " + arrayTypeName + "_fill(elem in " + getRawTypeName( elementType ) +
502+
", elems number) return " + arrayTypeName + " deterministic is " +
503+
"res " + arrayTypeName + ":=" + arrayTypeName + "(); begin " +
504+
"if elems is null then return null; end if; " +
505+
"if elems<0 then raise_application_error (-20000, 'number of elements must be greater than or equal to 0'); end if;" +
506+
"for i in 1 .. elems loop " +
507+
"res.extend; " +
508+
"res(i) := elem; " +
509+
"end loop; " +
510+
"return res; " +
511+
"end;"
512+
},
513+
new String[] { "drop function " + arrayTypeName + "_fill" },
514+
emptySet(),
515+
false
516+
)
517+
);
496518
}
497519

498520
protected String createOrReplaceConcatFunction(String arrayTypeName) {

0 commit comments

Comments
 (0)