Skip to content

Commit ff0fde1

Browse files
committed
fix HQL concatenation on Informix
1 parent 81d0c36 commit ff0fde1

File tree

2 files changed

+34
-17
lines changed

2 files changed

+34
-17
lines changed

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

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import org.hibernate.exception.spi.SQLExceptionConversionDelegate;
3030
import org.hibernate.query.sqm.CastType;
3131
import org.hibernate.query.sqm.IntervalType;
32+
import org.hibernate.query.sqm.function.SqmFunctionRegistry;
33+
import org.hibernate.type.BasicType;
3234
import org.hibernate.type.descriptor.jdbc.VarcharUUIDJdbcType;
3335
import org.hibernate.dialect.function.CaseLeastGreatestEmulation;
3436
import org.hibernate.dialect.function.CommonFunctionFactory;
@@ -63,7 +65,6 @@
6365
import org.hibernate.query.sqm.mutation.internal.temptable.LocalTemporaryTableMutationStrategy;
6466
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
6567
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
66-
import org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers;
6768
import org.hibernate.query.sqm.sql.SqmTranslator;
6869
import org.hibernate.query.sqm.sql.SqmTranslatorFactory;
6970
import org.hibernate.query.sqm.sql.StandardSqmTranslatorFactory;
@@ -98,6 +99,7 @@
9899
import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate;
99100
import static org.hibernate.internal.util.JdbcExceptionHelper.extractErrorCode;
100101
import static org.hibernate.query.sqm.produce.function.FunctionParameterType.STRING;
102+
import static org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers.impliedOrInvariant;
101103
import static org.hibernate.type.SqlTypes.BIGINT;
102104
import static org.hibernate.type.SqlTypes.BINARY;
103105
import static org.hibernate.type.SqlTypes.FLOAT;
@@ -332,7 +334,6 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
332334
functionFactory.initcap();
333335
functionFactory.yearMonthDay();
334336
functionFactory.ceiling_ceil();
335-
functionFactory.concat_pipeOperator();
336337
functionFactory.ascii();
337338
functionFactory.char_chr();
338339
functionFactory.addMonths();
@@ -341,29 +342,33 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
341342
functionFactory.variance();
342343
functionFactory.bitLength_pattern( "length(?1)*8" );
343344
functionFactory.varPop_sumCount();
344-
functionContributions.getFunctionRegistry()
345-
.registerAlternateKey( "var_samp", "variance" );
345+
346+
final SqmFunctionRegistry functionRegistry = functionContributions.getFunctionRegistry();
347+
final TypeConfiguration typeConfiguration = functionContributions.getTypeConfiguration();
348+
final BasicType<String> stringBasicType = typeConfiguration.getBasicTypeRegistry().resolve( StandardBasicTypes.STRING );
349+
350+
functionRegistry.registerAlternateKey( "var_samp", "variance" );
351+
352+
// the pipe operator or concat() function returns strings with trailing whitespace
353+
functionRegistry.patternDescriptorBuilder( "concat", "cast(?1||?2... as varchar(255))" )
354+
.setInvariantType( stringBasicType )
355+
.setMinArgumentCount( 1 )
356+
.setArgumentTypeResolver( impliedOrInvariant( typeConfiguration, STRING ) )
357+
.setArgumentListSignature( "(STRING string0[, STRING string1[, ...]])" )
358+
.register();
346359

347360
if ( getVersion().isSameOrAfter( 12 ) ) {
348361
functionFactory.locate_charindex();
349362
}
350363

351364
//coalesce() and nullif() both supported since Informix 12
352365

353-
functionContributions.getFunctionRegistry().register( "least", new CaseLeastGreatestEmulation( true ) );
354-
functionContributions.getFunctionRegistry().register( "greatest", new CaseLeastGreatestEmulation( false ) );
355-
functionContributions.getFunctionRegistry().namedDescriptorBuilder( "matches" )
356-
.setInvariantType( functionContributions.getTypeConfiguration()
357-
.getBasicTypeRegistry()
358-
.resolve( StandardBasicTypes.STRING )
359-
)
366+
functionRegistry.register( "least", new CaseLeastGreatestEmulation( true ) );
367+
functionRegistry.register( "greatest", new CaseLeastGreatestEmulation( false ) );
368+
functionRegistry.namedDescriptorBuilder( "matches" )
369+
.setInvariantType( stringBasicType )
360370
.setExactArgumentCount( 2 )
361-
.setArgumentTypeResolver(
362-
StandardFunctionArgumentTypeResolvers.impliedOrInvariant(
363-
functionContributions.getTypeConfiguration(),
364-
STRING
365-
)
366-
)
371+
.setArgumentTypeResolver( impliedOrInvariant( typeConfiguration, STRING ) )
367372
.setArgumentListSignature( "(STRING string, STRING pattern)" )
368373
.register();
369374
if ( supportsWindowFunctions() ) {
@@ -539,6 +544,12 @@ public boolean supportsIfExistsBeforeConstraintName() {
539544
return getVersion().isSameOrAfter( 11, 70 );
540545
}
541546

547+
@Override
548+
public boolean supportsTableCheck() {
549+
// multi-column check constraints are created using 'alter table'
550+
return false;
551+
}
552+
542553
@Override
543554
public String getCascadeConstraintsString() {
544555
return getVersion().isSameOrAfter( 12, 10 )

hibernate-testing/src/main/java/org/hibernate/testing/orm/junit/DialectFeatureChecks.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ public boolean apply(Dialect dialect) {
158158
}
159159
}
160160

161+
public static class SupportsTableCheck implements DialectFeatureCheck {
162+
public boolean apply(Dialect dialect) {
163+
return dialect.supportsTableCheck();
164+
}
165+
}
166+
161167
public static class SupportsNoColumnInsert implements DialectFeatureCheck {
162168
public boolean apply(Dialect dialect) {
163169
return dialect.supportsNoColumnsInsert();

0 commit comments

Comments
 (0)