Skip to content

Commit 47f4af9

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 4abca25 commit 47f4af9

File tree

5 files changed

+34
-3
lines changed

5 files changed

+34
-3
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import java.util.List;
88

9+
import org.hibernate.query.sqm.SqmBindableType;
910
import org.hibernate.type.BindingContext;
1011
import org.hibernate.query.sqm.SqmExpressible;
1112
import org.hibernate.query.sqm.produce.function.ArgumentsValidator;
@@ -36,7 +37,8 @@ public void validate(
3637
for ( int elementIndex : elementIndexes ) {
3738
if ( elementIndex < arguments.size() ) {
3839
final SqmTypedNode<?> elementArgument = arguments.get( elementIndex );
39-
final SqmExpressible<?> elementType = elementArgument.getExpressible().getSqmType();
40+
final SqmBindableType<?> expressible = elementArgument.getExpressible();
41+
final SqmExpressible<?> elementType = expressible != null ? expressible.getSqmType() : null;
4042
if ( expectedElementType != null && elementType != null && expectedElementType != elementType ) {
4143
throw new FunctionArgumentException(
4244
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
@@ -7,6 +7,7 @@
77
import java.util.List;
88

99
import org.hibernate.metamodel.model.domain.ReturnableType;
10+
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
1011
import org.hibernate.sql.ast.SqlAstTranslator;
1112
import org.hibernate.sql.ast.spi.SqlAppender;
1213
import org.hibernate.sql.ast.tree.SqlAstNode;
@@ -35,7 +36,7 @@ public void render(
3536
sqlAppender.append( " is not null then coalesce((select t.idx from unnest(");
3637
arrayExpression.accept( walker );
3738
sqlAppender.append(") with ordinality t(val,idx) where t.val is not distinct from " );
38-
elementExpression.accept( walker );
39+
walker.render( elementExpression, SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER );
3940
if ( sqlAstArguments.size() > 2 ) {
4041
sqlAppender.append( " and t.idx>=" );
4142
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
@@ -7,6 +7,7 @@
77
import java.util.List;
88

99
import org.hibernate.metamodel.model.domain.ReturnableType;
10+
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
1011
import org.hibernate.sql.ast.SqlAstTranslator;
1112
import org.hibernate.sql.ast.spi.SqlAppender;
1213
import org.hibernate.sql.ast.tree.SqlAstNode;
@@ -35,7 +36,7 @@ public void render(
3536
sqlAppender.append( " is not null then coalesce((select array_agg(t.idx) from unnest(");
3637
arrayExpression.accept( walker );
3738
sqlAppender.append(") with ordinality t(val,idx) where t.val is not distinct from " );
38-
elementExpression.accept( walker );
39+
walker.render( elementExpression, SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER );
3940
sqlAppender.append( "),cast(array[] as integer array)) end" );
4041
}
4142
}

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
@@ -85,6 +85,18 @@ public void testPositionNull(SessionFactoryScope scope) {
8585
} );
8686
}
8787

88+
@Test
89+
@Jira("https://hibernate.atlassian.net/browse/HHH-19490")
90+
public void testPositionParam(SessionFactoryScope scope) {
91+
scope.inSession( em -> {
92+
List<EntityWithArrays> results = em.createQuery( "from EntityWithArrays e where array_position(e.theArray, ?1) = 1", EntityWithArrays.class )
93+
.setParameter( 1, "abc" )
94+
.getResultList();
95+
assertEquals( 1, results.size() );
96+
assertEquals( 2L, results.get( 0 ).getId() );
97+
} );
98+
}
99+
88100
@Test
89101
@Jira("https://hibernate.atlassian.net/browse/HHH-17801")
90102
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
@@ -15,6 +15,7 @@
1515
import org.hibernate.testing.orm.junit.BootstrapServiceRegistry;
1616
import org.hibernate.testing.orm.junit.DialectFeatureChecks;
1717
import org.hibernate.testing.orm.junit.DomainModel;
18+
import org.hibernate.testing.orm.junit.Jira;
1819
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
1920
import org.hibernate.testing.orm.junit.SessionFactory;
2021
import org.hibernate.testing.orm.junit.SessionFactoryScope;
@@ -93,6 +94,20 @@ public void testPositionsNull(SessionFactoryScope scope) {
9394
} );
9495
}
9596

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

0 commit comments

Comments
 (0)