You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/11/17 23:59:01 UTC

svn commit: r881598 - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/ openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/ openjpa-persistence-jdbc/src/te...

Author: fancy
Date: Tue Nov 17 22:59:01 2009
New Revision: 881598

URL: http://svn.apache.org/viewvc?rev=881598&view=rev
Log:
OPENJPA-1388 JPQL named parameter using a reserved word (:vlaue) resulting in ArgumentException

Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
    openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEntityTypeExpression.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryParameters.java

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java?rev=881598&r1=881597&r2=881598&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java Tue Nov 17 22:59:01 2009
@@ -1732,7 +1732,7 @@
         for (Object expected : paramTypes.keySet()) {
             if (!params.containsKey(expected))
             throw new UserException(_loc.get("unbound-params",
-                params.keySet()));
+                expected, params.keySet()));
         }
 
         Iterator itr = paramTypes.entrySet().iterator();

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java?rev=881598&r1=881597&r2=881598&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java Tue Nov 17 22:59:01 2009
@@ -1027,15 +1027,18 @@
                 return eval(firstChild(node));
 
             case JJTNAMEDINPUTPARAMETER:
-                return getParameter(node.text, false, false);
+                return getParameter(onlyChild(node).text, false, false);
 
             case JJTPOSITIONALINPUTPARAMETER:
                 return getParameter(node.text, true, false);
 
             case JJTCOLLECTIONPARAMETER:
                 JPQLNode child = onlyChild(node);
+                boolean positional = child.id == JJTPOSITIONALINPUTPARAMETER;
+                if (!positional)
+                    child = onlyChild(child);
                 return getParameter(child.text, 
-                    child.id == JJTPOSITIONALINPUTPARAMETER, true);
+                    positional, true);
 
             case JJTOR: // x OR y
                 return factory.or(getExpression(left(node)),

Modified: openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt?rev=881598&r1=881597&r2=881598&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt (original)
+++ openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt Tue Nov 17 22:59:01 2009
@@ -1488,10 +1488,9 @@
 }
 
 
-void named_input_parameter() #NAMEDINPUTPARAMETER :
-{ Token t; }
+void named_input_parameter() #NAMEDINPUTPARAMETER : { }
 {
-	":" t = <IDENTIFIER> { jjtThis.setToken (t); }
+	":" path_component()
 }
 
 

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEntityTypeExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEntityTypeExpression.java?rev=881598&r1=881597&r2=881598&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEntityTypeExpression.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEntityTypeExpression.java Tue Nov 17 22:59:01 2009
@@ -107,10 +107,10 @@
         user = rs.get(0);
         assertEquals("Famzy", user.getName());
 
-        query = "SELECT e FROM CompUser e where TYPE(e) in :params " +
+        query = "SELECT e FROM CompUser e where TYPE(e) in :value " +
                 "ORDER BY e.age";
         rs = em.createQuery(query).
-            setParameter("params", params).getResultList();
+            setParameter("value", params).getResultList();
         user = rs.get(0);
         assertEquals("Jacob", user.getName());
         
@@ -137,10 +137,10 @@
         type = ((Object[]) rs2.get(0))[1];
         assertEquals(type, FemaleUser.class);
         
-        query = "SELECT e FROM CompUser e where TYPE(e) = :typeName " +
+        query = "SELECT e FROM CompUser e where TYPE(e) = :type " +
             " ORDER BY e.name";
         rs =  em.createQuery(query).
-            setParameter("typeName", FemaleUser.class).getResultList();
+            setParameter("type", FemaleUser.class).getResultList();
         assertTrue(rs.size()==3);
         user = rs.get(0);
         assertEquals("Famzy", user.getName());

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryParameters.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryParameters.java?rev=881598&r1=881597&r2=881598&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryParameters.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestQueryParameters.java Tue Nov 17 22:59:01 2009
@@ -59,6 +59,24 @@
         // do not close the factory
     }
     
+    public void testNamedParameterUsingReservedWord() {
+        String jpql = "select e from simple e WHERE e.id=:key and e.name=:value";
+        Query q = em.createQuery(jpql)
+                    .setParameter("key", 100)
+                    .setParameter("value", "XYZ");
+        
+        assertEquals(2, q.getParameters().size());
+        Parameter<?> param1 = q.getParameter("key");
+        Parameter<?> param2 = q.getParameter("value");
+        
+        assertEquals(100, q.getParameterValue("key"));
+        assertEquals(100, q.getParameterValue(param1));
+        assertEquals("XYZ", q.getParameterValue("value"));
+        assertEquals("XYZ", q.getParameterValue(param2));
+        
+        q.getResultList();
+    }
+    
     public void testPositionalParameterInJPQLQuery() {
         String jpql = "select e from simple e WHERE e.id=?1 and e.name=?2";
         Query q = em.createQuery(jpql)