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