HHH-16699 promote repeat() function
emulate it on Oracle using rpad() unsupported on Derby
This commit is contained in:
parent
b2dfe7148a
commit
be2319b59c
|
@ -265,6 +265,7 @@ public class OracleDialect extends Dialect {
|
||||||
functionFactory.addMonths();
|
functionFactory.addMonths();
|
||||||
functionFactory.monthsBetween();
|
functionFactory.monthsBetween();
|
||||||
functionFactory.everyAny_minMaxCase();
|
functionFactory.everyAny_minMaxCase();
|
||||||
|
functionFactory.repeat_rpad();
|
||||||
|
|
||||||
functionFactory.radians_acos();
|
functionFactory.radians_acos();
|
||||||
functionFactory.degrees_acos();
|
functionFactory.degrees_acos();
|
||||||
|
|
|
@ -710,6 +710,15 @@ public class CommonFunctionFactory {
|
||||||
.register();
|
.register();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void repeat_rpad() {
|
||||||
|
functionRegistry.patternDescriptorBuilder( "repeat", "rpad(?1,?2*length(?1),?1)" )
|
||||||
|
.setInvariantType(stringType)
|
||||||
|
.setExactArgumentCount( 2 )
|
||||||
|
.setParameterTypes(STRING, INTEGER)
|
||||||
|
.setArgumentListSignature( "(STRING string, INTEGER times)" )
|
||||||
|
.register();
|
||||||
|
}
|
||||||
|
|
||||||
public void leftRight() {
|
public void leftRight() {
|
||||||
functionRegistry.namedDescriptorBuilder( "left" )
|
functionRegistry.namedDescriptorBuilder( "left" )
|
||||||
.setInvariantType(stringType)
|
.setInvariantType(stringType)
|
||||||
|
|
|
@ -709,6 +709,27 @@ public class FunctionTests {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsRepeat.class)
|
||||||
|
public void testRepeatFunction(SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
assertThat( session.createQuery("select repeat('hello', 3)", String.class).getSingleResult(),
|
||||||
|
is("hellohellohello") );
|
||||||
|
assertThat( session.createQuery("select repeat(?1, 3)", String.class)
|
||||||
|
.setParameter(1, "hello")
|
||||||
|
.getSingleResult(),
|
||||||
|
is("hellohellohello") );
|
||||||
|
//HSQLDB doesn't like the second parameter
|
||||||
|
// assertThat( session.createQuery("select repeat(?1, ?2)", String.class)
|
||||||
|
// .setParameter(1, "hello")
|
||||||
|
// .setParameter(2, 3)
|
||||||
|
// .getSingleResult(),
|
||||||
|
// is("hellohellohello") );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsReplace.class)
|
@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsReplace.class)
|
||||||
public void testReplaceFunction(SessionFactoryScope scope) {
|
public void testReplaceFunction(SessionFactoryScope scope) {
|
||||||
|
@ -716,8 +737,10 @@ public class FunctionTests {
|
||||||
session -> {
|
session -> {
|
||||||
session.createQuery("select replace(e.theString, 'hello', 'goodbye') from EntityOfBasics e", String.class)
|
session.createQuery("select replace(e.theString, 'hello', 'goodbye') from EntityOfBasics e", String.class)
|
||||||
.list();
|
.list();
|
||||||
assertThat( session.createQuery("select replace('hello world', 'hello', 'goodbye')", String.class).getSingleResult(), is("goodbye world") );
|
assertThat( session.createQuery("select replace('hello world', 'hello', 'goodbye')", String.class).getSingleResult(),
|
||||||
assertThat( session.createQuery("select replace('hello world', 'o', 'ooo')", String.class).getSingleResult(), is("hellooo wooorld") );
|
is("goodbye world") );
|
||||||
|
assertThat( session.createQuery("select replace('hello world', 'o', 'ooo')", String.class).getSingleResult(),
|
||||||
|
is("hellooo wooorld") );
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -318,6 +318,14 @@ abstract public class DialectFeatureChecks {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class SupportsRepeat implements DialectFeatureCheck {
|
||||||
|
public boolean apply(Dialect dialect) {
|
||||||
|
dialect = DialectDelegateWrapper.extractRealDialect( dialect );
|
||||||
|
// Derby doesn't support the `REPLACE` function
|
||||||
|
return !( dialect instanceof DerbyDialect );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static class SupportsTemporaryTable implements DialectFeatureCheck {
|
public static class SupportsTemporaryTable implements DialectFeatureCheck {
|
||||||
public boolean apply(Dialect dialect) {
|
public boolean apply(Dialect dialect) {
|
||||||
return dialect.supportsTemporaryTables();
|
return dialect.supportsTemporaryTables();
|
||||||
|
|
Loading…
Reference in New Issue