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/09/18 20:38:01 UTC

svn commit: r816737 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/

Author: fancy
Date: Fri Sep 18 18:38:00 2009
New Revision: 816737

URL: http://svn.apache.org/viewvc?rev=816737&view=rev
Log:
OPENJPA-1309 DB2 requires CAST for argument passed to datastore MOD function

Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/DatastoreFunction.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EndsWithExpression.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/FilterValue.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/FilterValueImpl.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/StartsWithExpression.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ResultSetResult.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/AbstractCriteriaTestCase.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestQueryByExample.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/DatastoreFunction.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/DatastoreFunction.java?rev=816737&r1=816736&r2=816737&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/DatastoreFunction.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/DatastoreFunction.java Fri Sep 18 18:38:00 2009
@@ -18,6 +18,8 @@
  */
 package org.apache.openjpa.jdbc.kernel.exps;
 
+import org.apache.openjpa.jdbc.sql.SQLBuffer;
+import org.apache.openjpa.jdbc.sql.Select;
 import org.apache.openjpa.kernel.exps.Arguments;
 
 /**
@@ -41,4 +43,20 @@
         return _functionName;
     }
 
+    public void appendTo(Select sel, ExpContext ctx, ExpState state, 
+        SQLBuffer sql, int index) {
+        Args args = (Args) getValue();
+        if (!ctx.store.getDBDictionary().requiresCastForMathFunctions || args.getValues().length == 1)
+            super.appendTo(sel, ctx, state, sql, index);
+        else {
+            sql.append(getOperator());
+            sql.append("(");            
+            args.appendTo(sel, ctx, state, sql, 0);
+            Val[] vals = args.getVals();
+            for (int i = 1; i < vals.length; i++) {
+                sql.addCastForParam(getOperator(), vals[i]);
+            }
+            sql.append(")");
+        }            
+    }
 }

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EndsWithExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EndsWithExpression.java?rev=816737&r1=816736&r2=816737&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EndsWithExpression.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EndsWithExpression.java Fri Sep 18 18:38:00 2009
@@ -203,5 +203,9 @@
         public XMLMetaData getXmlMapping() {
             return null;
         }
+
+        public boolean requiresCast() {
+            return false;
+        }
     }
 }

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/FilterValue.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/FilterValue.java?rev=816737&r1=816736&r2=816737&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/FilterValue.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/FilterValue.java Fri Sep 18 18:38:00 2009
@@ -116,4 +116,10 @@
      * else return null;
      */
     public XMLMetaData getXmlMapping();
+
+    /**
+     * return true if CAST is required for this filter value
+     * else return false.
+     */
+    public boolean requiresCast();
 }

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/FilterValueImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/FilterValueImpl.java?rev=816737&r1=816736&r2=816737&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/FilterValueImpl.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/FilterValueImpl.java Fri Sep 18 18:38:00 2009
@@ -110,4 +110,8 @@
     public XMLMetaData getXmlMapping() {
         return (getXPath() == null) ? null : getXPath().getXmlMapping();
     }
+
+    public boolean requiresCast() {
+        return !(_val instanceof All || _val instanceof Any || _val instanceof PCPath);
+    }
 }

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/StartsWithExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/StartsWithExpression.java?rev=816737&r1=816736&r2=816737&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/StartsWithExpression.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/StartsWithExpression.java Fri Sep 18 18:38:00 2009
@@ -194,6 +194,10 @@
             return null;
         }
 
