[CAY-1969] Malformed EJBQL Yields NPE
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/583df135 Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/583df135 Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/583df135 Branch: refs/heads/CAY-1946_1 Commit: 583df135b3ee0c3a758a586678252979852ae3f3 Parents: 4207ebe Author: Andrew Lindesay <a...@lindesay.co.nz> Authored: Wed Nov 19 07:27:29 2014 +1300 Committer: Andrew Lindesay <a...@lindesay.co.nz> Committed: Wed Nov 19 07:27:29 2014 +1300 ---------------------------------------------------------------------- .../apache/cayenne/ejbql/parser/Compiler.java | 3 +++ .../org/apache/cayenne/query/EJBQLQueryIT.java | 25 ++++++++++++++++++++ 2 files changed, 28 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/583df135/cayenne-server/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java b/cayenne-server/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java index e4829e7..b90acf6 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java @@ -308,6 +308,9 @@ class Compiler { if (descriptor == null) { descriptor = descriptorsById.get(expression.getText()); } + if(descriptor == null) { + throw new EJBQLException("the entity variable '" + id +"' does not refer to any entity in the FROM clause"); + } final EntityResult entityResult = new EntityResult(descriptor.getObjectClass()); final String prefix = "ec" + position + "_"; final int[] index = { http://git-wip-us.apache.org/repos/asf/cayenne/blob/583df135/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java index fcc78f5..5ed52a6 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java @@ -23,6 +23,7 @@ import org.apache.cayenne.access.DataContext; import org.apache.cayenne.configuration.server.ServerRuntime; import org.apache.cayenne.di.Inject; import org.apache.cayenne.ejbql.EJBQLCompiledExpression; +import org.apache.cayenne.ejbql.EJBQLException; import org.apache.cayenne.exp.Expression; import org.apache.cayenne.exp.ExpressionFactory; import org.apache.cayenne.map.EntityResolver; @@ -50,6 +51,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT) public class EJBQLQueryIT extends ServerCase { @@ -190,6 +192,29 @@ public class EJBQLQueryIT extends ServerCase { assertEquals(ejbql, parsed.getSource()); } + /** + * <p>If an expression has an 'entity variable' used in the SELECT clause then there should be a + * corresponding definition for the 'entity variable' in the FROM clause. This did, at some + * point throw an NPE.</p> + */ + + @Test + public void testMissingEntityBeanVariable() { + String ejbql = "SELECT b FROM Artist a"; + EJBQLQuery query = new EJBQLQuery(ejbql); + + try { + context.performQuery(query); + fail("expected an instance of " + EJBQLException.class.getSimpleName() + " to have been thrown."); + } + catch(EJBQLException e) { + assertEquals("the entity variable 'b' does not refer to any entity in the FROM clause", e.getUnlabeledMessage()); + } + catch(Throwable th) { + fail("expected an instance of " + EJBQLException.class.getSimpleName() + " to have been thrown."); + } + } + @Test public void testGetName() { String ejbql = "select a FROM Artist a";