Skip to content

Commit 31ecca5

Browse files
chanzxxxmbellade
authored andcommitted
HHH-19490 Fix NPE when using array_position on sql array type
Also fix hsqldb's param rendering
1 parent 90bf4f4 commit 31ecca5

File tree

5 files changed

+33
-3
lines changed

5 files changed

+33
-3
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentValidator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ public void validate(
3838
for ( int elementIndex : elementIndexes ) {
3939
if ( elementIndex < arguments.size() ) {
4040
final SqmTypedNode<?> elementArgument = arguments.get( elementIndex );
41-
final SqmExpressible<?> elementType = elementArgument.getExpressible().getSqmType();
41+
final SqmExpressible<?> expressible = elementArgument.getExpressible();
42+
final SqmExpressible<?> elementType = expressible != null ? expressible.getSqmType() : null;
4243
if ( expectedElementType != null && elementType != null && expectedElementType != elementType ) {
4344
throw new FunctionArgumentException(
4445
String.format(

hibernate-core/src/main/java/org/hibernate/dialect/function/array/HSQLArrayPositionFunction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.List;
1010

1111
import org.hibernate.query.ReturnableType;
12+
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
1213
import org.hibernate.sql.ast.SqlAstTranslator;
1314
import org.hibernate.sql.ast.spi.SqlAppender;
1415
import org.hibernate.sql.ast.tree.SqlAstNode;
@@ -37,7 +38,7 @@ public void render(
3738
sqlAppender.append( " is not null then coalesce((select t.idx from unnest(");
3839
arrayExpression.accept( walker );
3940
sqlAppender.append(") with ordinality t(val,idx) where t.val is not distinct from " );
40-
elementExpression.accept( walker );
41+
walker.render( elementExpression, SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER );
4142
if ( sqlAstArguments.size() > 2 ) {
4243
sqlAppender.append( " and t.idx>=" );
4344
sqlAstArguments.get( 2 ).accept( walker );

hibernate-core/src/main/java/org/hibernate/dialect/function/array/HSQLArrayPositionsFunction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.List;
1010

1111
import org.hibernate.query.ReturnableType;
12+
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
1213
import org.hibernate.sql.ast.SqlAstTranslator;
1314
import org.hibernate.sql.ast.spi.SqlAppender;
1415
import org.hibernate.sql.ast.tree.SqlAstNode;
@@ -37,7 +38,7 @@ public void render(
3738
sqlAppender.append( " is not null then coalesce((select array_agg(t.idx) from unnest(");
3839
arrayExpression.accept( walker );
3940
sqlAppender.append(") with ordinality t(val,idx) where t.val is not distinct from " );
40-
elementExpression.accept( walker );
41+
walker.render( elementExpression, SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER );
4142
sqlAppender.append( "),cast(array[] as integer array)) end" );
4243
}
4344
}

hibernate-core/src/test/java/org/hibernate/orm/test/function/array/ArrayPositionTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,18 @@ public void testPositionNull(SessionFactoryScope scope) {
8787
} );
8888
}
8989

90+
@Test
91+
@Jira("https://hibernate.atlassian.net/browse/HHH-19490")
92+
public void testPositionParam(SessionFactoryScope scope) {
93+
scope.inSession( em -> {
94+
List<EntityWithArrays> results = em.createQuery( "from EntityWithArrays e where array_position(e.theArray, ?1) = 1", EntityWithArrays.class )
95+
.setParameter( 1, "abc" )
96+
.getResultList();
97+
assertEquals( 1, results.size() );
98+
assertEquals( 2L, results.get( 0 ).getId() );
99+
} );
100+
}
101+
90102
@Test
91103
@Jira("https://hibernate.atlassian.net/browse/HHH-17801")
92104
public void testEnumPosition(SessionFactoryScope scope) {

hibernate-core/src/test/java/org/hibernate/orm/test/function/array/ArrayPositionsTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.hibernate.testing.orm.junit.BootstrapServiceRegistry;
1818
import org.hibernate.testing.orm.junit.DialectFeatureChecks;
1919
import org.hibernate.testing.orm.junit.DomainModel;
20+
import org.hibernate.testing.orm.junit.Jira;
2021
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
2122
import org.hibernate.testing.orm.junit.SessionFactory;
2223
import org.hibernate.testing.orm.junit.SessionFactoryScope;
@@ -94,6 +95,20 @@ public void testPositionsNull(SessionFactoryScope scope) {
9495
} );
9596
}
9697

98+
@Test
99+
@Jira("https://hibernate.atlassian.net/browse/HHH-19490")
100+
public void testPositionsParam(SessionFactoryScope scope) {
101+
scope.inSession( em -> {
102+
List<int[]> results = em.createQuery( "select array_positions(e.theArray, ?1) from EntityWithArrays e order by e.id", int[].class )
103+
.setParameter( 1, "abc" )
104+
.getResultList();
105+
assertEquals( 3, results.size() );
106+
assertArrayEquals( new int[0], results.get( 0 ) );
107+
assertArrayEquals( new int[]{ 1, 4 }, results.get( 1 ) );
108+
assertNull( results.get( 2 ) );
109+
} );
110+
}
111+
97112
@Test
98113
public void testPositionsList(SessionFactoryScope scope) {
99114
scope.inSession( em -> {

0 commit comments

Comments
 (0)