+        public boolean requiresCast() {
+            return false;
+        }
+
     }
 
     /**
@@ -278,5 +282,9 @@
         public XMLMetaData getXmlMapping() {
             return null;
         }
+
+        public boolean requiresCast() {
+            return false;
+        }
     }
 }

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java?rev=816737&r1=816736&r2=816737&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java Fri Sep 18 18:38:00 2009
@@ -2784,7 +2784,7 @@
         Class rc = Filters.wrap(rhs.getType());
         int type = 0;
         if (requiresCastForMathFunctions && (lc != rc
-            || (lhs.isConstant() && rhs.isConstant()))) {
+            || (lhs.isConstant() || rhs.isConstant()))) {
             Class c = Filters.promote(lc, rc);
             type = getJDBCType(JavaTypes.getTypeCode(c), false);
             if (type != Types.VARBINARY && type != Types.BLOB) {
@@ -2848,6 +2848,8 @@
             if (type != Types.VARBINARY && type != Types.BLOB) {
                 castlhs = (lhs.isConstant() && rhs.isConstant()) || lc != c;
                 castrhs = (lhs.isConstant() && rhs.isConstant()) || rc != c;
+                castlhs = castlhs && lhs.requiresCast();
+                castrhs = castrhs && rhs.requiresCast();
             }
         }
 

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ResultSetResult.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ResultSetResult.java?rev=816737&r1=816736&r2=816737&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ResultSetResult.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ResultSetResult.java Fri Sep 18 18:38:00 2009
@@ -357,7 +357,8 @@
         if (metaTypeCode == -1 && obj instanceof Column)
             metaTypeCode = ((Column) obj).getJavaType();
 
-        boolean isClob = (obj instanceof Column) ? ((Column) obj).getType() == Types.CLOB : false;
+        boolean isClob = (obj instanceof Column) ? ((Column) obj).getType() == Types.CLOB && !((Column) obj).isXML()
+                : false;
         obj = translate(obj, joins);
         
         Object val = null;

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/AbstractCriteriaTestCase.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/AbstractCriteriaTestCase.java?rev=816737&r1=816736&r2=816737&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/AbstractCriteriaTestCase.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/AbstractCriteriaTestCase.java Fri Sep 18 18:38:00 2009
@@ -52,6 +52,10 @@
     protected abstract EntityManager getEntityManager();
     private DBDictionary dict = null;
 
+    public DBDictionary getDictionary() {
+        return dict;
+    }
+
     /**
      * Create an entity manager factory for persistence unit <code>pu</code>. Put {@link #CLEAR_TABLES} in this list to
      * tell the test framework to delete all table contents before running the tests.
@@ -86,8 +90,10 @@
     void setDictionary() {
         JDBCConfiguration conf = (JDBCConfiguration) getEntityManagerFactory().getConfiguration();
         dict = conf.getDBDictionaryInstance();
-        dict.requiresCastForComparisons = false;
-        dict.requiresCastForMathFunctions = false;
+        if (dict instanceof DerbyDictionary) {
+            dict.requiresCastForComparisons = false;
+            dict.requiresCastForMathFunctions = false;
+        }
     }
 
     /**
@@ -174,6 +180,9 @@
                 cSQL.size());
         }
 
+        if (!(dict instanceof DerbyDictionary))
+            return;
+
         for (int i = 0; i < jSQL.size(); i++) {
             if (!jSQL.get(i).equals(cSQL.get(i))) {
                 printSQL("Target SQL for JPQL", jSQL);
@@ -183,9 +192,6 @@
             }
         }
 
-        if (!(dict instanceof DerbyDictionary))
-            return;
-
         if (expectedSQL != null) {
             assertEquals("SQL for JPQL and ExpectedSQL for " + jpql + " is different", jSQL.get(0), 
                     expectedSQL);

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java?rev=816737&r1=816736&r2=816737&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java Fri Sep 18 18:38:00 2009
@@ -54,8 +54,8 @@
             auditor = new SQLAuditor();
             setEntityManagerFactory(createNamedEMF(getDomainClasses()));
             assertNotNull(getEntityManagerFactory());
-            setDictionary();
         }
+        setDictionary();
         em = getEntityManagerFactory().createEntityManager();
         cb = getEntityManagerFactory().getQueryBuilder();
     }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestQueryByExample.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestQueryByExample.java?rev=816737&r1=816736&r2=816737&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestQueryByExample.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestQueryByExample.java Fri Sep 18 18:38:00 2009
@@ -22,10 +22,10 @@
 import javax.persistence.metamodel.Attribute;
 
 import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
+import org.apache.openjpa.jdbc.sql.DB2Dictionary;
 import org.apache.openjpa.jdbc.sql.DBDictionary;
 import org.apache.openjpa.jdbc.sql.OracleDictionary;
 import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
-import org.apache.openjpa.persistence.criteria.AbstractCriteriaTestCase.SQLAuditor;
 
 /**
  * Tests different styles for query by example.
@@ -34,7 +34,7 @@
  *
  */
 public class TestQueryByExample extends CriteriaTest {
-    
+    DBDictionary dict = null;
     public void setUp() {
         super.setUp();
         
@@ -42,7 +42,7 @@
         // comparison of SQL.  This may not work on Oracle JDBC drivers
         // prior to 10.x
         OpenJPAEntityManagerSPI ojem = (OpenJPAEntityManagerSPI)em;
-        DBDictionary dict = ((JDBCConfiguration) ojem.getConfiguration())
+        dict = ((JDBCConfiguration) ojem.getConfiguration())
             .getDBDictionaryInstance();
         if (dict instanceof OracleDictionary) {
             dict.setJoinSyntax("sql92");
@@ -184,6 +184,8 @@
         em.createQuery(q).getResultList();
         assertEquals(1,auditor.getSQLs().size());
         String actual = extract("WHERE", auditor.getSQLs().get(0));
+        if (dict instanceof DB2Dictionary)
+            return;
         assertEquals(expected, actual);
     }