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/9c66242a Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/9c66242a Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/9c66242a Branch: refs/heads/STABLE-3.1 Commit: 9c66242a1a999dfca0aa62e394db73caa4e47b9b Parents: 37faf1d Author: Nikita Timofeev <stari...@gmail.com> Authored: Fri Nov 10 15:45:11 2017 +0300 Committer: Nikita Timofeev <stari...@gmail.com> Committed: Fri Nov 10 15:45:11 2017 +0300 ---------------------------------------------------------------------- docs/doc/src/main/resources/RELEASE-NOTES.txt | 1 + .../apache/cayenne/ejbql/parser/Compiler.java | 3 +++ .../ejbql/EJBQLCompiledExpressionTest.java | 21 ++++++++++++++++++++ 3 files changed, 25 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/9c66242a/docs/doc/src/main/resources/RELEASE-NOTES.txt ---------------------------------------------------------------------- diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt index 569ece0..a8966e5 100644 --- a/docs/doc/src/main/resources/RELEASE-NOTES.txt +++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt @@ -14,6 +14,7 @@ Date: not yet released Bug Fixes Since 3.1.1: +CAY-1969 Malformed EJBQL Yields NPE CAY-2084 ObjectIdQuery - no cache access polymorphism CAY-2101 DataContext.currentSnapshot() doesn't set snapshot entity name CAY-2137 When generating SQL from EJBQL, use "AND" to separate multiple join conditions http://git-wip-us.apache.org/repos/asf/cayenne/blob/9c66242a/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java ---------------------------------------------------------------------- diff --git a/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java b/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java index 30f8189..7d37b80 100644 --- a/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java +++ b/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java @@ -312,6 +312,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/9c66242a/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/ejbql/EJBQLCompiledExpressionTest.java ---------------------------------------------------------------------- diff --git a/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/ejbql/EJBQLCompiledExpressionTest.java b/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/ejbql/EJBQLCompiledExpressionTest.java index 82f6392..0dcea40 100644 --- a/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/ejbql/EJBQLCompiledExpressionTest.java +++ b/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/ejbql/EJBQLCompiledExpressionTest.java @@ -140,4 +140,25 @@ public class EJBQLCompiledExpressionTest extends ServerCase { assertNotNull(select2.getEntityDescriptor("PaInTinGAlIaS")); } + /** + * <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> + */ + public void testMissingEntityBeanVariable() { + String ejbql = "SELECT b FROM Artist a"; + EJBQLQuery query = new EJBQLQuery(ejbql); + + try { + runtime.getContext().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."); + } + } + }