ParsedJPQL parsed = new ParsedJPQL(node.parser.jpql, node);
Context subContext = new Context(parsed, null, ctx());
contexts.push(subContext);
ClassMetaData candidate = getCandidateMetaData(node);
Subquery subq = subContext.getSubquery();
if (subq == null) {
subq = factory.newSubquery(candidate, subclasses, nextAlias());
subContext.setSubquery(subq);
}
subq.setMetaData(candidate);
// evaluate from clause for resolving variables defined in subquery
JPQLNode from = node.getChild(1);
subContext.from = evalFromClause(from, true);
try {
QueryExpressions subexp = getQueryExpressions();
subq.setQueryExpressions(subexp);
if (subexp.projections.length > 0)
checkEmbeddable(subexp.projections[0]);
return subq;
} finally {
// remove the subquery parse context