Skip to content

Commit dcbb664

Browse files
VladoKurucbeikov
authored andcommitted
HHH-18369 Support Informix matches() function
1 parent b88be90 commit dcbb664

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import org.hibernate.query.sqm.mutation.internal.temptable.LocalTemporaryTableMutationStrategy;
5858
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
5959
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
60+
import org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers;
6061
import org.hibernate.query.sqm.sql.SqmTranslator;
6162
import org.hibernate.query.sqm.sql.SqmTranslatorFactory;
6263
import org.hibernate.query.sqm.sql.StandardSqmTranslatorFactory;
@@ -76,6 +77,7 @@
7677
import org.hibernate.tool.schema.internal.StandardTableExporter;
7778
import org.hibernate.tool.schema.spi.Exporter;
7879
import org.hibernate.type.JavaObjectType;
80+
import org.hibernate.type.StandardBasicTypes;
7981
import org.hibernate.type.descriptor.jdbc.ClobJdbcType;
8082
import org.hibernate.type.descriptor.jdbc.ObjectNullAsBinaryTypeJdbcType;
8183
import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry;
@@ -88,6 +90,7 @@
8890
import jakarta.persistence.TemporalType;
8991

9092
import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate;
93+
import static org.hibernate.query.sqm.produce.function.FunctionParameterType.STRING;
9194
import static org.hibernate.type.SqlTypes.BIGINT;
9295
import static org.hibernate.type.SqlTypes.BINARY;
9396
import static org.hibernate.type.SqlTypes.FLOAT;
@@ -333,7 +336,7 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
333336
functionFactory.stddev();
334337
functionFactory.variance();
335338
functionFactory.bitLength_pattern( "length(?1)*8" );
336-
339+
337340
if ( getVersion().isSameOrAfter( 12 ) ) {
338341
functionFactory.locate_charindex();
339342
}
@@ -342,6 +345,20 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
342345

343346
functionContributions.getFunctionRegistry().register( "least", new CaseLeastGreatestEmulation( true ) );
344347
functionContributions.getFunctionRegistry().register( "greatest", new CaseLeastGreatestEmulation( false ) );
348+
functionContributions.getFunctionRegistry().namedDescriptorBuilder( "matches" )
349+
.setInvariantType( functionContributions.getTypeConfiguration()
350+
.getBasicTypeRegistry()
351+
.resolve( StandardBasicTypes.STRING )
352+
)
353+
.setExactArgumentCount( 2 )
354+
.setArgumentTypeResolver(
355+
StandardFunctionArgumentTypeResolvers.impliedOrInvariant(
356+
functionContributions.getTypeConfiguration(),
357+
STRING
358+
)
359+
)
360+
.setArgumentListSignature( "(STRING string, STRING pattern)" )
361+
.register();
345362
if ( supportsWindowFunctions() ) {
346363
functionFactory.windowFunctions();
347364
}

hibernate-community-dialects/src/test/java/org/hibernate/community/dialect/InformixFunctionTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,23 @@ public void testCurrentTimestamp(SessionFactoryScope scope) {
179179
);
180180
}
181181

182+
@Test
183+
@JiraKey( value = "HHH-18369" )
184+
public void testMatches(SessionFactoryScope scope) {
185+
scope.inTransaction(
186+
(session) -> {
187+
String country = (String) session.createQuery(
188+
"select e.country " +
189+
"from Event e " +
190+
"where e.id = :id and matches(e.country, :country) = 'T'" )
191+
.setParameter( "id", event.id )
192+
.setParameter( "country", "R*" )
193+
.getSingleResult();
194+
assertEquals( "Romania", country );
195+
}
196+
);
197+
}
198+
182199
private Calendar todayCalendar() {
183200
Calendar calendar = Calendar.getInstance();
184201
calendar.set(Calendar.HOUR_OF_DAY, 0);

0 commit comments

Comments
 (0)