From d45fa14fbece47cecf91d32caf7daa75a84c084b Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Fri, 18 Jul 2025 09:24:25 +0200 Subject: [PATCH] HHH-19621 Don't render code units for DB2 for i --- .../community/dialect/DB2iLegacyDialect.java | 10 ++++++++-- .../main/java/org/hibernate/dialect/DB2iDialect.java | 12 ++++++++++++ .../dialect/function/DB2SubstringFunction.java | 9 ++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DB2iLegacyDialect.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DB2iLegacyDialect.java index 94d2c3aed20a..c452a3b95fd4 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DB2iLegacyDialect.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DB2iLegacyDialect.java @@ -7,6 +7,7 @@ import org.hibernate.boot.model.FunctionContributions; import org.hibernate.dialect.DatabaseVersion; import org.hibernate.dialect.function.CommonFunctionFactory; +import org.hibernate.dialect.function.DB2SubstringFunction; import org.hibernate.dialect.identity.DB2IdentityColumnSupport; import org.hibernate.dialect.identity.DB2zIdentityColumnSupport; import org.hibernate.dialect.identity.IdentityColumnSupport; @@ -57,9 +58,14 @@ public DB2iLegacyDialect(DatabaseVersion version) { @Override public void initializeFunctionRegistry(FunctionContributions functionContributions) { - super.initializeFunctionRegistry(functionContributions); + super.initializeFunctionRegistry( functionContributions ); + // DB2 for i doesn't allow code units: https://www.ibm.com/docs/en/i/7.1.0?topic=functions-substring + functionContributions.getFunctionRegistry().register( + "substring", + new DB2SubstringFunction( false, functionContributions.getTypeConfiguration() ) + ); if ( getVersion().isSameOrAfter( 7, 2 ) ) { - CommonFunctionFactory functionFactory = new CommonFunctionFactory(functionContributions); + CommonFunctionFactory functionFactory = new CommonFunctionFactory( functionContributions ); functionFactory.listagg( null ); functionFactory.inverseDistributionOrderedSetAggregates(); functionFactory.hypotheticalOrderedSetAggregates_windowEmulation(); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/DB2iDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/DB2iDialect.java index f3172739b474..a019837b7a26 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/DB2iDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/DB2iDialect.java @@ -6,6 +6,8 @@ import jakarta.persistence.Timeout; import org.hibernate.Timeouts; +import org.hibernate.boot.model.FunctionContributions; +import org.hibernate.dialect.function.DB2SubstringFunction; import org.hibernate.dialect.identity.DB2IdentityColumnSupport; import org.hibernate.dialect.identity.DB2zIdentityColumnSupport; import org.hibernate.dialect.identity.IdentityColumnSupport; @@ -56,6 +58,16 @@ public DB2iDialect(DatabaseVersion version) { super(version); } + @Override + public void initializeFunctionRegistry(FunctionContributions functionContributions) { + super.initializeFunctionRegistry( functionContributions ); + // DB2 for i doesn't allow code units: https://www.ibm.com/docs/en/i/7.1.0?topic=functions-substring + functionContributions.getFunctionRegistry().register( + "substring", + new DB2SubstringFunction( false, functionContributions.getTypeConfiguration() ) + ); + } + @Override protected DatabaseVersion getMinimumSupportedVersion() { return MINIMUM_VERSION; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/DB2SubstringFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/DB2SubstringFunction.java index 8653831f64f0..1d8ca27519de 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/DB2SubstringFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/DB2SubstringFunction.java @@ -28,7 +28,13 @@ */ public class DB2SubstringFunction extends AbstractSqmSelfRenderingFunctionDescriptor { + private final boolean needsCodeUnit; + public DB2SubstringFunction(TypeConfiguration typeConfiguration) { + this( true, typeConfiguration ); + } + + public DB2SubstringFunction(boolean needsCodeUnit, TypeConfiguration typeConfiguration) { super( "substring", new ArgumentTypesValidator( StandardArgumentsValidators.between( 2, 4 ), STRING, INTEGER, INTEGER, FunctionParameterType.ANY ), @@ -36,6 +42,7 @@ public DB2SubstringFunction(TypeConfiguration typeConfiguration) { StandardBasicTypes.STRING ) ), StandardFunctionArgumentTypeResolvers.invariant( typeConfiguration, STRING, INTEGER, INTEGER ) ); + this.needsCodeUnit = needsCodeUnit; } @Override @@ -51,7 +58,7 @@ public void render( sqlAppender.appendSql( ',' ); arguments.get( i ).accept( walker ); } - if ( argumentCount != 4 ) { + if ( argumentCount != 4 && needsCodeUnit ) { sqlAppender.appendSql( ",codeunits32" ); } sqlAppender.appendSql( ')' );