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