Skip to content

Commit 30ab52d

Browse files
committed
HHH-17386 Fix type inference source reset for top level predicates
1 parent 756f253 commit 30ab52d

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6866,9 +6866,7 @@ public CaseSearchedExpression visitSearchedCaseExpression(SqmCaseSearched<?> exp
68666866

68676867
Expression otherwise = null;
68686868
for ( SqmCaseSearched.WhenFragment<?> whenFragment : expression.getWhenFragments() ) {
6869-
inferrableTypeAccessStack.push( () -> null );
68706869
final Predicate whenPredicate = visitNestedTopLevelPredicate( whenFragment.getPredicate() );
6871-
inferrableTypeAccessStack.pop();
68726870
final MappingModelExpressible<?> alreadyKnown = resolved;
68736871
inferrableTypeAccessStack.push(
68746872
() -> alreadyKnown == null && inferenceSupplier != null ? inferenceSupplier.get() : alreadyKnown
@@ -7056,7 +7054,9 @@ public Predicate visitNestedTopLevelPredicate(SqmPredicate predicate) {
70567054
originalConjunctTableGroupTreatUsages = new IdentityHashMap<>( tableGroupEntityNameUses );
70577055
}
70587056
tableGroupEntityNameUses.clear();
7057+
inferrableTypeAccessStack.push( this::getBooleanType );
70597058
final Predicate result = (Predicate) predicate.accept( this );
7059+
inferrableTypeAccessStack.pop();
70607060
final Predicate finalPredicate = combinePredicates(
70617061
result,
70627062
consumeConjunctTreatTypeRestrictions()
@@ -7866,7 +7866,9 @@ private JdbcMappingContainer getBooleanType() {
78667866

78677867
@Override
78687868
public Object visitBooleanExpressionPredicate(SqmBooleanExpressionPredicate predicate) {
7869+
inferrableTypeAccessStack.push( this::getBooleanType );
78697870
final Expression booleanExpression = (Expression) predicate.getBooleanExpression().accept( this );
7871+
inferrableTypeAccessStack.pop();
78707872
if ( booleanExpression instanceof SelfRenderingExpression ) {
78717873
final Predicate sqlPredicate = new SelfRenderingPredicate( (SelfRenderingExpression) booleanExpression );
78727874
if ( predicate.isNegated() ) {
@@ -7895,11 +7897,10 @@ public Object visitBooleanExpressionPredicate(SqmBooleanExpressionPredicate pred
78957897

78967898
@Override
78977899
public Object visitExistsPredicate(SqmExistsPredicate predicate) {
7898-
return new ExistsPredicate(
7899-
(SelectStatement) predicate.getExpression().accept( this ),
7900-
predicate.isNegated(),
7901-
getBooleanType()
7902-
);
7900+
inferrableTypeAccessStack.push( () -> null );
7901+
final SelectStatement selectStatement = (SelectStatement) predicate.getExpression().accept( this );
7902+
inferrableTypeAccessStack.pop();
7903+
return new ExistsPredicate( selectStatement, predicate.isNegated(), getBooleanType() );
79037904
}
79047905

79057906
@Override

hibernate-core/src/test/java/org/hibernate/orm/test/hql/InferenceTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.hibernate.testing.SkipForDialect;
1414
import org.hibernate.testing.TestForIssue;
1515
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
16+
import org.hibernate.testing.orm.junit.JiraKey;
1617
import org.junit.Before;
1718
import org.junit.Test;
1819

@@ -61,6 +62,16 @@ public void testBinaryArithmeticInference() {
6162

6263
}
6364

65+
@Test
66+
@JiraKey("HHH-17386")
67+
public void testInferenceSourceResetForOnClause() {
68+
doInHibernate( this::sessionFactory, session -> {
69+
session.createQuery( "from Person p where p in (select p2 from Person p2 join Person p3 on exists (select 1 from Person p4))", Person.class )
70+
.getResultList();
71+
} );
72+
73+
}
74+
6475
@Entity(name = "Person")
6576
public static class Person {
6677

0 commit comments

Comments
 (0)