You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by ht...@apache.org on 2012/05/31 01:09:16 UTC

svn commit: r1344498 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java

Author: hthomann
Date: Wed May 30 23:09:15 2012
New Revision: 1344498

URL: http://svn.apache.org/viewvc?rev=1344498&view=rev
Log:
OPENJPA-2118: Provide fix to avoid possible 'division by zero' error.

Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java?rev=1344498&r1=1344497&r2=1344498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java Wed May 30 23:09:15 2012
@@ -393,7 +393,7 @@ public class PreparedQueryImpl implement
         Collection values, Integer[] indices, Object param, Broker broker) {
         int n = values.size();
         Object[] array = values.toArray();
-        if (n > indices.length || indices.length%n != 0) {
+        if (n == 0 || n > indices.length || indices.length%n != 0) {
             throw new UserException(_loc.get("uparam-coll-size", param, values, 
                 Arrays.toString(indices)));
         }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java?rev=1344498&r1=1344497&r2=1344498&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java Wed May 30 23:09:15 2012
@@ -39,6 +39,7 @@ import org.apache.openjpa.kernel.jpql.JP
 import org.apache.openjpa.lib.jdbc.AbstractJDBCListener;
 import org.apache.openjpa.lib.jdbc.JDBCEvent;
 import org.apache.openjpa.lib.jdbc.JDBCListener;
+import org.apache.openjpa.persistence.ArgumentException;
 import org.apache.openjpa.persistence.OpenJPAEntityManager;
 import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
 import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
@@ -316,6 +317,36 @@ public class TestPreparedQueryCache exte
         
     }
     
+    public void testCollectionValuedParameterOfEntitiesWithEmptyList() {
+        OpenJPAEntityManager em = emf.createEntityManager();
+        String jpql1 =
+            "select d from Department d where d.name in ('Marketing', 'Sales') order by d.name";
+        List<Department> param1 =
+            (List<Department>) em.createQuery(jpql1).getResultList();
+        em.clear();
+
+        String jpql = "select e from Employee e where e.department in :param";
+
+        List<Employee> rs1 =
+            em.createQuery(jpql).setParameter("param", param1).getResultList();
+
+        for (int i = 0; i < rs1.size(); i++) {
+            Employee e = (Employee) rs1.get(i);
+            assertFalse(e.getDepartment().getName().equals("Engineering"));
+        }
+
+        // Prior to OPENJPA-2118, the following query would yeild a
+        // 'ArithmeticException: divide
+        // by zero' exception (see JIRA for details).
+        try {
+            // Pass an empty list to 'param'.
+            em.createQuery(jpql).setParameter("param",
+                new ArrayList<Department>()).getResultList();
+        } catch (ArgumentException ae) {
+            assertEquals(ae.getCause().getMessage(),
+                "Input parameter \"param\" is empty.");
+        }
+    }
     
     public void testRepeatedParameterInSubqueryInDifferentOrderSubQLast() {
         OpenJPAEntityManager em = emf.createEntityManager();