AssertionError in DiscriminatorPathInterpretation when treating a path with the same subtype
Description
Attachments
1
- 09 Oct 2023, 07:52 PM
Activity
Show:
Andrea Boriero October 10, 2023 at 7:32 AM
Hi @Emond.Papegaaij ,
thanks for the reproducer.
Emond.Papegaaij October 9, 2023 at 8:00 PM
Once I found the real cause, it wasn’t hard to produce a test case. The issue is caused by a treat on a subselect that is already from the subtype. It might also fail in the same way on the root query, but this situation resembles our application the best. It fails on 6.2.12 and 6.3.1 with the following stacktrace:
java.lang.AssertionError
at org.hibernate.query.sqm.sql.internal.DiscriminatorPathInterpretation.from(DiscriminatorPathInterpretation.java:63)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.createTreatTypeRestriction(BaseSqmToSqlAstConverter.java:5231)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.createTreatTypeRestriction(BaseSqmToSqlAstConverter.java:5220)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.consumeAttributeJoin(BaseSqmToSqlAstConverter.java:3385)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.consumeExplicitJoin(BaseSqmToSqlAstConverter.java:3239)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.lambda$consumeExplicitJoins$42(BaseSqmToSqlAstConverter.java:3210)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at org.hibernate.query.sqm.tree.domain.AbstractSqmFrom.visitSqmJoins(AbstractSqmFrom.java:260)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.consumeExplicitJoins(BaseSqmToSqlAstConverter.java:3206)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.consumeExplicitJoins(BaseSqmToSqlAstConverter.java:3228)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.consumeJoins(BaseSqmToSqlAstConverter.java:2881)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.consumeFromClauseRoot(BaseSqmToSqlAstConverter.java:2820)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at org.hibernate.query.sqm.tree.from.SqmFromClause.visitRoots(SqmFromClause.java:80)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitFromClause(BaseSqmToSqlAstConverter.java:2571)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQuerySpec(BaseSqmToSqlAstConverter.java:2053)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQuerySpec(BaseSqmToSqlAstConverter.java:439)
at org.hibernate.query.sqm.tree.select.SqmQuerySpec.accept(SqmQuerySpec.java:125)
at org.hibernate.query.sqm.spi.BaseSemanticQueryWalker.visitQueryPart(BaseSemanticQueryWalker.java:218)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQueryPart(BaseSqmToSqlAstConverter.java:1913)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitSubQueryExpression(BaseSqmToSqlAstConverter.java:6790)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitSubQueryExpression(BaseSqmToSqlAstConverter.java:439)
at org.hibernate.query.sqm.tree.select.SqmSubQuery.accept(SqmSubQuery.java:684)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitInListPredicate(BaseSqmToSqlAstConverter.java:7730)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitInListPredicate(BaseSqmToSqlAstConverter.java:439)
at org.hibernate.query.sqm.tree.predicate.SqmInListPredicate.accept(SqmInListPredicate.java:147)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitWhereClause(BaseSqmToSqlAstConverter.java:2482)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQuerySpec(BaseSqmToSqlAstConverter.java:2059)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQuerySpec(BaseSqmToSqlAstConverter.java:439)
at org.hibernate.query.sqm.tree.select.SqmQuerySpec.accept(SqmQuerySpec.java:125)
at org.hibernate.query.sqm.spi.BaseSemanticQueryWalker.visitQueryPart(BaseSemanticQueryWalker.java:218)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQueryPart(BaseSqmToSqlAstConverter.java:1913)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitSelectStatement(BaseSqmToSqlAstConverter.java:1598)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitSelectStatement(BaseSqmToSqlAstConverter.java:439)
at org.hibernate.query.sqm.tree.select.SqmSelectStatement.accept(SqmSelectStatement.java:225)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.translate(BaseSqmToSqlAstConverter.java:775)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.buildCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:345)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:270)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:246)
at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:509)
at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:427)
at org.hibernate.query.Query.getResultList(Query.java:120)
at org.hibernate.bugs.JPAUnitTestCase.hhh16642Test(JPAUnitTestCase.java:54)
Andrea Boriero October 9, 2023 at 3:27 PM
Hi @Emond.Papegaaij,
can you please try if the issue still persists with Hibernate ORM 6.2.11 and in case can you provide a test case?
Thanks
When running our application with java assertions enabled, we trigger an
AssertionError
inDiscriminatorPathInterpretation
. With assertions disabled, the code runs fine. It seems this piece of code does not expect to see a class without subclasses. The entity it has problems with, is a subclass in a hierarchy with single table inheritance. The entity itself does not have any subclasses. I'm not 100% sure why this assertion is triggered, maybe the assertion is wrong orDiscriminatorPathInterpretation
should not have been used in this query.The resulting SQL query is below and it seems the
AssertionError
is triggered on the part in lines 30-43. Looking at our code, we do use Join.treat where it is not needed (the treat is the same type as the result of the join), but if this is not allowed, the error from Hibernate should IMHO reflect this.SELECT p1_0.id, p1_0.color, p1_0.createdat, p1_0.createdby, p1_0.derived, p1_0.enddate, p1_0.filename, p1_0.lastmodifiedat, p1_0.lastmodifiedby, p1_0.metadata, p1_0.NAME, p1_0.parent, p1_0.recordkey, p1_0.shareendtime, p1_0.url, p1_0.username, p1_0.uuid, p1_0.vault, p1_0.version, p1_0.warningperiod FROM vault_record p1_0 WHERE ( p1_0.vault IN ( ( SELECT p3_0.vault FROM khgroup p3_0 WHERE p3_0.id=?)) OR p1_0.vault IN ( ( SELECT v3_0.vault FROM client_application p4_0 JOIN vault_secrets v3_0 ON v3_0.id=p4_0.vaultsecrets AND p4_0.dtype='POAuth2Client' WHERE ( p4_0.id IN ( ( SELECT p5_0.client FROM group_client p5_0 WHERE p5_0.khgroup=?)) OR p4_0.id=?) AND p4_0.id=? AND p4_0.dtype='POAuth2Client'))) AND ( p1_0.vault IN ( ( SELECT v5_0.vault FROM client_application p6_0 JOIN vault_secrets v5_0 ON v5_0.id=p6_0.vaultsecrets WHERE p6_0.id=? AND p6_0.dtype='POAuth2Client')) OR p1_0.vault IN ( ( SELECT f1_0.vault FROM oauth2_client_permission p7_0 JOIN khgroup f1_0 ON f1_0.id=p7_0.forgroup WHERE p7_0.client=? AND p7_0.value=? AND p7_0.vaultsecret IS NOT NULL))) ORDER BY COALESCE( ( SELECT p8_0.NAME FROM khgroup p8_0, vault v9_0 WHERE v9_0.id=p1_0.vault AND p8_0.vault=p1_0.vault),''), CASE WHEN p1_0.color='GREEN' THEN 1 WHEN p1_0.color='RED' THEN 2 WHEN p1_0.color='BLUE' THEN 3 WHEN p1_0.color='DARK' THEN 4 WHEN p1_0.color='PINK_LAVENDER' THEN 5 WHEN p1_0.color='CRIMSON_RED' THEN 6 WHEN p1_0.color='MIDDLE_YELLOW' THEN 7 WHEN p1_0.color='ANDROID_GREEN' THEN 8 WHEN p1_0.color='SAGE' THEN 9 WHEN p1_0.color='ARTICHOKE' THEN 10 ELSE 2147483647 END, p1_0.NAME, p1_0.NAME, p1_0.id offset ? rowsFETCH first ? rows only