Skip to content

Commit

Permalink
HHH-18765 - additional fix needed for the generic array_to_string fun…
Browse files Browse the repository at this point in the history
…ction

Signed-off-by: Jan Schatteman <[email protected]>
  • Loading branch information
jrenaat committed Oct 31, 2024
1 parent d730688 commit d537d62
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@ public ArrayToStringFunction(TypeConfiguration typeConfiguration) {
"array_to_string",
FunctionKind.NORMAL,
StandardArgumentsValidators.composite(
new ArgumentTypesValidator( StandardArgumentsValidators.between( 2, 3 ), ANY, STRING, ANY ),
new ArrayAndElementArgumentValidator( 0, 2 )
new ArgumentTypesValidator( StandardArgumentsValidators.between( 2, 3 ), ANY, STRING, ANY )
),
StandardFunctionReturnTypeResolvers.invariant(
typeConfiguration.getBasicTypeRegistry().resolve( StandardBasicTypes.STRING )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,13 @@ public void render(
arrayExpression.accept( walker );
sqlAppender.append( " is not null then coalesce((select listagg(" );
if ( defaultExpression != null ) {
sqlAppender.append( "coalesce(" );
sqlAppender.append( "coalesce(cast(" );
}
sqlAppender.append( "array_get(" );
arrayExpression.accept( walker );
sqlAppender.append(",i.idx)" );
if ( defaultExpression != null ) {
sqlAppender.append( "," );
sqlAppender.append( " as varchar2)," );
defaultExpression.accept( walker );
sqlAppender.append( ")" );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,11 @@ public void render(
arrayExpression.accept( walker );
sqlAppender.append( " is not null then coalesce((select group_concat(" );
if ( defaultExpression != null ) {
sqlAppender.append( "coalesce(" );
sqlAppender.append( "coalesce(cast(" );
}
sqlAppender.append( "t.val" );
if ( defaultExpression != null ) {
sqlAppender.append( "," );
sqlAppender.append( " as varchar)," );
defaultExpression.accept( walker );
sqlAppender.append( ")" );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import java.util.List;

import org.hibernate.dialect.HSQLDialect;
import org.hibernate.query.criteria.JpaCriteriaQuery;
import org.hibernate.query.criteria.JpaRoot;
import org.hibernate.query.sqm.NodeBuilder;
Expand All @@ -17,6 +18,7 @@
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.hibernate.testing.orm.junit.SkipForDialect;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -126,6 +128,8 @@ public void testCast(SessionFactoryScope scope) {
}

@Test
@SkipForDialect( dialectClass = HSQLDialect.class, majorVersion = 2, minorVersion = 7, microVersion = 2,
reason = "Needs at least 2.7.3 due to the change in HSQLArrayToStringFunction that introduced a cast")
public void testStr(SessionFactoryScope scope) {
scope.inSession( em -> {
List<String> results = em.createQuery( "select str(e.theArray) from EntityWithArrays e order by e.id", String.class )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import org.hibernate.dialect.OracleDialect;
import org.hibernate.dialect.PostgreSQLDialect;
import org.hibernate.testing.orm.junit.DialectFeatureChecks;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.Jira;
Expand Down Expand Up @@ -37,9 +38,17 @@ public void testBooleanArrayToStringFunction(SessionFactoryScope scope) {
);
scope.inTransaction(
session -> {
String expected = PostgreSQLDialect.class.isAssignableFrom( session.getDialect().getClass() ) ?
"f;f;null;t" : "false;false;null;true";

String s = session.createQuery( "select array_to_string(t.theBoolean, ';', 'null') "
+ "from TestEntity t", String.class ).getSingleResult();
Assertions.assertEquals("false;false;null;true", s);
Assertions.assertEquals(expected, s.toLowerCase());
// todo: review these other cases
// String s = session.createQuery( "select array_to_string(t.theBoolean, ';', null) "
// + "from TestEntity t", String.class ).getSingleResult();
// String s = session.createQuery( "select array_to_string(t.theBoolean, ';') "
// + "from TestEntity t", String.class ).getSingleResult();
}
);
scope.inTransaction(
Expand Down

0 comments on commit d537d62

Please sign in to comment.