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();