Skip to content

Commit 96e370f

Browse files
committed
HHH-18369 Support Informix matches() function
1 parent 4409b53 commit 96e370f

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import org.hibernate.query.sqm.mutation.internal.temptable.LocalTemporaryTableMutationStrategy;
6161
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
6262
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
63+
import org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers;
6364
import org.hibernate.query.sqm.sql.SqmTranslator;
6465
import org.hibernate.query.sqm.sql.SqmTranslatorFactory;
6566
import org.hibernate.query.sqm.sql.StandardSqmTranslatorFactory;
@@ -79,6 +80,7 @@
7980
import org.hibernate.tool.schema.internal.StandardTableExporter;
8081
import org.hibernate.tool.schema.spi.Exporter;
8182
import org.hibernate.type.JavaObjectType;
83+
import org.hibernate.type.StandardBasicTypes;
8284
import org.hibernate.type.descriptor.jdbc.ClobJdbcType;
8385
import org.hibernate.type.descriptor.jdbc.ObjectNullAsBinaryTypeJdbcType;
8486
import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry;
@@ -91,6 +93,7 @@
9193
import jakarta.persistence.TemporalType;
9294

9395
import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate;
96+
import static org.hibernate.query.sqm.produce.function.FunctionParameterType.STRING;
9497
import static org.hibernate.type.SqlTypes.BIGINT;
9598
import static org.hibernate.type.SqlTypes.BINARY;
9699
import static org.hibernate.type.SqlTypes.FLOAT;
@@ -349,6 +352,19 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
349352
}
350353
functionContributions.getFunctionRegistry().register( "least", new CaseLeastGreatestEmulation( true ) );
351354
functionContributions.getFunctionRegistry().register( "greatest", new CaseLeastGreatestEmulation( false ) );
355+
functionContributions.getFunctionRegistry().namedDescriptorBuilder( "matches" )
356+
.setInvariantType( functionContributions.getTypeConfiguration()
357+
.getBasicTypeRegistry()
358+
.resolve( StandardBasicTypes.STRING ) )
359+
.setExactArgumentCount( 2 )
360+
.setArgumentTypeResolver(
361+
StandardFunctionArgumentTypeResolvers.impliedOrInvariant(
362+
functionContributions.getTypeConfiguration(),
363+
STRING
364+
)
365+
)
366+
.setArgumentListSignature( "(STRING string, STRING length)" )
367+
.register();
352368
if ( supportsWindowFunctions() ) {
353369
functionFactory.windowFunctions();
354370
}

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
@@ -181,6 +181,23 @@ public void testCurrentTimestamp(SessionFactoryScope scope) {
181181
);
182182
}
183183

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

0 commit comments

Comments
 (0)