JPQL incorrect parsing

Description

In one specific situation the Hibernate fails to parse the JPQL query correctly. When there is "select" query with "left outer join" with "select size" on join part - the hiberante falls with "String index out of range: -5" exception.

I first encountered this with MSSQL database, and then succesfully reproduced the bug with HSQL database. I will attach to this issue a simple maven project that reproduces this bug.

The JPQL query, that makes hibernate fall looks like this:
"Select a, b.size from EntityA a left outer join a.entityBList b";

Strangely, if you change in that query "left outer join" to "join", it Hibernate stops from falling with exception.

Here is full stacktrace:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -5
at java.lang.String.substring(String.java:1875)
at org.hibernate.hql.internal.CollectionSubqueryFactory.createCollectionSubquery(CollectionSubqueryFactory.java:52)
at org.hibernate.hql.internal.ast.tree.FromElementType.toColumns(FromElementType.java:400)
at org.hibernate.hql.internal.ast.tree.FromElementType.toColumns(FromElementType.java:382)
at org.hibernate.hql.internal.ast.tree.FromElement.toColumns(FromElement.java:504)
at org.hibernate.hql.internal.ast.tree.DotNode.getColumns(DotNode.java:139)
at org.hibernate.hql.internal.ast.tree.DotNode.initText(DotNode.java:261)
at org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:255)
at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:126)
at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:121)
at org.hibernate.hql.internal.ast.tree.DotNode.resolveSelectExpression(DotNode.java:711)
at org.hibernate.hql.internal.ast.HqlSqlWalker.resolveSelectExpression(HqlSqlWalker.java:957)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:2248)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:2185)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1471)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:571)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:126)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:88)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:190)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1796)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:328)

Environment

None

Assignee

Gail Badner

Reporter

Tolmachov Dmitriy

Fix versions

None

backPortable

None

Suitable for new contributors

None

Requires Release Note

None

Pull Request

None

backportDecision

None

Components

Affects versions

Priority

Minor
Configure