You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by il...@apache.org on 2018/09/03 12:00:08 UTC

svn commit: r1839943 - in /openjpa/branches/2.4.x: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/blob/mysql/

Author: ilgrosso
Date: Mon Sep  3 12:00:08 2018
New Revision: 1839943

URL: http://svn.apache.org/viewvc?rev=1839943&view=rev
Log:
[OPENJPA-2567] various MySql and MariaDB text types support is added - thanks @solomax

Added:
    openjpa/branches/2.4.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/blob/mysql/ClobColumnEntity.java
    openjpa/branches/2.4.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/blob/mysql/TestClobColumnType.java
Modified:
    openjpa/branches/2.4.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MariaDBDictionary.java
    openjpa/branches/2.4.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java

Modified: openjpa/branches/2.4.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MariaDBDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.4.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MariaDBDictionary.java?rev=1839943&r1=1839942&r2=1839943&view=diff
==============================================================================
--- openjpa/branches/2.4.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MariaDBDictionary.java (original)
+++ openjpa/branches/2.4.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MariaDBDictionary.java Mon Sep  3 12:00:08 2018
@@ -14,7 +14,7 @@
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
- * under the License.    
+ * under the License.
  */
 package org.apache.openjpa.jdbc.sql;
 
@@ -45,13 +45,13 @@ import org.apache.openjpa.util.StoreExce
 
 /*
  * Dictionary for MariaDB, based off the MySQLDictionary.
- * 
+ *
  */
 public class MariaDBDictionary extends DBDictionary {
     public static final String SELECT_HINT = "openjpa.hint.MariaDBSelectHint";
 
     public static final String DELIMITER_BACK_TICK = "`";
-    
+
     /**
      * The MySQL table type to use when creating tables; defaults to innodb.
      */
@@ -69,8 +69,8 @@ public class MariaDBDictionary extends D
     public boolean driverDeserializesBlobs = false;
 
     /**
-     * Whether to inline multi-table bulk-delete operations into MySQL's 
-     * combined <code>DELETE FROM foo, bar, baz</code> syntax. 
+     * Whether to inline multi-table bulk-delete operations into MySQL's
+     * combined <code>DELETE FROM foo, bar, baz</code> syntax.
      * Defaults to false, since this may fail in the presence of InnoDB tables
      * with foreign keys.
      * @see http://dev.mysql.com/doc/refman/5.0/en/delete.html
@@ -80,6 +80,9 @@ public class MariaDBDictionary extends D
     public static final String tinyBlobTypeName = "TINYBLOB";
     public static final String mediumBlobTypeName = "MEDIUMBLOB";
     public static final String longBlobTypeName = "LONGBLOB";
+    public static final String tinyTextTypeName = "TINYTEXT";
+    public static final String mediumTextTypeName = "MEDIUMTEXT";
+    public static final String longTextTypeName = "LONGTEXT";
 
     public MariaDBDictionary() {
         platform = "MariaDB";
@@ -120,15 +123,15 @@ public class MariaDBDictionary extends D
         reservedWordSet.addAll(Arrays.asList(new String[]{
             "AUTO_INCREMENT", "BINARY", "BLOB", "CHANGE", "ENUM", "INFILE",
             "INT1", "INT2", "INT4", "FLOAT1", "FLOAT2", "FLOAT4", "LOAD",
-            "MEDIUMINT", "OUTFILE", "REPLACE", "STARTING", "TEXT", "UNSIGNED", 
-            "ZEROFILL", "INDEX", 
+            "MEDIUMINT", "OUTFILE", "REPLACE", "STARTING", "TEXT", "UNSIGNED",
+            "ZEROFILL", "INDEX",
         }));
 
         // reservedWordSet subset that CANNOT be used as valid column names
         // (i.e., without surrounding them with double-quotes)
         invalidColumnWordSet.addAll(Arrays.asList(new String[]{
             "ADD", "ALL", "ALTER", "AND", "AS", "ASC", "BETWEEN", "BINARY",
-            "BLOB", "BOTH", "BY", "CASCADE", "CASE", "CHANGE", "CHAR", 
+            "BLOB", "BOTH", "BY", "CASCADE", "CASE", "CHANGE", "CHAR",
             "CHARACTER", "CHECK", "COLLATE", "COLUMN", "CONSTRAINT", "CONTINUE",
             "CONVERT", "CREATE", "CROSS", "CURRENT_DATE", "CURRENT_TIME",
             "CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR", "DEC", "DECIMAL",
@@ -145,7 +148,7 @@ public class MariaDBDictionary extends D
             "STARTING", "TABLE", "THEN", "TO", "TRAILING", "TRUE", "UNION",
             "UNIQUE", "UNSIGNED", "UPDATE", "USAGE", "USING", "VALUES",
             "VARCHAR", "VARYING", "WHEN", "WHERE", "WITH", "WRITE", "ZEROFILL",
-            "INDEX", 
+            "INDEX",
         }));
 
         requiresSearchStringEscapeForLike = true;
@@ -157,7 +160,7 @@ public class MariaDBDictionary extends D
 
         setLeadingDelimiter(DELIMITER_BACK_TICK);
         setTrailingDelimiter(DELIMITER_BACK_TICK);
-        
+
         fixedSizeTypeNameSet.remove("NUMERIC");
     }
 
@@ -180,10 +183,11 @@ public class MariaDBDictionary extends D
             if (log.isWarnEnabled())
                 log.warn(e.toString(), e);
         }
-        
+
         supportsXMLColumn = true;
     }
-    
+
+    @Override
     protected void setDelimitedCase(DatabaseMetaData metaData) {
         // Determination of case sensitivity is not accurate; MariaDB JIRA CONJ-55
         delimitedCase = SCHEMA_CASE_PRESERVE;
@@ -194,7 +198,7 @@ public class MariaDBDictionary extends D
         conn = super.decorate(conn);
         return conn;
     }
-    
+
     private static int[] getMajorMinorVersions(String versionStr)
         throws IllegalArgumentException {
         int beginIndex = 0;
@@ -263,7 +267,7 @@ public class MariaDBDictionary extends D
                 new String[]{ "ALTER TABLE "
                 + getFullName(fk.getTable(), false)
                 + " DROP FOREIGN KEY " + toDBName(fkName) };
-            return retVal;   
+            return retVal;
         }
         return new String[]{ "ALTER TABLE "
             + getFullName(fk.getTable(), false)
@@ -288,7 +292,7 @@ public class MariaDBDictionary extends D
         System.arraycopy(sql, 0, ret, cols.length, sql.length);
         return ret;
     }
-    
+
     @Override
     public String[] getDeleteTableContentsSQL(Table[] tables,Connection conn) {
         // mysql >= 4 supports more-optimal delete syntax
@@ -343,10 +347,10 @@ public class MariaDBDictionary extends D
             return Types.LONGVARCHAR;
         return super.getPreferredType(type);
     }
-    
+
     /**
      * Append XML comparison.
-     * 
+     *
      * @param buf the SQL buffer to write the comparison
      * @param op the comparison operation to perform
      * @param lhs the left hand side of the comparison
@@ -368,10 +372,10 @@ public class MariaDBDictionary extends D
         else
             rhs.appendTo(buf);
     }
-    
+
     /**
      * Append XML column value so that it can be used in comparisons.
-     * 
+     *
      * @param buf the SQL buffer to write the value
      * @param val the value to be written
      */
@@ -382,7 +386,7 @@ public class MariaDBDictionary extends D
         val.appendTo(buf);
         buf.append("')");
     }
