]
Dmitry Geraskov resolved JBIDE-12297.
-------------------------------------
Resolution: Won't Fix
Infinite loop in JPA Validator with HQL syntax Query
----------------------------------------------------
Key: JBIDE-12297
URL:
https://issues.jboss.org/browse/JBIDE-12297
Project: Tools (JBoss Tools)
Issue Type: Bug
Components: hibernate, UpStream
Affects Versions: 3.4.0.M1
Environment: eclipse-jee-juno released
jboss-tools nightly build 3.4.0.v20120706-1104-H5102-M1
Reporter: Ian Carr
Assignee: Dmitry Geraskov
Fix For: 3.4.x
Expect to get a warning about the (invalid) HQL syntax. Actually behaviour makes eclipse
unresponsive.
An Infinite loop in JPA AbstractExpression parse method when using hibernate syntax
FromClause.
wordParser contains the text: OUTER JOIN gr.client clnt WITH clnt.clientId = :clientId
WHERE ro.ownerId = :ownerId
Uses the hibernate WITH clause.
Eclipse becomes unresponsive and has high CPU usage.
breaking the running instance and checking paused threads get a loop around the following
stack trace:
Thread [Worker-3] (Suspended)
FromClause(AbstractExpression).parse(WordParser, String, boolean) line: 748
FromClause(AbstractFromClause).parse(WordParser, boolean) line: 191
SelectStatement(AbstractSelectStatement).parse(WordParser, boolean) line: 348
SelectStatement.parse(WordParser, boolean) line: 238
SelectStatementFactory.buildExpression(AbstractExpression, WordParser, String,
JPQLQueryBNF, AbstractExpression, boolean) line: 55
JPQLExpression(AbstractExpression).parse(WordParser, String, ExpressionFactory,
JPQLQueryBNF, AbstractExpression, boolean) line: 983
JPQLExpression(AbstractExpression).parseSingleExpression(WordParser, String, boolean)
line: 1004
JPQLExpression.parse(WordParser, boolean) line: 307
JPQLExpression.<init>(CharSequence, JPQLGrammar, String, boolean) line: 129
JPQLExpression.<init>(CharSequence, JPQLGrammar, boolean) line: 91
DefaultJPQLQueryContext(JPQLQueryContext).initializeRoot() line: 700
DefaultJPQLQueryContext(JPQLQueryContext).setQuery(IQuery) line: 808
GenericJpaJpqlQueryHelper(AbstractJPQLQueryHelper).setQuery(IQuery) line: 435
GenericJpaJpqlQueryHelper(JpaJpqlQueryHelper).setQuery(NamedQuery, String) line: 223
GenericJpaJpqlQueryHelper(JpaJpqlQueryHelper).validate(NamedQuery, String, TextRange,
int, List<IMessage>) line: 270
GenericJavaNamedQuery2_0.validateQuery_(JpaJpqlQueryHelper, List<IMessage>,
IReporter) line: 112
GenericJavaNamedQuery2_0(AbstractJavaQuery<A>).validateQuery(JpaJpqlQueryHelper,
List<IMessage>, IReporter, CompilationUnit) line: 226
GenericJavaNamedQuery2_0(AbstractJavaQuery<A>).validate(JpaJpqlQueryHelper,
List<IMessage>, IReporter, CompilationUnit) line: 197
GenericPersistenceUnit(AbstractPersistenceUnit).validate(Query, JpaJpqlQueryHelper,
List<IMessage>, IReporter) line: 2615
GenericPersistenceUnit(AbstractPersistenceUnit).validateQueries(List<IMessage>,
IReporter) line: 2559
GenericPersistenceUnit(AbstractPersistenceUnit).validate(List<IMessage>,
IReporter) line: 2249
GenericPersistence.validatePersistenceUnit(List<IMessage>, IReporter) line: 320
GenericPersistence.validate(List<IMessage>, IReporter) line: 272
GenericPersistenceXml.validate(List<IMessage>, IReporter) line: 281
GenericRootContextNode.validate(List<IMessage>, IReporter) line: 244
GenericJpaProject(AbstractJpaProject).validate(List<IMessage>, IReporter) line:
1491
GenericJpaProject(AbstractJpaProject).getValidationMessages(IReporter) line: 1481
InternalJpaProjectManager.buildValidationMessages_(IProject, IReporter) line: 553
InternalJpaProjectManager$BuildValidationMessagesCommand.execute() line: 542
CommandJobCommandAdapter.execute(IProgressMonitor) line: 39
JobCommandJob.run(IProgressMonitor) line: 42
Worker.run() line: 54
Class being parsed looks like:
@Entity
@Table(name="ResourceOwner")
@NamedQueries({
// NB: This is an HQL query as it uses the Hibernate conditional JOIN syntax ie WITH
condition
@NamedQuery(name = "FindResourceOwnerAndGrantsForROIdandClientId",
query = "SELECT ro,gr FROM ResourceOwner ro LEFT OUTER JOIN ro.grants gr LEFT
OUTER JOIN gr.client clnt WITH clnt.clientId = :clientId WHERE ro.ownerId =
:ownerId"),
@NamedQuery(name = "FindResourceOwnerAndGrantsForROIdandClientIdAndScopes",
query = "SELECT ro,gr FROM ResourceOwner ro LEFT OUTER JOIN ro.grants gr WITH
gr.scopeId IN :scopes LEFT OUTER JOIN gr.client clnt WITH clnt.clientId = :clientId WHERE
ro.ownerId = :ownerId"),
})
public class ResourceOwner implements Serializable {
...
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: