You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by mi...@apache.org on 2009/10/22 18:19:18 UTC

svn commit: r828772 - 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/common/apps/ openjpa-...

Author: mikedd
Date: Thu Oct 22 16:19:17 2009
New Revision: 828772

URL: http://svn.apache.org/viewvc?rev=828772&view=rev
Log:
OPENJPA-1308:
Remove extraneous cast of VARCHAR to VARCHAR for DB2.
Submitted By: B.J. Reed

Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ToLowerCase.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ToUpperCase.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/AbstractDB2Dictionary.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.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/DerbyDictionary.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/CompUser.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEJBQLCondExpression.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/functions/TestEJBQLFunction.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ToLowerCase.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ToLowerCase.java?rev=828772&r1=828771&r2=828772&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ToLowerCase.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ToLowerCase.java Thu Oct 22 16:19:17 2009
@@ -43,7 +43,11 @@
         DBDictionary dict = ctx.store.getDBDictionary();
         String func = dict.toLowerCaseFunction;
         dict.assertSupport(func != null, "ToLowerCaseFunction");
-        func = dict.getCastFunction(getValue(), func);
+        if (getValue() instanceof PCPath) {
+            func = dict.getCastFunction(getValue(), func, ((PCPath) getValue()).getFieldMapping(state).getColumns()[0]);
+        } else {
+            func = dict.getCastFunction(getValue(), func);
+        }
 
         int idx = func.indexOf("{0}");
         buf.append(func.substring(0, idx));

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ToUpperCase.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ToUpperCase.java?rev=828772&r1=828771&r2=828772&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ToUpperCase.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ToUpperCase.java Thu Oct 22 16:19:17 2009
@@ -43,7 +43,11 @@
         DBDictionary dict = ctx.store.getDBDictionary();
         String func = dict.toUpperCaseFunction;
         dict.assertSupport(func != null, "ToUpperCaseFunction");
-        func = dict.getCastFunction(getValue(), func);
+        if (getValue() instanceof PCPath) {
+            func = dict.getCastFunction(getValue(), func, ((PCPath) getValue()).getFieldMapping(state).getColumns()[0]);
+        } else {
+            func = dict.getCastFunction(getValue(), func);
+        }
 
         int idx = func.indexOf("{0}");
         buf.append(func.substring(0, idx));

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/AbstractDB2Dictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/AbstractDB2Dictionary.java?rev=828772&r1=828771&r2=828772&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/AbstractDB2Dictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/AbstractDB2Dictionary.java Thu Oct 22 16:19:17 2009
@@ -38,13 +38,9 @@
 
         // DB2-based databases have restrictions on having uncast parameters
         // in string functions
-        toUpperCaseFunction = "UPPER(CAST({0} AS VARCHAR(" + varcharCastLength
-            + ")))";
-        toLowerCaseFunction = "LOWER(CAST({0} AS VARCHAR(" + varcharCastLength
-            + ")))";
         stringLengthFunction = "LENGTH({0})";
         concatenateFunction = "(CAST({0} AS VARCHAR(" + varcharCastLength
-            + ")) || CAST({1} AS VARCHAR(1000)))";
+            + ")) || CAST({1} AS VARCHAR(" + varcharCastLength + ")))";
 
         trimLeadingFunction = "LTRIM({0})";
         trimTrailingFunction = "RTRIM({0})";
@@ -60,6 +56,7 @@
         supportsLockingWithOuterJoin = false;
         supportsLockingWithInnerJoin = false;
         supportsLockingWithSelectRange = true;
+        supportsCaseConversionForLob = true;
 
         requiresAutoCommitForMetaData = true;
         requiresAliasForSubselect = true;

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java?rev=828772&r1=828771&r2=828772&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java Thu Oct 22 16:19:17 2009
@@ -763,9 +763,36 @@
      * @return a String with the correct CAST function syntax
      */
     public String getCastFunction(Val val, String func) {
-        if (val instanceof Lit || val instanceof Param)
-            if (func.indexOf("VARCHAR") == -1)
-                func = addCastAsString(func, "{0}", " AS VARCHAR(1000)");
+        if (val instanceof Lit || val instanceof Param) {
+            if (func.indexOf("VARCHAR") == -1) {
+                func = addCastAsString(func, "{0}", " AS VARCHAR(" + varcharCastLength + ")");
+            }
+        }
+        return func;
+    }
+
+    /**
+     * Return the correct CAST function syntax
+     * 
+     * @param val operand of cast
+     * @param func original string
+     * @param col database column
+     * @return a String with the correct CAST function syntax
+     */
+    public String getCastFunction(Val val, String func, Column col) {
+        boolean doCast = false;
+        if (val instanceof Lit || val instanceof Param) {
+            doCast = true;
+        }
+        // cast anything not already a VARCHAR to VARCHAR
+        if (col.getType() != Types.VARCHAR) {
+            doCast = true;
+        }
+        if (doCast == true) {
+            if (func.indexOf("VARCHAR") == -1) {
+                func = addCastAsString(func, "{0}", " AS VARCHAR(" + varcharCastLength + ")");
+            }
+        }
         return func;
     }
 

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=828772&r1=828771&r2=828772&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 Thu Oct 22 16:19:17 2009
@@ -240,6 +240,7 @@
     public boolean requiresCastForComparisons = false;
     public boolean supportsModOperator = false;
     public boolean supportsXMLColumn = false;
+    public boolean supportsCaseConversionForLob = false;
     public boolean reportsSuccessNoInfoOnBatchUpdates = false;
     public boolean supportsSelectFromFinalTable = false;
     public boolean supportsSimpleCaseExpression = true;
@@ -4798,6 +4799,19 @@
     public String getCastFunction(Val val, String func) {
         return func;
     }
+
+    /**
+     * Return the correct CAST function syntax.  This should be overriden by subclasses
+     * that need access to the Column information.
+     * 
+     * @param val operand of cast
+     * @param func original string
+     * @param col database column
+     * @return a String with the correct CAST function syntax
+     */
+    public String getCastFunction(Val val, String func, Column col) {
+        return getCastFunction (val, func);
+    }
     
     /**
      * Create an index if necessary for some database tables

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DerbyDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DerbyDictionary.java?rev=828772&r1=828771&r2=828772&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DerbyDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DerbyDictionary.java Thu Oct 22 16:19:17 2009
@@ -45,6 +45,8 @@
         validationSQL = "VALUES(1)";
         stringLengthFunction = "LENGTH({0})";
         substringFunctionName = "SUBSTR";
+        toUpperCaseFunction = "UPPER(CAST({0} AS VARCHAR(" + varcharCastLength + ")))";
+        toLowerCaseFunction = "LOWER(CAST({0} AS VARCHAR(" + varcharCastLength + ")))";
 
         // Derby name length restriction has been relaxed 
         //http://www.archivum.info/derby-dev@db.apache.org/2004-12/msg00270.html

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/CompUser.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/CompUser.java?rev=828772&r1=828771&r2=828772&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/CompUser.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/CompUser.java Thu Oct 22 16:19:17 2009
@@ -18,94 +18,135 @@
  */
 package org.apache.openjpa.persistence.common.apps;
 
-import javax.persistence.*;
-import org.apache.openjpa.persistence.*;
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.Lob;
+import javax.persistence.OneToOne;
 
-import java.util.*;
+import org.apache.openjpa.persistence.PersistentCollection;
 
 @Entity
-@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
-public class CompUser
-{
-	@Basic
-	@Column(length=50)
-	private String name;
-
-	@Basic
-	private int age;
-
-	@Basic
-	@Column(name="compName", length=50)
-	private String computerName;
-
-	@PersistentCollection
-	private String[] nicknames = new String[0];
-
-	@OneToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE})
-	@JoinColumn(name="ADD_ID")
-	private Address address;
-
-	@Id
-	@GeneratedValue(strategy=GenerationType.AUTO)
-	public int userid;
-	
+@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
+public class CompUser {
+    @Basic
+    @Column(length = 50)
+    private String name;
+
+    @Basic
+    private int age;
+
+    @Basic
+    @Column(name = "compName", length = 50)
+    private String computerName;
+
+    @Basic
+    @Lob
+    private String nameAsLob;
+
+    @PersistentCollection
+    private String[] nicknames = new String[0];
+
+    @OneToOne(cascade = { CascadeType.PERSIST, CascadeType.REMOVE })
+    @JoinColumn(name = "ADD_ID")
+    private Address address;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    public int userid;
+
     @Enumerated
     @Basic
     private CreditRating creditRating;
-	
-	public CompUser(){}
 
-	public CompUser(String name, String cName, Address address, int age)
-	{
-		this.name = name;
-		this.computerName = cName;
-		this.address = address;
-		this.age = age;
-	}
-
-	public String getComputerName() {
-		return computerName;
-	}
-
-	public void setComputerName(String computerName) {
-		this.computerName = computerName;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public int getUserid() {
-		return userid;
-	}
-
-	public Address getAddress() {
-		return address;
-	}
-
-	public void setAddress(Address address) {
-		this.address = address;
-	}
-
-	public int getAge() {
-		return age;
-	}
-
-	public void setAge(int age) {
-		this.age = age;
-	}
+    public CompUser() {
+    }
+
+    public CompUser(String name, String cName, Address address, int age) {
+        this.name = name;
+        this.computerName = cName;
+        this.address = address;
+        this.age = age;
+        this.nameAsLob = name;
+    }
+
+    public String getComputerName() {
+        return computerName;
+    }
+
+    public void setComputerName(String computerName) {
+        this.computerName = computerName;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public int getUserid() {
+        return userid;
+    }
+
+    public Address getAddress() {
+        return address;
+    }
+
+    public void setAddress(Address address) {
+        this.address = address;
+    }
+
+    public int getAge() {
+        return age;
+    }
+
+    public void setAge(int age) {
+        this.age = age;
+    }
+
+    public String getNameAsLob() {
+        return nameAsLob;
+    }
+
+    public void setNameAsLob(String nameAsLob) {
+        this.nameAsLob = nameAsLob;
+    }
 
     public CreditRating getRating() {
         return creditRating;
     }
-    
+
     public void setRating(CreditRating rating) {
         this.creditRating = rating;
     }
-	
-    public enum CreditRating { POOR, GOOD, EXCELLENT };
+
+    public enum CreditRating {
+        POOR, GOOD, EXCELLENT
+    };
+
+    public String[] getNicknames() {
+        return nicknames;
+    }
+
+    public void setNicknames(String[] nicknames) {
+        this.nicknames = nicknames;
+    }
+
+    public CreditRating getCreditRating() {
+        return creditRating;
+    }
+
+    public void setCreditRating(CreditRating creditRating) {
+        this.creditRating = creditRating;
+    }
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEJBQLCondExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEJBQLCondExpression.java?rev=828772&r1=828771&r2=828772&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEJBQLCondExpression.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestEJBQLCondExpression.java Thu Oct 22 16:19:17 2009
@@ -313,12 +313,14 @@
             user.setComputerName(cName);
             user.setAddress(add);
             user.setAge(age);
+            user.setNameAsLob(name);
         } else {
             user = new FemaleUser();
             user.setName(name);
             user.setComputerName(cName);
             user.setAddress(add);
             user.setAge(age);
+            user.setNameAsLob(name);
         }
         return user;
 	}

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/functions/TestEJBQLFunction.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/functions/TestEJBQLFunction.java?rev=828772&r1=828771&r2=828772&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/functions/TestEJBQLFunction.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/functions/TestEJBQLFunction.java Thu Oct 22 16:19:17 2009
@@ -24,6 +24,7 @@
 import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
 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.common.apps.Address;
 import org.apache.openjpa.persistence.common.apps.CompUser;
 import org.apache.openjpa.persistence.common.apps.FemaleUser;
@@ -196,6 +197,33 @@
         endEm(em);
     }
 
+    public void testLowerClobFunc() {
+        OpenJPAEntityManagerSPI em = (OpenJPAEntityManagerSPI) currentEntityManager();
+        // some databases do not support case conversion on LOBs,
+        // just skip this test case
+        DBDictionary dict = ((JDBCConfiguration) em.getConfiguration()).getDBDictionaryInstance();
+        if (!dict.supportsCaseConversionForLob) {
+            return;
+        }
+        startTx(em);
+
+        CompUser user = em.find(CompUser.class, userid5);
+        assertNotNull(user);
+        assertEquals("Famzy", user.getName());
+
+        String query = "UPDATE CompUser e SET e.name = LOWER(e.name) WHERE LOWER(e.nameAsLob)='famzy'";
+
+        int result = em.createQuery(query).executeUpdate();
+
+        user = em.find(CompUser.class, userid5);
+        em.refresh(user);
+        assertNotNull(user);
+        assertEquals("famzy", user.getName());
+
+        endTx(em);
+        endEm(em);
+    }
+
     public void testUpperFunc() {
         EntityManager em = currentEntityManager();
         startTx(em);
@@ -218,6 +246,33 @@
         endEm(em);
     }
 
+    public void testUpperClobFunc() {
+        OpenJPAEntityManagerSPI em = (OpenJPAEntityManagerSPI) currentEntityManager();
+        // some databases do not support case conversion on LOBs,
+        // just skip this test case
+        DBDictionary dict = ((JDBCConfiguration) em.getConfiguration()).getDBDictionaryInstance();
+        if (!dict.supportsCaseConversionForLob) {
+            return;
+        }
+        startTx(em);
+
+        CompUser user = em.find(CompUser.class, userid5);
+        assertNotNull(user);
+        assertEquals("Famzy", user.getName());
+
+        String query = "UPDATE CompUser e SET e.name = UPPER(e.name) WHERE UPPER(e.nameAsLob)='FAMZY'";
+
+        int result = em.createQuery(query).executeUpdate();
+
+        user = em.find(CompUser.class, userid5);
+        em.refresh(user);
+        assertNotNull(user);
+        assertEquals("FAMZY", user.getName());
+
+        endTx(em);
+        endEm(em);
+    }
+
     public void testLengthFunc() {
         EntityManager em = currentEntityManager();
 
@@ -415,12 +470,14 @@
             user.setComputerName(cName);
             user.setAddress(add);
             user.setAge(age);
+            user.setNameAsLob(name);
         } else {
             user = new FemaleUser();
             user.setName(name);
             user.setComputerName(cName);
             user.setAddress(add);
             user.setAge(age);
+            user.setNameAsLob(name);
         }
         return user;
     }