Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ public void validate(
for ( int elementIndex : elementIndexes ) {
if ( elementIndex < arguments.size() ) {
final SqmTypedNode<?> elementArgument = arguments.get( elementIndex );
final SqmExpressible<?> elementType = elementArgument.getExpressible().getSqmType();
final SqmExpressible<?> expressible = elementArgument.getExpressible();
final SqmExpressible<?> elementType = expressible != null ? expressible.getSqmType() : null;
if ( expectedElementType != null && elementType != null && expectedElementType != elementType ) {
throw new FunctionArgumentException(
String.format(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.util.List;

import org.hibernate.query.ReturnableType;
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
import org.hibernate.sql.ast.SqlAstTranslator;
import org.hibernate.sql.ast.spi.SqlAppender;
import org.hibernate.sql.ast.tree.SqlAstNode;
Expand Down Expand Up @@ -37,7 +38,7 @@ public void render(
sqlAppender.append( " is not null then coalesce((select t.idx from unnest(");
arrayExpression.accept( walker );
sqlAppender.append(") with ordinality t(val,idx) where t.val is not distinct from " );
elementExpression.accept( walker );
walker.render( elementExpression, SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER );
if ( sqlAstArguments.size() > 2 ) {
sqlAppender.append( " and t.idx>=" );
sqlAstArguments.get( 2 ).accept( walker );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.util.List;

import org.hibernate.query.ReturnableType;
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
import org.hibernate.sql.ast.SqlAstTranslator;
import org.hibernate.sql.ast.spi.SqlAppender;
import org.hibernate.sql.ast.tree.SqlAstNode;
Expand Down Expand Up @@ -37,7 +38,7 @@ public void render(
sqlAppender.append( " is not null then coalesce((select array_agg(t.idx) from unnest(");
arrayExpression.accept( walker );
sqlAppender.append(") with ordinality t(val,idx) where t.val is not distinct from " );
elementExpression.accept( walker );
walker.render( elementExpression, SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER );
sqlAppender.append( "),cast(array[] as integer array)) end" );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,18 @@ public void testPositionNull(SessionFactoryScope scope) {
} );
}

@Test
@Jira("https://hibernate.atlassian.net/browse/HHH-19490")
public void testPositionParam(SessionFactoryScope scope) {
scope.inSession( em -> {
List<EntityWithArrays> results = em.createQuery( "from EntityWithArrays e where array_position(e.theArray, ?1) = 1", EntityWithArrays.class )
.setParameter( 1, "abc" )
.getResultList();
assertEquals( 1, results.size() );
assertEquals( 2L, results.get( 0 ).getId() );
} );
}

@Test
@Jira("https://hibernate.atlassian.net/browse/HHH-17801")
public void testEnumPosition(SessionFactoryScope scope) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.hibernate.testing.orm.junit.BootstrapServiceRegistry;
import org.hibernate.testing.orm.junit.DialectFeatureChecks;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.Jira;
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
Expand Down Expand Up @@ -94,6 +95,20 @@ public void testPositionsNull(SessionFactoryScope scope) {
} );
}

@Test
@Jira("https://hibernate.atlassian.net/browse/HHH-19490")
public void testPositionsParam(SessionFactoryScope scope) {
scope.inSession( em -> {
List<int[]> results = em.createQuery( "select array_positions(e.theArray, ?1) from EntityWithArrays e order by e.id", int[].class )
.setParameter( 1, "abc" )
.getResultList();
assertEquals( 3, results.size() );
assertArrayEquals( new int[0], results.get( 0 ) );
assertArrayEquals( new int[]{ 1, 4 }, results.get( 1 ) );
assertNull( results.get( 2 ) );
} );
}

@Test
public void testPositionsList(SessionFactoryScope scope) {
scope.inSession( em -> {
Expand Down
Loading