-    
+
     @Override
     public int getBatchFetchSize(int batchFetchSize) {
         return Integer.MIN_VALUE;
@@ -401,7 +405,7 @@ public class MariaDBDictionary extends D
             select += " " + hint;
         return select;
     }
-    
+
     @Override
     protected Collection<String> getSelectTableAliases(Select sel) {
         Set<String> result = new HashSet<String>();
@@ -412,12 +416,12 @@ public class MariaDBDictionary extends D
         }
         return result;
     }
-    
+
     @Override
     protected int matchErrorState(Map<Integer,Set<String>> errorStates, SQLException ex) {
         int state = super.matchErrorState(errorStates, ex);
-        
-        if (state == StoreException.GENERAL && 
+
+        if (state == StoreException.GENERAL &&
                 ex.getNextException() != null &&
                 "JZ0002".equalsIgnoreCase(ex.getNextException().getSQLState())) {
             if (conf != null && conf.getLockTimeout() != -1) {
@@ -449,7 +453,7 @@ public class MariaDBDictionary extends D
      */
     @Override
     public String getTypeName(Column col) {
-        // handle blobs differently, if the DBItentifierType is NULL (e.g. no column definition is set). 
+        // handle blobs differently, if the DBItentifierType is NULL (e.g. no column definition is set).
         if (col.getType() == Types.BLOB && col.getTypeIdentifier().getType() == DBIdentifierType.NULL) {
             if (col.getSize() <= 0)   // unknown size
                 return blobTypeName;  // return old default of 64KB
@@ -461,6 +465,17 @@ public class MariaDBDictionary extends D
                 return mediumBlobTypeName;
             else
                 return longBlobTypeName;
+        } else if (col.getType() == Types.CLOB && col.getTypeIdentifier().getType() == DBIdentifierType.NULL) {
+            if (col.getSize() <= 0)   // unknown size
+                return clobTypeName;  // return old default of 64KB
+            else if (col.getSize() <= 255)
+                return tinyTextTypeName;
+            else if (col.getSize() <= 65535)
+                return clobTypeName;  // old default of 64KB
+            else if (col.getSize() <= 16777215)
+                return mediumTextTypeName;
+            else
+                return longTextTypeName;
         } else {
             return super.getTypeName(col);
         }

Modified: openjpa/branches/2.4.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.4.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java?rev=1839943&r1=1839942&r2=1839943&view=diff
==============================================================================
--- openjpa/branches/2.4.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java (original)
+++ openjpa/branches/2.4.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java Mon Sep  3 12:00:08 2018
@@ -14,7 +14,7 @@
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
- * under the License.    
+ * under the License.
  */
 package org.apache.openjpa.jdbc.sql;
 
@@ -52,7 +52,7 @@ public class MySQLDictionary
     public static final String SELECT_HINT = "openjpa.hint.MySQLSelectHint";
 
     public static final String DELIMITER_BACK_TICK = "`";
-    
+
     /**
      * The MySQL table type to use when creating tables; defaults to innodb.
      */
@@ -70,8 +70,8 @@ public class MySQLDictionary
     public boolean driverDeserializesBlobs = false;
 
     /**
-     * Whether to inline multi-table bulk-delete operations into MySQL's 
-     * combined <code>DELETE FROM foo, bar, baz</code> syntax. 
+     * Whether to inline multi-table bulk-delete operations into MySQL's
+     * combined <code>DELETE FROM foo, bar, baz</code> syntax.
      * Defaults to false, since this may fail in the presence of InnoDB tables
      * with foreign keys.
      * @see http://dev.mysql.com/doc/refman/5.0/en/delete.html
@@ -81,6 +81,9 @@ public class MySQLDictionary
     public static final String tinyBlobTypeName = "TINYBLOB";
     public static final String mediumBlobTypeName = "MEDIUMBLOB";
     public static final String longBlobTypeName = "LONGBLOB";
+    public static final String tinyTextTypeName = "TINYTEXT";
+    public static final String mediumTextTypeName = "MEDIUMTEXT";
+    public static final String longTextTypeName = "LONGTEXT";
 
     public MySQLDictionary() {
         platform = "MySQL";
@@ -121,15 +124,15 @@ public class MySQLDictionary
         reservedWordSet.addAll(Arrays.asList(new String[]{
             "AUTO_INCREMENT", "BINARY", "BLOB", "CHANGE", "ENUM", "INFILE",
             "INT1", "INT2", "INT4", "FLOAT1", "FLOAT2", "FLOAT4", "LOAD",
-            "MEDIUMINT", "OUTFILE", "REPLACE", "STARTING", "TEXT", "UNSIGNED", 
-            "ZEROFILL", "INDEX", 
+            "MEDIUMINT", "OUTFILE", "REPLACE", "STARTING", "TEXT", "UNSIGNED",
+            "ZEROFILL", "INDEX",
         }));
 
         // reservedWordSet subset that CANNOT be used as valid column names
         // (i.e., without surrounding them with double-quotes)
         invalidColumnWordSet.addAll(Arrays.asList(new String[]{
             "ADD", "ALL", "ALTER", "AND", "AS", "ASC", "BETWEEN", "BINARY",
-            "BLOB", "BOTH", "BY", "CASCADE", "CASE", "CHANGE", "CHAR", 
+            "BLOB", "BOTH", "BY", "CASCADE", "CASE", "CHANGE", "CHAR",
             "CHARACTER", "CHECK", "COLLATE", "COLUMN", "CONSTRAINT", "CONTINUE",
             "CONVERT", "CREATE", "CROSS", "CURRENT_DATE", "CURRENT_TIME",
             "CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR", "DEC", "DECIMAL",
@@ -146,7 +149,7 @@ public class MySQLDictionary
             "STARTING", "TABLE", "THEN", "TO", "TRAILING", "TRUE", "UNION",
             "UNIQUE", "UNSIGNED", "UPDATE", "USAGE", "USING", "VALUES",
             "VARCHAR", "VARYING", "WHEN", "WHERE", "WITH", "WRITE", "ZEROFILL",
-            "INDEX", 
+            "INDEX",
         }));
 
         requiresSearchStringEscapeForLike = true;
@@ -158,7 +161,7 @@ public class MySQLDictionary
 
         setLeadingDelimiter(DELIMITER_BACK_TICK);
         setTrailingDelimiter(DELIMITER_BACK_TICK);
-        
+
         fixedSizeTypeNameSet.remove("NUMERIC");
     }
 
@@ -206,7 +209,7 @@ public class MySQLDictionary
             conn.setReadOnly(true);
         return conn;
     }
-    
+
     private static int[] getMajorMinorVersions(String versionStr)
         throws IllegalArgumentException {
         int beginIndex = 0;
@@ -275,7 +278,7 @@ public class MySQLDictionary
                 new String[]{ "ALTER TABLE "
                 + getFullName(fk.getTable(), false)
                 + " DROP FOREIGN KEY " + toDBName(fkName) };
-            return retVal;   
+            return retVal;
         }
         return new String[]{ "ALTER TABLE "
             + getFullName(fk.getTable(), false)
@@ -300,7 +303,7 @@ public class MySQLDictionary
         System.arraycopy(sql, 0, ret, cols.length, sql.length);
         return ret;
     }
-    
+
     @Override
     public String[] getDeleteTableContentsSQL(Table[] tables,Connection conn) {
         // mysql >= 4 supports more-optimal delete syntax
@@ -356,10 +359,10 @@ public class MySQLDictionary
             return Types.LONGVARCHAR;
         return super.getPreferredType(type);
     }
-    
+
     /**
      * Append XML comparison.
-     * 
+     *
      * @param buf the SQL buffer to write the comparison
      * @param op the comparison operation to perform
      * @param lhs the left hand side of the comparison
@@ -381,10 +384,10 @@ public class MySQLDictionary
         else
             rhs.appendTo(buf);
     }
-    
+
     /**
      * Append XML column value so that it can be used in comparisons.
-     * 
+     *
      * @param buf the SQL buffer to write the value
      * @param val the value to be written
      */
@@ -395,7 +398,7 @@ public class MySQLDictionary
         val.appendTo(buf);
         buf.append("')");
     }
-    
+
     @Override
     public int getBatchFetchSize(int batchFetchSize) {
         return Integer.MIN_VALUE;
@@ -414,7 +417,7 @@ public class MySQLDictionary
             select += " " + hint;
         return select;
     }
-    
+
     @Override
     protected Collection<String> getSelectTableAliases(Select sel) {
         Set<String> result = new HashSet<String>();
@@ -425,7 +428,7 @@ public class MySQLDictionary
         }
         return result;
     }
-    
+
     @Override
     protected int matchErrorState(Map<Integer,Set<String>> errorStates, SQLException ex) {
         int state = super.matchErrorState(errorStates, ex);
@@ -462,7 +465,7 @@ public class MySQLDictionary
      */
     @Override
     public String getTypeName(Column col) {
-        // handle blobs differently, if the DBItentifierType is NULL (e.g. no column definition is set). 
+        // handle blobs differently, if the DBItentifierType is NULL (e.g. no column definition is set).
         if (col.getType() == Types.BLOB && col.getTypeIdentifier().getType() == DBIdentifierType.NULL) {
             if (col.getSize() <= 0)   // unknown size
                 return blobTypeName;  // return old default of 64KB
@@ -474,6 +477,17 @@ public class MySQLDictionary
                 return mediumBlobTypeName;
             else
                 return longBlobTypeName;
+        } else if (col.getType() == Types.CLOB && col.getTypeIdentifier().getType() == DBIdentifierType.NULL) {
+            if (col.getSize() <= 0)   // unknown size
+                return clobTypeName;  // return old default of 64KB
+            else if (col.getSize() <= 255)
+                return tinyTextTypeName;
+            else if (col.getSize() <= 65535)
+                return clobTypeName;  // old default of 64KB
+            else if (col.getSize() <= 16777215)
+                return mediumTextTypeName;
+            else
+                return longTextTypeName;
         } else {
             return super.getTypeName(col);
         }

Added: openjpa/branches/2.4.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/blob/mysql/ClobColumnEntity.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.4.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/blob/mysql/ClobColumnEntity.java?rev=1839943&view=auto
==============================================================================
--- openjpa/branches/2.4.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/blob/mysql/ClobColumnEntity.java (added)
+++ openjpa/branches/2.4.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/blob/mysql/ClobColumnEntity.java Mon Sep  3 12:00:08 2018
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.blob.mysql;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+
+@Entity
+public class ClobColumnEntity {
+    @Id
+    private int id;
+
+    @Lob
+    @Column(length = 20)
+    protected String smallLob;
+
+    @Lob
+    @Column(length = 66000)
+    protected String medLob;
+
+    @Lob
+    @Column(length = 16777216)
+    protected String longLob;
+
+    @Lob
+    protected String defaultLob;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getSmallLob() {
+        return smallLob;
+    }
+
+    public void setSmallLob(String smallLob) {
+        this.smallLob = smallLob;
+    }
+
+    public String getMedLob() {
+        return medLob;
+    }
+
+    public void setMedLob(String medLob) {
+        this.medLob = medLob;
+    }
+
+    public String getLongLob() {
+        return longLob;
+    }
+
+    public void setLongLob(String longLob) {
+        this.longLob = longLob;
+    }
+
+    public String getDefaultLob() {
+        return defaultLob;
+    }
+
+    public void setDefaultLob(String defaultLob) {
+        this.defaultLob = defaultLob;
+    }
+}

Added: openjpa/branches/2.4.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/blob/mysql/TestClobColumnType.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.4.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/blob/mysql/TestClobColumnType.java?rev=1839943&view=auto
==============================================================================
--- openjpa/branches/2.4.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/blob/mysql/TestClobColumnType.java (added)
+++ openjpa/branches/2.4.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/blob/mysql/TestClobColumnType.java Mon Sep  3 12:00:08 2018
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.blob.mysql;
+
+import org.apache.openjpa.jdbc.identifier.DBIdentifier;
+import org.apache.openjpa.jdbc.identifier.DBIdentifier.DBIdentifierType;
+import org.apache.openjpa.jdbc.meta.ClassMapping;
+import org.apache.openjpa.jdbc.schema.Column;
+import org.apache.openjpa.jdbc.schema.Table;
+import org.apache.openjpa.jdbc.sql.MariaDBDictionary;
+import org.apache.openjpa.jdbc.sql.MySQLDictionary;
+import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+
+/**
+ * Testcase for MySQL Blob types. OPENJPA-740 introduced intelligent column type for BLOBs, OPENJPA-1870 refined it a
+ * bit.
+ */
+public class TestClobColumnType extends SingleEMFTestCase {
+
+    private static boolean _firstRun=true;
+    private boolean _runTest = false; // only test with MySQL
+
+    @Override
+	public void setUp() throws Exception {
+
+        // create EMF solely to obtain a DBDictionary.
+        // need to do this without ClobColumnEntity.class since it contains a column definition which might
+        // not work with all databases.
+        super.setUp((Object) null);
+        if (!(getDBDictionary() instanceof MySQLDictionary || getDBDictionary() instanceof MariaDBDictionary)) {
+            // normal teardown will take care of the EMF.
+            return;
+        }
+
+        // remove the EMF
+        tearDown();
+
+        _runTest = true;
+        super.setUp(ClobColumnEntity.class, DROP_TABLES, "openjpa.jdbc.SchemaFactory", "native");
+
+        if(_firstRun) {
+            emf.createEntityManager().close(); // trigger table creation.
+            _firstRun = false;
+        }
+    }
+
+    private Column getCol(String name) {
+        ClassMapping mapping = getMapping(ClobColumnEntity.class);
+
+        Table t = mapping.getTable();
+        Column col = t.getColumn(DBIdentifier.newIdentifier(name, DBIdentifierType.COLUMN, true));
+        assertNotNull(col);
+        return col;
+    }
+
+    public void testSmallLob() {
+        if (_runTest) {
+            assertEquals(MySQLDictionary.tinyTextTypeName, getCol("smallLob").getTypeIdentifier().getName());
+        }
+    }
+
+    public void testMedLob() {
+        if (_runTest) {
+            assertEquals(MySQLDictionary.mediumTextTypeName, getCol("medLob").getTypeIdentifier().getName());
+        }
+    }
+
+    public void testLongBlob() {
+        if (_runTest) {
+            assertEquals(MySQLDictionary.longTextTypeName, getCol("longLob").getTypeIdentifier().getName());
+        }
+    }
+
+    public void testDefaultLob() {
+        if (_runTest) {
+            assertEquals(getDBDictionary().blobTypeName, getCol("defaultLob").getTypeIdentifier().getName());
+        }
+    }
+}