Skip to content

Commit dbffe16

Browse files
committed
HHH-19621 Don't render code units for DB2 for i
1 parent ba0eed7 commit dbffe16

File tree

3 files changed

+28
-3
lines changed

3 files changed

+28
-3
lines changed

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.hibernate.boot.model.FunctionContributions;
88
import org.hibernate.dialect.DatabaseVersion;
99
import org.hibernate.dialect.function.CommonFunctionFactory;
10+
import org.hibernate.dialect.function.DB2SubstringFunction;
1011
import org.hibernate.dialect.identity.DB2IdentityColumnSupport;
1112
import org.hibernate.dialect.identity.DB2zIdentityColumnSupport;
1213
import org.hibernate.dialect.identity.IdentityColumnSupport;
@@ -57,9 +58,14 @@ public DB2iLegacyDialect(DatabaseVersion version) {
5758

5859
@Override
5960
public void initializeFunctionRegistry(FunctionContributions functionContributions) {
60-
super.initializeFunctionRegistry(functionContributions);
61+
super.initializeFunctionRegistry( functionContributions );
62+
// DB2 for i doesn't allow code units: https://www.ibm.com/docs/en/i/7.1.0?topic=functions-substring
63+
functionContributions.getFunctionRegistry().register(
64+
"substring",
65+
new DB2SubstringFunction( false, functionContributions.getTypeConfiguration() )
66+
);
6167
if ( getVersion().isSameOrAfter( 7, 2 ) ) {
62-
CommonFunctionFactory functionFactory = new CommonFunctionFactory(functionContributions);
68+
CommonFunctionFactory functionFactory = new CommonFunctionFactory( functionContributions );
6369
functionFactory.listagg( null );
6470
functionFactory.inverseDistributionOrderedSetAggregates();
6571
functionFactory.hypotheticalOrderedSetAggregates_windowEmulation();

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import jakarta.persistence.Timeout;
88
import org.hibernate.Timeouts;
9+
import org.hibernate.boot.model.FunctionContributions;
10+
import org.hibernate.dialect.function.DB2SubstringFunction;
911
import org.hibernate.dialect.identity.DB2IdentityColumnSupport;
1012
import org.hibernate.dialect.identity.DB2zIdentityColumnSupport;
1113
import org.hibernate.dialect.identity.IdentityColumnSupport;
@@ -56,6 +58,16 @@ public DB2iDialect(DatabaseVersion version) {
5658
super(version);
5759
}
5860

61+
@Override
62+
public void initializeFunctionRegistry(FunctionContributions functionContributions) {
63+
super.initializeFunctionRegistry( functionContributions );
64+
// DB2 for i doesn't allow code units: https://www.ibm.com/docs/en/i/7.1.0?topic=functions-substring
65+
functionContributions.getFunctionRegistry().register(
66+
"substring",
67+
new DB2SubstringFunction( false, functionContributions.getTypeConfiguration() )
68+
);
69+
}
70+
5971
@Override
6072
protected DatabaseVersion getMinimumSupportedVersion() {
6173
return MINIMUM_VERSION;

hibernate-core/src/main/java/org/hibernate/dialect/function/DB2SubstringFunction.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,21 @@
2828
*/
2929
public class DB2SubstringFunction extends AbstractSqmSelfRenderingFunctionDescriptor {
3030

31+
private final boolean needsCodeUnit;
32+
3133
public DB2SubstringFunction(TypeConfiguration typeConfiguration) {
34+
this( true, typeConfiguration );
35+
}
36+
37+
public DB2SubstringFunction(boolean needsCodeUnit, TypeConfiguration typeConfiguration) {
3238
super(
3339
"substring",
3440
new ArgumentTypesValidator( StandardArgumentsValidators.between( 2, 4 ), STRING, INTEGER, INTEGER, FunctionParameterType.ANY ),
3541
StandardFunctionReturnTypeResolvers.invariant( typeConfiguration.getBasicTypeRegistry().resolve(
3642
StandardBasicTypes.STRING ) ),
3743
StandardFunctionArgumentTypeResolvers.invariant( typeConfiguration, STRING, INTEGER, INTEGER )
3844
);
45+
this.needsCodeUnit = needsCodeUnit;
3946
}
4047

4148
@Override
@@ -51,7 +58,7 @@ public void render(
5158
sqlAppender.appendSql( ',' );
5259
arguments.get( i ).accept( walker );
5360
}
54-
if ( argumentCount != 4 ) {
61+
if ( argumentCount != 4 && needsCodeUnit ) {
5562
sqlAppender.appendSql( ",codeunits32" );
5663
}
5764
sqlAppender.appendSql( ')' );

0 commit comments

Comments
 (0)