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 2016/09/08 19:05:59 UTC

svn commit: r1759888 - in /openjpa/branches/2.1.x: ./ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/CompareExpression.java openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestJDBCEscapeDate.java

Author: hthomann
Date: Thu Sep  8 19:05:59 2016
New Revision: 1759888

URL: http://svn.apache.org/viewvc?rev=1759888&view=rev
Log:
OPENJPA-2286: ArgumentException: Attempt to compare incompatible types class java.util.Date and class org.apache.openjpa.jdbc.sql.Raw.  Backported changes from 2.2.x.

Modified:
    openjpa/branches/2.1.x/   (props changed)
    openjpa/branches/2.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/CompareExpression.java
    openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestJDBCEscapeDate.java

Propchange: openjpa/branches/2.1.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Sep  8 19:05:59 2016
@@ -2,5 +2,5 @@
 /openjpa/branches/1.2.x:1140217
 /openjpa/branches/2.0.x:1419659,1484136,1484287,1504611
 /openjpa/branches/2.2.1.x:1531176,1651808,1651826
-/openjpa/branches/2.2.x:1580898
+/openjpa/branches/2.2.x:1580898,1580939
 /openjpa/trunk:1071123,1076370,1076388,1095401,1095805,1143520,1221801,1221839,1222185,1416742,1420324,1430117,1431649,1436957,1436960,1448662,1448796,1451369,1456574,1456614,1459091,1461833,1469646,1469649,1469652,1504282,1603251

Modified: openjpa/branches/2.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/CompareExpression.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/CompareExpression.java?rev=1759888&r1=1759887&r2=1759888&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/CompareExpression.java (original)
+++ openjpa/branches/2.1.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/CompareExpression.java Thu Sep  8 19:05:59 2016
@@ -26,6 +26,7 @@ import org.apache.openjpa.kernel.Filters
 import org.apache.openjpa.kernel.exps.ExpressionVisitor;
 import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.util.UserException;
+import org.apache.openjpa.jdbc.sql.Raw;
 
 /**
  * Compares two values.
@@ -67,10 +68,19 @@ class CompareExpression
         BinaryOpExpState bstate = (BinaryOpExpState) state;
         _val1.calculateValue(sel, ctx, bstate.state1, _val2, bstate.state2);
         _val2.calculateValue(sel, ctx, bstate.state2, _val1, bstate.state1);
-        if (!Filters.canConvert(_val1.getType(), _val2.getType(), false)
-            && !Filters.canConvert(_val2.getType(), _val1.getType(), false))
-            throw new UserException(_loc.get("cant-convert", _val1.getType(),
-                _val2.getType()));
+        Class val1Type = _val1.getType();
+        Class val2Type = _val2.getType();
+        // For purposes of the 'canConvert', when dealing with a Lit with Raw
+        // use a String type since Raw contains a String.
+        if (_val1 instanceof Lit && val1Type.isAssignableFrom(Raw.class)){
+            val1Type = String.class;
+        }
+        if (_val2 instanceof Lit && val2Type.isAssignableFrom(Raw.class)){
+            val2Type = String.class;
+        }
+        if (!Filters.canConvert(val1Type, val2Type, false)
+            && !Filters.canConvert(val2Type, val1Type, false))
+            throw new UserException(_loc.get("cant-convert", val1Type, val2Type));
 
         ctx.store.getDBDictionary().comparison(buf, _op,
             new FilterValueImpl(sel, ctx, bstate.state1, _val1),

Modified: openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestJDBCEscapeDate.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestJDBCEscapeDate.java?rev=1759888&r1=1759887&r2=1759888&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestJDBCEscapeDate.java (original)
+++ openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestJDBCEscapeDate.java Thu Sep  8 19:05:59 2016
@@ -45,7 +45,7 @@ public class TestJDBCEscapeDate extends
         setUp(Employee.class, DROP_TABLES);
     }
 
-    public void testJDBCEscape() {
+    public void populate(){
         EntityManager em = emf.createEntityManager();
         EntityTransaction tran = em.getTransaction();
         Employee e = new Employee();
@@ -56,9 +56,13 @@ public class TestJDBCEscapeDate extends
         e.setHireTimestamp(new Date());
         em.persist(e);
         tran.begin();
-        em.flush();
         tran.commit();
-        em.clear();
+        em.close();        
+    }
+    
+    public void testJDBCEscape() {
+        populate();
+        EntityManager em = emf.createEntityManager();
 
         String[] jpql;
         DBDictionary dict = ((JDBCConfiguration)emf.getConfiguration()).getDBDictionaryInstance();
@@ -158,4 +162,21 @@ public class TestJDBCEscapeDate extends
         Assert.assertEquals(1, updateCnt);
         em.close();
     }
+    
+    /*
+     * Added for OJ-2286.  The test executes the same query multiple times.  Prior
+     * to the JIRA fix, upon the second exception an exception would occur.  
+     */
+    public void testMultipleQueryExecutionWithDateLiteral() {
+        populate();
+        EntityManager em = emf.createEntityManager();
+        
+        Query q = em.createQuery("SELECT e FROM Employee e WHERE e.hireTimestamp > {ts '2001-01-01 00:00:00'}");        
+        Assert.assertEquals("First assertion", 1, q.getResultList().size());
+        // Prior to JIRA OJ-2286, an exception would occur here:
+        Assert.assertEquals("Second assertion", 1, q.getResultList().size());
+        // For good measure execute it a couple more times.  :)
+        Assert.assertEquals("Third assertion", 1, q.getResultList().size());
+        Assert.assertEquals("Fourth assertion", 1, q.getResultList().size());
+    }    
 }