You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by jg...@apache.org on 2013/07/10 17:43:18 UTC

svn commit: r1501805 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/conf/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/conf/ openjpa-jdbc/src/main/resources/org...

Author: jgrassel
Date: Wed Jul 10 15:43:18 2013
New Revision: 1501805

URL: http://svn.apache.org/r1501805
Log:
OPENJPA-2400: MariaDB support

Added:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MariaDBDictionary.java   (with props)
Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/conf/JDBCConfigurationImpl.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/conf/JDBCProductDerivation.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionaryFactory.java
    openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/conf/localizer.properties
    openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/sql-error-state-codes.xml
    openjpa/trunk/openjpa-persistence-jdbc/pom.xml
    openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCPersistenceProductDerivation.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/conf/TestQueryHints.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/strats/AbstractLobTest.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/blob/mysql/TestBlobColumnType.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/utils/AbstractTestCase.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/delimited/identifiers/noschema/TestNoSchemaManualDelimIdSeqGen.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/delimited/identifiers/noschema/TestNoSchemaManualDelimitedJoinAnnotations.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/dynamicschema/TestDynamicSchemas.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestMultipleSchemaNames.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestHintedQuery.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/schema/TestLazySchemaFactory.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/unique/TestNamedUniqueConstraint.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/unique/TestNamedUniqueConstraintWithXMLDescriptor.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestSpecialNumbers.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestSpecialNumbers2.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/GroupingTestCase.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestSubquery.java
    openjpa/trunk/openjpa-persistence-locking/pom.xml
    openjpa/trunk/openjpa-persistence-locking/src/test/java/org/apache/openjpa/persistence/lock/extended/LockScopeTestCase.java
    openjpa/trunk/openjpa-persistence-locking/src/test/java/org/apache/openjpa/persistence/lockmgr/SequencedActionsTest.java
    openjpa/trunk/openjpa-slice/src/test/resources/META-INF/persistence.xml

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/conf/JDBCConfigurationImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/conf/JDBCConfigurationImpl.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/conf/JDBCConfigurationImpl.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/conf/JDBCConfigurationImpl.java Wed Jul 10 15:43:18 2013
@@ -212,6 +212,7 @@ public class JDBCConfigurationImpl
             "informix", "org.apache.openjpa.jdbc.sql.InformixDictionary",
             "ingres", "org.apache.openjpa.jdbc.sql.IngresDictionary",
             "jdatastore", "org.apache.openjpa.jdbc.sql.JDataStoreDictionary",
+            "mariadb", "org.apache.openjpa.jdbc.sql.MariaDBDictionary",
             "mysql", "org.apache.openjpa.jdbc.sql.MySQLDictionary",
             "oracle", "org.apache.openjpa.jdbc.sql.OracleDictionary",
             "pointbase", "org.apache.openjpa.jdbc.sql.PointbaseDictionary",

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/conf/JDBCProductDerivation.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/conf/JDBCProductDerivation.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/conf/JDBCProductDerivation.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/conf/JDBCProductDerivation.java Wed Jul 10 15:43:18 2013
@@ -30,6 +30,7 @@ import org.apache.openjpa.conf.BrokerFac
 import org.apache.openjpa.conf.OpenJPAProductDerivation;
 import org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory;
 import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
+import org.apache.openjpa.jdbc.sql.MariaDBDictionary;
 import org.apache.openjpa.jdbc.sql.MySQLDictionary;
 import org.apache.openjpa.jdbc.sql.OracleDictionary;
 import org.apache.openjpa.lib.conf.AbstractProductDerivation;
@@ -74,6 +75,7 @@ public class JDBCProductDerivation exten
         _hints.add(PREFIX + ".ResultSetType");
         _hints.add(PREFIX + ".SubclassFetchMode");
         
+        _hints.add(MariaDBDictionary.SELECT_HINT);
         _hints.add(MySQLDictionary.SELECT_HINT);
         _hints.add(OracleDictionary.SELECT_HINT);
         

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionaryFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionaryFactory.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionaryFactory.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionaryFactory.java Wed Jul 10 15:43:18 2013
@@ -74,7 +74,7 @@ public class DBDictionaryFactory {
     public static DBDictionary calculateDBDictionary(JDBCConfiguration conf,
         String url, String driver, String props) {
         String dclass = dictionaryClassForString(getProtocol(url), conf);
-        if (dclass == null)
+        if (dclass == null || (dclass != null && dclass.contains("MySQL")))
             dclass = dictionaryClassForString(driver, conf);
         if (dclass == null)
             return null;
@@ -90,11 +90,13 @@ public class DBDictionaryFactory {
         try {
             conn = ds.getConnection();
             DatabaseMetaData meta = conn.getMetaData();
-            String dclass = dictionaryClassForString(meta
-                .getDatabaseProductName(), conf);
+            String dclass = dictionaryClassForString(meta.getDatabaseProductName(), conf);            
             if (dclass == null)
-                dclass = dictionaryClassForString(getProtocol(meta.getURL()),
-                    conf);
+                dclass = dictionaryClassForString(getProtocol(meta.getURL()), conf);
+            if (dclass != null && dclass.contains("MySQL")) {
+                // MariaDB returns "MySQL" for product name, need to verify by looking at product version.
+                dclass = dictionaryClassForString(meta.getDatabaseProductVersion(), conf);
+            }
             if (dclass == null)
                 dclass = DBDictionary.class.getName();
             return newDBDictionary(conf, dclass, props, conn);
@@ -225,6 +227,8 @@ public class DBDictionaryFactory {
             return dbdictionaryPlugin.unalias("sqlserver");
         if (prod.indexOf("jsqlconnect") != -1)
             return dbdictionaryPlugin.unalias("sqlserver");
+        if (prod.indexOf("mariadb") != -1)
+            return dbdictionaryPlugin.unalias("mariadb");
         if (prod.indexOf("mysql") != -1)
             return dbdictionaryPlugin.unalias("mysql");
         if (prod.indexOf("postgres") != -1)

Added: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MariaDBDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MariaDBDictionary.java?rev=1501805&view=auto
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MariaDBDictionary.java (added)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MariaDBDictionary.java Wed Jul 10 15:43:18 2013
@@ -0,0 +1,483 @@
+/*
+ * 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.jdbc.sql;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.openjpa.jdbc.identifier.DBIdentifier;
+import org.apache.openjpa.jdbc.identifier.DBIdentifier.DBIdentifierType;
+import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
+import org.apache.openjpa.jdbc.kernel.JDBCStore;
+import org.apache.openjpa.jdbc.kernel.exps.FilterValue;
+import org.apache.openjpa.jdbc.schema.Column;
+import org.apache.openjpa.jdbc.schema.ForeignKey;
+import org.apache.openjpa.jdbc.schema.Index;
+import org.apache.openjpa.jdbc.schema.PrimaryKey;
+import org.apache.openjpa.jdbc.schema.Table;
+import org.apache.openjpa.util.StoreException;
+
+/*
+ * 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.
+     */
+    public String tableType = "innodb";
+
+    /**
+     * Whether to use clobs; defaults to true. Set this to false if you have an
+     * old version of MySQL which does not handle clobs properly.
+     */
+    public boolean useClobs = true;
+
+    /**
+     * Whether the driver automatically deserializes blobs.
+     */
+    public boolean driverDeserializesBlobs = false;
+
+    /**
+     * 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
+     */
+    public boolean optimizeMultiTableDeletes = false;
+
+    public static final String tinyBlobTypeName = "TINYBLOB";
+    public static final String mediumBlobTypeName = "MEDIUMBLOB";
+    public static final String longBlobTypeName = "LONGBLOB";
+
+    public MariaDBDictionary() {
+        platform = "MariaDB";
+        validationSQL = "SELECT NOW()";
+        distinctCountColumnSeparator = ",";
+
+        supportsDeferredConstraints = false;
+        constraintNameMode = CONS_NAME_MID;
+        supportsMultipleNontransactionalResultSets = false;
+        requiresAliasForSubselect = true; // new versions
+        requiresTargetForDelete = true;
+        supportsSelectStartIndex = true;
+        supportsSelectEndIndex = true;
+
+        concatenateFunction = "CONCAT({0},{1})";
+
+        maxTableNameLength = 64;
+        maxColumnNameLength = 64;
+        maxIndexNameLength = 64;
+        maxConstraintNameLength = 64;
+        maxIndexesPerTable = 32;
+        schemaCase = SCHEMA_CASE_PRESERVE;
+
+        supportsAutoAssign = true;
+        lastGeneratedKeyQuery = "SELECT LAST_INSERT_ID()";
+        autoAssignClause = "AUTO_INCREMENT";
+
+        clobTypeName = "TEXT";
+        longVarcharTypeName = "TEXT";
+        longVarbinaryTypeName = "LONG VARBINARY";
+        timestampTypeName = "DATETIME";
+        xmlTypeName = "TEXT";
+        fixedSizeTypeNameSet.addAll(Arrays.asList(new String[]{
+            "BOOL", "LONG VARBINARY", "MEDIUMBLOB", "LONGBLOB",
+            "TINYBLOB", "LONG VARCHAR", "MEDIUMTEXT", "LONGTEXT", "TEXT",
+            "TINYTEXT", "DOUBLE PRECISION", "ENUM", "SET", "DATETIME",
+        }));
+        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", 
+        }));
+
+        // 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", 
+            "CHARACTER", "CHECK", "COLLATE", "COLUMN", "CONSTRAINT", "CONTINUE",
+            "CONVERT", "CREATE", "CROSS", "CURRENT_DATE", "CURRENT_TIME",
+            "CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR", "DEC", "DECIMAL",
+            "DECLARE", "DEFAULT", "DELETE", "DESC", "DESCRIBE", "DISTINCT",
+            "DOUBLE", "DROP", "ELSE", "END-EXEC", "EXISTS", "FALSE", "FETCH",
+            "FLOAT", "FLOAT4", "FOR", "FOREIGN", "FROM", "GRANT", "GROUP",
+            "HAVING", "IN", "INFILE", "INNER", "INSENSITIVE", "INSERT", "INT",
+            "INT1", "INT2", "INT4", "INTEGER", "INTERVAL", "INTO", "IS", "JOIN",
+            "KEY", "LEADING", "LEFT", "LIKE", "LOAD", "MATCH", "MEDIUMINT",
+            "NATURAL", "NOT", "NULL", "NUMERIC", "ON", "OPTION", "OR", "ORDER",
+            "OUTER", "OUTFILE", "PRECISION", "PRIMARY", "PROCEDURE", "READ",
+            "REAL", "REFERENCES", "REPLACE", "RESTRICT", "REVOKE", "RIGHT",
+            "SCHEMA", "SELECT", "SET", "SMALLINT", "SQL", "SQLSTATE",
+            "STARTING", "TABLE", "THEN", "TO", "TRAILING", "TRUE", "UNION",
+            "UNIQUE", "UNSIGNED", "UPDATE", "USAGE", "USING", "VALUES",
+            "VARCHAR", "VARYING", "WHEN", "WHERE", "WITH", "WRITE", "ZEROFILL",
+            "INDEX", 
+        }));
+
+        requiresSearchStringEscapeForLike = true;
+        // MariaDB requires double-escape for strings
+        searchStringEscape = "\\\\";
+
+        typeModifierSet.addAll(Arrays.asList(new String[] { "UNSIGNED",
+            "ZEROFILL" }));
+
+        setLeadingDelimiter(DELIMITER_BACK_TICK);
+        setTrailingDelimiter(DELIMITER_BACK_TICK);
+        
+        fixedSizeTypeNameSet.remove("NUMERIC");
+    }
+
+    @Override
+    public void connectedConfiguration(Connection conn) throws SQLException {
+        super.connectedConfiguration(conn);
+
+        DatabaseMetaData metaData = conn.getMetaData();
+        int maj = 0;
+        int min = 0;
+        try {
+            // The product version looks like 4.1.3-nt or 5.1.30
+            String productVersion = metaData.getDatabaseProductVersion();
+            int[] versions = getMajorMinorVersions(productVersion);
+            maj = versions[0];
+            min = versions[1];
+        } catch (IllegalArgumentException e) {
+            // we don't understand the version format.
+            // That is ok. We just take the default values.
+            if (log.isWarnEnabled())
+                log.warn(e.toString(), e);
+        }
+        
+        supportsXMLColumn = true;
+    }
+    
+    protected void setDelimitedCase(DatabaseMetaData metaData) {
+        // Determination of case sensitivity is not accurate; MariaDB JIRA CONJ-55
+        delimitedCase = SCHEMA_CASE_PRESERVE;
+    }
+
+    @Override
+    public Connection decorate(Connection conn)  throws SQLException {
+        conn = super.decorate(conn);
+        return conn;
+    }
+    
+    private static int[] getMajorMinorVersions(String versionStr)
+        throws IllegalArgumentException {
+        int beginIndex = 0;
+
+        versionStr = versionStr.trim();
+        char[] charArr = versionStr.toCharArray();
+        for (int i = 0; i < charArr.length; i++) {
+            if (Character.isDigit(charArr[i])) {
+                beginIndex = i;
+                break;
+            }
+        }
+
+        int endIndex = charArr.length;
+        for (int i = beginIndex+1; i < charArr.length; i++) {
+            if (charArr[i] != '.' && !Character.isDigit(charArr[i])) {
+                endIndex = i;
+                break;
+            }
+        }
+
+        String[] arr = versionStr.substring(beginIndex, endIndex).split("\\.");
+        if (arr.length < 2)
+            throw new IllegalArgumentException();
+
+        int maj = Integer.parseInt(arr[0]);
+        int min = Integer.parseInt(arr[1]);
+        return new int[]{maj, min};
+    }
+
+    @Override
+    public String[] getCreateTableSQL(Table table) {
+        String[] sql = super.getCreateTableSQL(table);
+        if (!StringUtils.isEmpty(tableType))
+            sql[0] = sql[0] + " ENGINE = " + tableType;
+        return sql;
+    }
+
+    @Override
+    public String[] getDropIndexSQL(Index index) {
+        return new String[]{ "DROP INDEX " + getFullName(index) + " ON "
+            + getFullName(index.getTable(), false) };
+    }
+
+    /**
+     * Return <code>ALTER TABLE &lt;table name&gt; DROP PRIMARY KEY</code>.
+     */
+    @Override
+    public String[] getDropPrimaryKeySQL(PrimaryKey pk) {
+        if (DBIdentifier.isNull(pk.getIdentifier()))
+            return new String[0];
+        return new String[]{ "ALTER TABLE "
+            + getFullName(pk.getTable(), false)
+            + " DROP PRIMARY KEY" };
+    }
+
+    /**
+     * Return <code>ALTER TABLE &lt;table name&gt; DROP FOREIGN KEY
+     * &lt;fk name&gt;</code>.
+     */
+    @Override
+    public String[] getDropForeignKeySQL(ForeignKey fk, Connection conn) {
+        if (DBIdentifier.isNull(fk.getIdentifier())) {
+            DBIdentifier fkName = fk.loadIdentifierFromDB(this,conn);
+            String[] retVal = (fkName == null) ?  new String[0] :
+                new String[]{ "ALTER TABLE "
+                + getFullName(fk.getTable(), false)
+                + " DROP FOREIGN KEY " + toDBName(fkName) };
+            return retVal;   
+        }
+        return new String[]{ "ALTER TABLE "
+            + getFullName(fk.getTable(), false)
+            + " DROP FOREIGN KEY " + toDBName(fk.getIdentifier()) };
+    }
+
+    @Override
+    public String[] getAddPrimaryKeySQL(PrimaryKey pk) {
+        String[] sql = super.getAddPrimaryKeySQL(pk);
+
+        // mysql requires that a column be declared NOT NULL before
+        // it can be made a primary key.
+        Column[] cols = pk.getColumns();
+        String[] ret = new String[cols.length + sql.length];
+        for (int i = 0; i < cols.length; i++) {
+            ret[i] = "ALTER TABLE " + getFullName(cols[i].getTable(), false)
+                + " CHANGE " + toDBName(cols[i].getIdentifier())
+                + " " + toDBName(cols[i].getIdentifier()) // name twice
+                + " " + getTypeName(cols[i]) + " NOT NULL";
+        }
+
+        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
+        if (!optimizeMultiTableDeletes)
+            return super.getDeleteTableContentsSQL(tables,conn);
+        else {
+            StringBuilder buf = new StringBuilder(tables.length * 8);
+            buf.append("DELETE FROM ");
+            for (int i = 0; i < tables.length; i++) {
+                buf.append(toDBName(tables[i].getFullIdentifier()));
+                if (i < tables.length - 1)
+                    buf.append(", ");
+            }
+            return new String[] { buf.toString() };
+        }
+    }
+
+    @Override
+    protected void appendSelectRange(SQLBuffer buf, long start, long end,
+        boolean subselect) {
+        buf.append(" LIMIT ").appendValue(start).append(", ");
+        if (end == Long.MAX_VALUE)
+            buf.appendValue(Long.MAX_VALUE);
+        else
+            buf.appendValue(end - start);
+    }
+
+    @Override
+    protected Column newColumn(ResultSet colMeta)
+        throws SQLException {
+        Column col = super.newColumn(colMeta);
+        if (col.isNotNull() && "0".equals(col.getDefaultString()))
+            col.setDefaultString(null);
+        return col;
+    }
+
+    @Override
+    public Object getBlobObject(ResultSet rs, int column, JDBCStore store)
+        throws SQLException {
+        // if the user has set a get-blob strategy explicitly or the driver
+        // does not automatically deserialize, delegate to super
+        if (useGetBytesForBlobs || useGetObjectForBlobs || !driverDeserializesBlobs)
+            return super.getBlobObject(rs, column, store);
+
+        // most mysql drivers deserialize on getObject
+        return rs.getObject(column);
+    }
+
+    @Override
+    public int getPreferredType(int type) {
+        if (type == Types.CLOB && !useClobs)
+            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
+     * @param rhs the right hand side of the comparison
+     * @param lhsxml indicates whether the left operand maps to XML
+     * @param rhsxml indicates whether the right operand maps to XML
+     */
+    @Override
+    public void appendXmlComparison(SQLBuffer buf, String op, FilterValue lhs,
+        FilterValue rhs, boolean lhsxml, boolean rhsxml) {
+        super.appendXmlComparison(buf, op, lhs, rhs, lhsxml, rhsxml);
+        if (lhsxml)
+            appendXmlValue(buf, lhs);
+        else
+            lhs.appendTo(buf);
+        buf.append(" ").append(op).append(" ");
+        if (rhsxml)
+            appendXmlValue(buf, rhs);
+        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
+     */
+    private void appendXmlValue(SQLBuffer buf, FilterValue val) {
+        buf.append("ExtractValue(").
+            append(val.getColumnAlias(val.getFieldMapping().getColumns()[0])).
+            append(",'/*/");
+        val.appendTo(buf);
+        buf.append("')");
+    }
+    
+    @Override
+    public int getBatchFetchSize(int batchFetchSize) {
+        return Integer.MIN_VALUE;
+    }
+
+    /**
+     * Check to see if we have set the {@link #SELECT_HINT} in the
+     * fetch configuration, and if so, append the MySQL hint after the
+     * "SELECT" part of the query.
+     */
+    @Override
+    public String getSelectOperation(JDBCFetchConfiguration fetch) {
+        Object hint = fetch == null ? null : fetch.getHint(SELECT_HINT);
+        String select = "SELECT";
+        if (hint != null)
+            select += " " + hint;
+        return select;
+    }
+    
+    @Override
+    protected Collection<String> getSelectTableAliases(Select sel) {
+        Set<String> result = new HashSet<String>();
+        List<String> selects = sel.getIdentifierAliases();
+        for (String s : selects) {
+            String tableAlias = s.substring(0, s.indexOf('.'));
+            result.add(tableAlias);
+        }
+        return result;
+    }
+    
+    @Override
+    protected int matchErrorState(Map<Integer,Set<String>> errorStates, SQLException ex) {
+        int state = super.matchErrorState(errorStates, ex);
+        
+        if (state == StoreException.GENERAL && 
+                ex.getNextException() != null &&
+                "JZ0002".equalsIgnoreCase(ex.getNextException().getSQLState())) {
+            if (conf != null && conf.getLockTimeout() != -1) {
+                state = StoreException.LOCK;
+            } else {
+                state = StoreException.QUERY;
+            }
+        }
+
+        return state;
+    }
+
+    @Override
+    public boolean isFatalException(int subtype, SQLException ex) {
+        if ((subtype == StoreException.LOCK  && ex.getErrorCode() == 1205)
+          ||(subtype == StoreException.LOCK  && "JZ0002".equalsIgnoreCase(ex.getSQLState()))
+          ||(subtype == StoreException.QUERY && ex.getErrorCode() == 1317)) {
+            return false;
+        }
+        if (ex.getErrorCode() == 0 && ex.getSQLState() == null)
+            return false;
+        return super.isFatalException(subtype, ex);
+    }
+
+    /**
+     * OPENJPA-740 Special case for MySql special column types,
+     * like LONGTEXT, LONGBLOG etc..
+     * @see org.apache.openjpa.jdbc.sql.DBDictionary#getTypeName(org.apache.openjpa.jdbc.schema.Column)
+     */
+    @Override
+    public String getTypeName(Column col) {
+        // 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
+            else if (col.getSize() <= 255)
+                return tinyBlobTypeName;
+            else if (col.getSize() <= 65535)
+                return blobTypeName;  // old default of 64KB
+            else if (col.getSize() <= 16777215)
+                return mediumBlobTypeName;
+            else
+                return longBlobTypeName;
+        } else {
+            return super.getTypeName(col);
+        }
+    }
+
+    @Override
+    public void indexOf(SQLBuffer buf, FilterValue str, FilterValue find,
+        FilterValue start) {
+        buf.append("LOCATE(");
+        find.appendTo(buf);
+        buf.append(", ");
+        str.appendTo(buf);
+        if (start != null) {
+            buf.append(", ");
+            start.appendTo(buf);
+        }
+        buf.append(")");
+    }
+}

Propchange: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MariaDBDictionary.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/conf/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/conf/localizer.properties?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/conf/localizer.properties (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/conf/localizer.properties Wed Jul 10 15:43:18 2013
@@ -206,7 +206,8 @@ ConnectionDriverName-values: org.hsqldb.
 	weblogic.jdbc.mssqlserver4.Driver,com.mysql.jdbc.DatabaseMetaData,\
 	org.gjt.mm.mysql.Driver,com.sap.dbtech.jdbc.DriverSapDB,\
 	com.sybase.jdbc2.jdbc.SybDriver,com.sybase.jdbc.SybDriver,\
-	com.internetcds.jdbc.tds.Driver,weblogic.jdbc.pool.Driver
+	com.internetcds.jdbc.tds.Driver,weblogic.jdbc.pool.Driver,\
+	org.mariadb.jdbc.Driver,org.mariadb.jdbc.DatabaseMetaData
 ConnectionURL-values: jdbc:JSQLConnect://<hostname>/database=<database>,\
 	jdbc:cloudscape:<database>;create=true,\
 	jdbc:twtds:sqlserver://<hostname>/<database>,\

Modified: openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/sql-error-state-codes.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/sql-error-state-codes.xml?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/sql-error-state-codes.xml (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/sql-error-state-codes.xml Wed Jul 10 15:43:18 2013
@@ -162,7 +162,16 @@
 		<optimistic></optimistic>
 		<query>70100</query>
 	</dictionary>
-	
+
+    <dictionary class="org.apache.openjpa.jdbc.sql.MariaDBDictionary">
+        <lock>41000</lock>
+        <referential-integrity>630,839,840,893,1062,1169,1215,1216,1217,1451,1452,1557</referential-integrity>
+        <object-exists>23000</object-exists>
+        <object-not-found></object-not-found>
+        <optimistic></optimistic>
+        <query>70100</query>
+    </dictionary>
+    	
 	<dictionary class="org.apache.openjpa.jdbc.sql.OracleDictionary">
 		<lock>42000,61000,72000</lock>
 		<referential-integrity>1,1400,1722,2291,2292</referential-integrity>

Modified: openjpa/trunk/openjpa-persistence-jdbc/pom.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/pom.xml?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/pom.xml (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/pom.xml Wed Jul 10 15:43:18 2013
@@ -118,6 +118,35 @@
                 <dbcp.minIdle>0</dbcp.minIdle>
             </properties>
         </profile>
+        
+        <!-- Profile for testing with MariaDB DB -->
+        <profile>
+            <id>test-mariadb</id>
+            <activation>
+                <property>
+                    <name>test-mariadb</name>
+                </property>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>mariadb</groupId>
+                    <artifactId>mariadb-connector-java</artifactId>
+                    <version>${mariadb.version}</version>
+                    <scope>test</scope>
+                </dependency>
+            </dependencies>
+            <properties>
+                <connection.driver.name>org.mariadb.jdbc.Driver</connection.driver.name>
+                <!--<connection.url>jdbc:mysql://localhost/OPENJPA</connection.url>-->
+                <connection.url>${openjpa.mariadb.url}</connection.url>
+                <connection.username>${openjpa.mariadb.username}</connection.username>
+                <connection.password>${openjpa.mariadb.password}</connection.password>
+                <jdbc.DBDictionary />
+                <!-- DBCP overrides for MariaDB testing -->
+                <dbcp.maxIdle>0</dbcp.maxIdle>
+                <dbcp.minIdle>0</dbcp.minIdle>
+            </properties>
+        </profile>
 
         <!-- Profile for testing with PostgreSQL DB -->
         <profile>

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCPersistenceProductDerivation.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCPersistenceProductDerivation.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCPersistenceProductDerivation.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCPersistenceProductDerivation.java Wed Jul 10 15:43:18 2013
@@ -29,6 +29,7 @@ import org.apache.openjpa.conf.OpenJPAPr
 import org.apache.openjpa.conf.Specification;
 import org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl;
 import org.apache.openjpa.jdbc.kernel.JDBCStoreManager;
+import org.apache.openjpa.jdbc.sql.MariaDBDictionary;
 import org.apache.openjpa.jdbc.sql.MySQLDictionary;
 import org.apache.openjpa.jdbc.sql.OracleDictionary;
 import org.apache.openjpa.lib.conf.AbstractProductDerivation;
@@ -127,6 +128,7 @@ public class JDBCPersistenceProductDeriv
         _hints.add("openjpa.FetchPlan.ResultSetType");
         _hints.add("openjpa.FetchPlan.SubclassFetchMode");
         
+        _hints.add(MariaDBDictionary.SELECT_HINT);
         _hints.add(MySQLDictionary.SELECT_HINT);
         _hints.add(OracleDictionary.SELECT_HINT);
         

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/conf/TestQueryHints.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/conf/TestQueryHints.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/conf/TestQueryHints.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/conf/TestQueryHints.java Wed Jul 10 15:43:18 2013
@@ -21,6 +21,7 @@ package org.apache.openjpa.conf;
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
 
+import org.apache.openjpa.jdbc.sql.MariaDBDictionary;
 import org.apache.openjpa.jdbc.sql.MySQLDictionary;
 import org.apache.openjpa.jdbc.sql.OracleDictionary;
 import org.apache.openjpa.kernel.QueryHints;
@@ -51,6 +52,7 @@ public class TestQueryHints extends Sing
     public void testSupportedHintsContainProductDerivationHints() {
         assertSupportedHint(OracleDictionary.SELECT_HINT, true);
         assertSupportedHint(MySQLDictionary.SELECT_HINT, true);
+        assertSupportedHint(MariaDBDictionary.SELECT_HINT, true);
     }
     
     public void testSupportedHintsContainFetchPlanHints() {

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/strats/AbstractLobTest.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/strats/AbstractLobTest.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/strats/AbstractLobTest.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/strats/AbstractLobTest.java Wed Jul 10 15:43:18 2013
@@ -31,6 +31,7 @@ import org.apache.commons.lang.StringUti
 import org.apache.openjpa.conf.OpenJPAConfiguration;
 import org.apache.openjpa.datacache.DataCachePCData;
 import org.apache.openjpa.jdbc.sql.DB2Dictionary;
+import org.apache.openjpa.jdbc.sql.MariaDBDictionary;
 import org.apache.openjpa.jdbc.sql.MySQLDictionary;
 import org.apache.openjpa.jdbc.sql.OracleDictionary;
 import org.apache.openjpa.jdbc.sql.SQLServerDictionary;

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/blob/mysql/TestBlobColumnType.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/blob/mysql/TestBlobColumnType.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/blob/mysql/TestBlobColumnType.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/blob/mysql/TestBlobColumnType.java Wed Jul 10 15:43:18 2013
@@ -23,6 +23,7 @@ import org.apache.openjpa.jdbc.identifie
 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;
 
@@ -41,7 +42,7 @@ public class TestBlobColumnType extends 
         // need to do this without BlobColumnEntity.class since it contains a column definition which might
         // not work with all databases. 
         super.setUp((Object) null);
-        if (!(getDBDictionary() instanceof MySQLDictionary)) {
+        if (!(getDBDictionary() instanceof MySQLDictionary || getDBDictionary() instanceof MariaDBDictionary)) {
             // normal teardown will take care of the EMF.
             return;
         }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/utils/AbstractTestCase.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/utils/AbstractTestCase.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/utils/AbstractTestCase.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/utils/AbstractTestCase.java Wed Jul 10 15:43:18 2013
@@ -106,6 +106,7 @@ public abstract class AbstractTestCase e
         EMPRESS,
         HYPERSONIC,
         POSTGRESQL,
+        MARIADB,
         MYSQL,
         SQLSERVER,
         DB2,

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=1501805&r1=1501804&r2=1501805&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 Wed Jul 10 15:43:18 2013
@@ -37,6 +37,7 @@ import org.apache.openjpa.jdbc.conf.JDBC
 import org.apache.openjpa.jdbc.sql.DBDictionary;
 import org.apache.openjpa.jdbc.sql.DerbyDictionary;
 import org.apache.openjpa.jdbc.sql.HSQLDictionary;
+import org.apache.openjpa.jdbc.sql.MariaDBDictionary;
 import org.apache.openjpa.jdbc.sql.MySQLDictionary;
 import org.apache.openjpa.jdbc.sql.OracleDictionary;
 import org.apache.openjpa.lib.jdbc.JDBCListener;
@@ -186,7 +187,7 @@ public abstract class AbstractCriteriaTe
                 cSQL.size());
         }
 
-        if (!(dict instanceof DerbyDictionary || dict instanceof MySQLDictionary))
+        if (!(dict instanceof DerbyDictionary || dict instanceof MySQLDictionary || dict instanceof MariaDBDictionary))
             return;
 
         for (int i = 0; i < jSQL.size(); i++) {
@@ -219,7 +220,7 @@ public abstract class AbstractCriteriaTe
             fail("JPQL " + jpql + " failed to execute\r\n" + w);
         }
 
-        if (!(dict instanceof DerbyDictionary || dict instanceof MySQLDictionary))
+        if (!(dict instanceof DerbyDictionary || dict instanceof MySQLDictionary || dict instanceof MariaDBDictionary))
             return;
 
         for (int i = 0; i < jSQL.size(); i++) {
@@ -242,7 +243,7 @@ public abstract class AbstractCriteriaTe
             fail(w.toString());
         }
 
-        if (!(dict instanceof DerbyDictionary || dict instanceof MySQLDictionary))
+        if (!(dict instanceof DerbyDictionary || dict instanceof MySQLDictionary || dict instanceof MariaDBDictionary))
             return;
 
         String jSql = jSQL.get(0).trim();

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/delimited/identifiers/noschema/TestNoSchemaManualDelimIdSeqGen.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/delimited/identifiers/noschema/TestNoSchemaManualDelimIdSeqGen.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/delimited/identifiers/noschema/TestNoSchemaManualDelimIdSeqGen.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/delimited/identifiers/noschema/TestNoSchemaManualDelimIdSeqGen.java Wed Jul 10 15:43:18 2013
@@ -20,6 +20,7 @@ package org.apache.openjpa.persistence.d
 
 import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
 import org.apache.openjpa.jdbc.sql.DBDictionary;
+import org.apache.openjpa.jdbc.sql.MariaDBDictionary;
 import org.apache.openjpa.jdbc.sql.MySQLDictionary;
 import org.apache.openjpa.persistence.OpenJPAEntityManager;
 import org.apache.openjpa.persistence.test.SQLListenerTestCase;
@@ -35,6 +36,7 @@ public class TestNoSchemaManualDelimIdSe
     @Override
     public void setUp() throws Exception {
 
+        setUnsupportedDatabases(MariaDBDictionary.class);
         setUnsupportedDatabases(MySQLDictionary.class);
         if (isTestsDisabled())
             return;

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/delimited/identifiers/noschema/TestNoSchemaManualDelimitedJoinAnnotations.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/delimited/identifiers/noschema/TestNoSchemaManualDelimitedJoinAnnotations.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/delimited/identifiers/noschema/TestNoSchemaManualDelimitedJoinAnnotations.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/delimited/identifiers/noschema/TestNoSchemaManualDelimitedJoinAnnotations.java Wed Jul 10 15:43:18 2013
@@ -24,6 +24,7 @@ import javax.persistence.Query;
 
 import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
 import org.apache.openjpa.jdbc.sql.DBDictionary;
+import org.apache.openjpa.jdbc.sql.MariaDBDictionary;
 import org.apache.openjpa.jdbc.sql.MySQLDictionary;
 import org.apache.openjpa.persistence.OpenJPAEntityManager;
 import org.apache.openjpa.persistence.test.SQLListenerTestCase;
@@ -42,6 +43,7 @@ public class TestNoSchemaManualDelimited
     @Override
     public void setUp() throws Exception {
         
+        setUnsupportedDatabases(MariaDBDictionary.class);
         setUnsupportedDatabases(MySQLDictionary.class);
         if (isTestsDisabled())
             return;

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/dynamicschema/TestDynamicSchemas.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/dynamicschema/TestDynamicSchemas.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/dynamicschema/TestDynamicSchemas.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/dynamicschema/TestDynamicSchemas.java Wed Jul 10 15:43:18 2013
@@ -116,6 +116,18 @@ public class TestDynamicSchemas extends 
         closeEMF(sqlserverEMF);
     }
 
+    
+    public void testMariaDBDynamicSchema() {
+        OpenJPAEntityManagerFactorySPI mysqlEMF = 
+            createEMF(EntityVeryLongNames.class, EntityReservedWords.class,
+                "openjpa.ConnectionURL", 
+                "jdbc:mysql://host1:1,host2:2/database?p1=v1&p2=v2",
+                "openjpa.jdbc.SynchronizeMappings", "export", 
+                "openjpa.jdbc.SchemaFactory", "dynamic", RETAIN_DATA);
+        validateTableName( mysqlEMF );
+        closeEMF(mysqlEMF);
+    }
+    
 
     public void testMySQLDynamicSchema() {
         OpenJPAEntityManagerFactorySPI mysqlEMF = 

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestMultipleSchemaNames.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestMultipleSchemaNames.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestMultipleSchemaNames.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/generationtype/TestMultipleSchemaNames.java Wed Jul 10 15:43:18 2013
@@ -28,6 +28,7 @@ import org.apache.openjpa.jdbc.conf.JDBC
 import org.apache.openjpa.jdbc.sql.DBDictionary;
 import org.apache.openjpa.jdbc.sql.H2Dictionary;
 import org.apache.openjpa.jdbc.sql.HSQLDictionary;
+import org.apache.openjpa.jdbc.sql.MariaDBDictionary;
 import org.apache.openjpa.jdbc.sql.MySQLDictionary;
 import org.apache.openjpa.jdbc.sql.OracleDictionary;
 import org.apache.openjpa.jdbc.sql.PostgresDictionary;
@@ -46,6 +47,7 @@ public class TestMultipleSchemaNames ext
         // Need to skip tests on some databases.
         // See createSchemas() comment at the bottom
         setUnsupportedDatabases(
+                MariaDBDictionary.class,
                 MySQLDictionary.class,
                 OracleDictionary.class,
                 SQLServerDictionary.class, 

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestHintedQuery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestHintedQuery.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestHintedQuery.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestHintedQuery.java Wed Jul 10 15:43:18 2013
@@ -25,6 +25,7 @@ import javax.persistence.Query;
 
 import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
 import org.apache.openjpa.jdbc.sql.DBDictionary;
+import org.apache.openjpa.jdbc.sql.MariaDBDictionary;
 import org.apache.openjpa.jdbc.sql.MySQLDictionary;
 import org.apache.openjpa.jdbc.sql.OracleDictionary;
 import org.apache.openjpa.persistence.jdbc.query.domain.TimeKeeper;
@@ -47,9 +48,11 @@ public class TestHintedQuery extends SQL
         em.getTransaction().commit();
 
         String jpql = "SELECT tk FROM TimeKeeper tk";
+        String mariadbHint = "SQL_NO_CACHE";
         String mysqlHint = "SQL_NO_CACHE";
         String oracleHint = "/*+ first_rows(100) */";
         Query query = em.createQuery(jpql);
+        query.setHint(MariaDBDictionary.SELECT_HINT, mariadbHint);
         query.setHint(MySQLDictionary.SELECT_HINT, mysqlHint);
         query.setHint(OracleDictionary.SELECT_HINT, oracleHint);
         List keepers = query.getResultList();
@@ -59,6 +62,10 @@ public class TestHintedQuery extends SQL
         // Other dictionaries should ignore them.
         DBDictionary dict = ((JDBCConfiguration) emf.getConfiguration())
             .getDBDictionaryInstance();
+        if (dict instanceof MariaDBDictionary) {
+            assertContainsSQL("SELECT " + mariadbHint + " ");
+            return;
+        }
         if (dict instanceof MySQLDictionary) {
             assertContainsSQL("SELECT " + mysqlHint + " ");
             return;
@@ -67,6 +74,7 @@ public class TestHintedQuery extends SQL
             assertContainsSQL("SELECT " + oracleHint + " ");
             return;
         }
+        assertNotSQL(".*" + mariadbHint + ".*");
         assertNotSQL(".*" + mysqlHint + ".*");
         assertNotSQL(".*" + oracleHint + ".*");
     }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/schema/TestLazySchemaFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/schema/TestLazySchemaFactory.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/schema/TestLazySchemaFactory.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/schema/TestLazySchemaFactory.java Wed Jul 10 15:43:18 2013
@@ -56,7 +56,8 @@ public class TestLazySchemaFactory
         // kodo uses
         JDBCConfiguration conf = (JDBCConfiguration) getConfiguration();
         _fks = conf.getDBDictionaryInstance().supportsForeignKeys
-            && getCurrentPlatform() != AbstractTestCase.Platform.MYSQL;
+            && getCurrentPlatform() != AbstractTestCase.Platform.MYSQL
+            && getCurrentPlatform() != AbstractTestCase.Platform.MARIADB;
 
         LazySchemaFactory factory = new LazySchemaFactory();
         factory.setConfiguration(conf);

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/unique/TestNamedUniqueConstraint.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/unique/TestNamedUniqueConstraint.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/unique/TestNamedUniqueConstraint.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/unique/TestNamedUniqueConstraint.java Wed Jul 10 15:43:18 2013
@@ -27,6 +27,7 @@ import javax.persistence.EntityManager;
 
 import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
 import org.apache.openjpa.jdbc.sql.DBDictionary;
+import org.apache.openjpa.jdbc.sql.MariaDBDictionary;
 import org.apache.openjpa.jdbc.sql.MySQLDictionary;
 import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
 import org.apache.openjpa.persistence.jdbc.SQLSniffer;
@@ -78,7 +79,7 @@ public class TestNamedUniqueConstraint e
     }
 
     private String getUniqueConstraint(String unique) {
-        if (dict instanceof MySQLDictionary) {
+        if (dict instanceof MySQLDictionary || dict instanceof MariaDBDictionary) {
             //CREATE TABLE N_UNIQUE_A (aid INTEGER NOT NULL, f1 INTEGER NOT NULL, f2 INTEGER NOT NULL, 
             //f3 INTEGER NOT NULL, f4 INTEGER NOT NULL, f5 INTEGER, f6 INTEGER, PRIMARY KEY (aid), 
             //UNIQUE U_N_UNQU__F1 (f1), 

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/unique/TestNamedUniqueConstraintWithXMLDescriptor.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/unique/TestNamedUniqueConstraintWithXMLDescriptor.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/unique/TestNamedUniqueConstraintWithXMLDescriptor.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/unique/TestNamedUniqueConstraintWithXMLDescriptor.java Wed Jul 10 15:43:18 2013
@@ -25,6 +25,7 @@ import javax.persistence.EntityManager;
 
 import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
 import org.apache.openjpa.jdbc.sql.DBDictionary;
+import org.apache.openjpa.jdbc.sql.MariaDBDictionary;
 import org.apache.openjpa.jdbc.sql.MySQLDictionary;
 import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
 import org.apache.openjpa.persistence.jdbc.SQLSniffer;
@@ -79,7 +80,7 @@ public class TestNamedUniqueConstraintWi
     }
 
     private String getUniqueConstraint(String unique) {
-        if (dict instanceof MySQLDictionary) {
+        if (dict instanceof MySQLDictionary || dict instanceof MariaDBDictionary) {
             //CREATE TABLE N_UNIQUE_A (aid INTEGER NOT NULL, f1 INTEGER NOT NULL, f2 INTEGER NOT NULL, 
             //f3 INTEGER NOT NULL, f4 INTEGER NOT NULL, f5 INTEGER, f6 INTEGER, PRIMARY KEY (aid), 
             //UNIQUE U_N_UNQU__F1 (f1), 

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestSpecialNumbers.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestSpecialNumbers.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestSpecialNumbers.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestSpecialNumbers.java Wed Jul 10 15:43:18 2013
@@ -122,6 +122,7 @@ public class TestSpecialNumbers extends 
         } catch (Exception e) {
             bug(EnumSet.of(AbstractTestCase.Platform.POSTGRESQL,
                 AbstractTestCase.Platform.DB2,
+                AbstractTestCase.Platform.MARIADB,
                 AbstractTestCase.Platform.MYSQL,
                 AbstractTestCase.Platform.DERBY), 494, e,
                 "Some datastores cannot store Float.MAX_VALUE");
@@ -142,7 +143,7 @@ public class TestSpecialNumbers extends 
                 AbstractTestCase.Platform.DERBY), 494, e,
                 "Some databases cannot store Float.MIN_VALUE");
         } catch (AssertionFailedError e) {
-            bug(EnumSet.of(AbstractTestCase.Platform.MYSQL,
+            bug(EnumSet.of(AbstractTestCase.Platform.MARIADB, AbstractTestCase.Platform.MYSQL,
                 AbstractTestCase.Platform.SQLSERVER), 494, e,
                 "Some databases cannot store Float.MIN_VALUE");
         }
@@ -167,6 +168,7 @@ public class TestSpecialNumbers extends 
         } catch (Exception e) {
             bug(EnumSet.of(AbstractTestCase.Platform.POINTBASE,
                 AbstractTestCase.Platform.POSTGRESQL,
+                AbstractTestCase.Platform.MARIADB,
                 AbstractTestCase.Platform.MYSQL,
                 AbstractTestCase.Platform.DB2,
                 AbstractTestCase.Platform.ORACLE,
@@ -186,6 +188,7 @@ public class TestSpecialNumbers extends 
         } catch (Exception e) {
             bug(EnumSet.of(AbstractTestCase.Platform.POINTBASE,
                 AbstractTestCase.Platform.POSTGRESQL,
+                AbstractTestCase.Platform.MARIADB,
                 AbstractTestCase.Platform.MYSQL,
                 AbstractTestCase.Platform.DB2,
                 AbstractTestCase.Platform.ORACLE,
@@ -204,6 +207,7 @@ public class TestSpecialNumbers extends 
                 new Double(Double.MAX_VALUE));
         } catch (Exception e) {
             bug(EnumSet.of(AbstractTestCase.Platform.POINTBASE,
+                AbstractTestCase.Platform.MARIADB,
                 AbstractTestCase.Platform.MYSQL,
                 AbstractTestCase.Platform.ORACLE,
                 AbstractTestCase.Platform.POSTGRESQL,
@@ -231,7 +235,7 @@ public class TestSpecialNumbers extends 
                 AbstractTestCase.Platform.DERBY), 494, e,
                 "Some databases cannot store Double.MIN_VALUE");
         } catch (AssertionFailedError e) {
-            bug(AbstractTestCase.Platform.MYSQL, 494, e,
+            bug(EnumSet.of(AbstractTestCase.Platform.MARIADB, AbstractTestCase.Platform.MYSQL), 494, e,
                 "Some databases cannot store Double.MIN_VALUE");
         }
     }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestSpecialNumbers2.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestSpecialNumbers2.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestSpecialNumbers2.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestSpecialNumbers2.java Wed Jul 10 15:43:18 2013
@@ -195,7 +195,7 @@ public class TestSpecialNumbers2 extends
                 AbstractTestCase.Platform.DERBY), 494, e,
                 "Some databases cannot store Double.MIN_VALUE");
         } catch (AssertionFailedError e) {
-            bug(AbstractTestCase.Platform.MYSQL, 494, e,
+            bug(EnumSet.of(AbstractTestCase.Platform.MARIADB, AbstractTestCase.Platform.MYSQL), 494, e,
                     "Some databases cannot store Double.MIN_VALUE");
         }
     }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/GroupingTestCase.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/GroupingTestCase.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/GroupingTestCase.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/GroupingTestCase.java Wed Jul 10 15:43:18 2013
@@ -124,7 +124,7 @@ public abstract class GroupingTestCase
             "from AllFieldTypes o"
             + " group by o.intField order by sum(o.shortField) asc");
         prepareQuery(q);
-        // this might fail in MySQL
+        // this might fail in MySQL/MariaDB
         List res = q.getResultList();
         assertEquals(2, res.size());
         Iterator itr = res.iterator();

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestSubquery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestSubquery.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestSubquery.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestSubquery.java Wed Jul 10 15:43:18 2013
@@ -26,6 +26,7 @@ import javax.persistence.Query;
 
 import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
 import org.apache.openjpa.jdbc.sql.DBDictionary;
+import org.apache.openjpa.jdbc.sql.MariaDBDictionary;
 import org.apache.openjpa.jdbc.sql.MySQLDictionary;
 import org.apache.openjpa.persistence.query.Customer.CreditRating;
 import org.apache.openjpa.persistence.test.SingleEMFTestCase;
@@ -255,7 +256,7 @@ public class TestSubquery
         // this at the bottom of the UPDATE documentation(http://dev.mysql.com/doc/refman/5.0/en/update.html): 
         // Currently, you cannot update a table and select from the same table in a subquery.
         
-        if (dict instanceof MySQLDictionary)
+        if (dict instanceof MySQLDictionary || dict instanceof MariaDBDictionary)
             return;
         
         em.getTransaction().begin();

Modified: openjpa/trunk/openjpa-persistence-locking/pom.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-locking/pom.xml?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-locking/pom.xml (original)
+++ openjpa/trunk/openjpa-persistence-locking/pom.xml Wed Jul 10 15:43:18 2013
@@ -127,6 +127,34 @@
                 <jdbc.DBDictionary />
             </properties>
         </profile>
+        
+        <!-- Profile for testing with MariaDB DB -->
+        <profile>
+            <id>test-mariadb</id>
+            <activation>
+                <property>
+                    <name>test-mariadb</name>
+                </property>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>mariadb</groupId>
+                    <artifactId>mariadb-connector-java</artifactId>
+                    <version>${mariadb.version}</version>
+                    <scope>test</scope>
+                </dependency>
+            </dependencies>
+            <properties>
+                <connection.driver.name>org.mariadb.jdbc.Driver</connection.driver.name>
+                <connection.url>${openjpa.mariadb.url}</connection.url>
+                <connection.username>${openjpa.mariadb.username}</connection.username>
+                <connection.password>${openjpa.mariadb.password}</connection.password>
+                <!-- DBCP overrides for MariaDB testing -->
+                <dbcp.maxIdle>0</dbcp.maxIdle>
+                <dbcp.minIdle>0</dbcp.minIdle>
+                <jdbc.DBDictionary />
+            </properties>
+        </profile>
 
         <!-- Profile for testing with PostgreSQL DB -->
         <profile>

Modified: openjpa/trunk/openjpa-persistence-locking/src/test/java/org/apache/openjpa/persistence/lock/extended/LockScopeTestCase.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-locking/src/test/java/org/apache/openjpa/persistence/lock/extended/LockScopeTestCase.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-locking/src/test/java/org/apache/openjpa/persistence/lock/extended/LockScopeTestCase.java (original)
+++ openjpa/trunk/openjpa-persistence-locking/src/test/java/org/apache/openjpa/persistence/lock/extended/LockScopeTestCase.java Wed Jul 10 15:43:18 2013
@@ -121,8 +121,8 @@ public abstract class LockScopeTestCase 
     }
 
     protected enum DBType {
-        access, db2, derby, empress, foxpro, h2, hsql, informix, ingres, jdatastore, mysql, oracle, pointbase, postgres,
-        sqlserver, sybase
+        access, db2, derby, empress, foxpro, h2, hsql, informix, ingres, jdatastore, mariadb, mysql, oracle, pointbase,
+        postgres, sqlserver, sybase
     };
 
     protected DBType getDBType(EntityManager em) {

Modified: openjpa/trunk/openjpa-persistence-locking/src/test/java/org/apache/openjpa/persistence/lockmgr/SequencedActionsTest.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-locking/src/test/java/org/apache/openjpa/persistence/lockmgr/SequencedActionsTest.java?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-locking/src/test/java/org/apache/openjpa/persistence/lockmgr/SequencedActionsTest.java (original)
+++ openjpa/trunk/openjpa-persistence-locking/src/test/java/org/apache/openjpa/persistence/lockmgr/SequencedActionsTest.java Wed Jul 10 15:43:18 2013
@@ -1040,8 +1040,8 @@ public abstract class SequencedActionsTe
     }
 
     protected enum DBType {
-        access, db2, derby, empress, foxpro, h2, hsql, informix, ingres, jdatastore, mysql, oracle, pointbase, postgres,
-        sqlserver, sybase
+        access, db2, derby, empress, foxpro, h2, hsql, informix, ingres, jdatastore, mariadb, mysql, oracle, pointbase,
+        postgres, sqlserver, sybase
     };
 
     protected DBType getDBType(EntityManager em) {

Modified: openjpa/trunk/openjpa-slice/src/test/resources/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-slice/src/test/resources/META-INF/persistence.xml?rev=1501805&r1=1501804&r2=1501805&view=diff
==============================================================================
--- openjpa/trunk/openjpa-slice/src/test/resources/META-INF/persistence.xml (original)
+++ openjpa/trunk/openjpa-slice/src/test/resources/META-INF/persistence.xml Wed Jul 10 15:43:18 2013
@@ -156,6 +156,29 @@
       </properties>
    </persistence-unit>
    
+   <persistence-unit name="mariadb">
+      <properties>
+         <property name="openjpa.BrokerFactory" value="slice"/>
+         <property name="openjpa.ConnectionDriverName" value="org.mariadb.jdbc.Driver"/>
+
+         <property name="openjpa.slice.Names" value="One,Two"/>
+         <property name="openjpa.slice.DistributionPolicy" value="org.apache.openjpa.slice.policy.UserDistributionPolicy"/>
+         
+         <property name="openjpa.ConnectionUserName"        value="root"/>
+         <property name="openjpa.ConnectionPassword"        value=""/>
+         <property name="openjpa.slice.One.ConnectionDriverName" value="org.mariadb.jdbc.Driver"/>
+         <property name="openjpa.slice.One.ConnectionURL" value="jdbc:mysql://localhost/slice1"/>
+         <property name="openjpa.slice.Two.ConnectionDriverName" value="org.mariadb.jdbc.Driver"/>
+         <property name="openjpa.slice.Two.ConnectionURL" value="jdbc:mysql://localhost/slice2"/>
+         
+         <property name="openjpa.Multithreaded" value="false"/>
+         <property name="openjpa.jdbc.SynchronizeMappings" value="refresh"/>
+         <property name="openjpa.jdbc.MappingDefaults" value="DefaultMissingInfo=true"/>
+            <property name="openjpa.RuntimeUnenhancedClasses" value="unsupported"/>
+            <property name="openjpa.DynamicEnhancementAgent"   value="false"/>
+      </properties>
+   </persistence-unit>
+   
    <persistence-unit name="replication">
    	  <class>org.apache.openjpa.slice.ReplicatedParent</class>
    	  <class>org.apache.openjpa.slice.ReplicatedChild</class>
@@ -231,6 +254,27 @@
       </properties>
    </persistence-unit>
    
+   <persistence-unit name="car.mariadb">
+      <properties>
+         <property name="openjpa.BrokerFactory" value="slice"/>
+         <property name="openjpa.ConnectionDriverName" value="org.mariadb.jdbc.Driver"/>
+
+         <property name="openjpa.slice.Names" value="BMW,Honda,Ford"/>
+         
+         <property name="openjpa.ConnectionUserName"        value="root"/>
+         <property name="openjpa.ConnectionPassword"        value=""/>
+         <property name="openjpa.slice.BMW.ConnectionURL" value="jdbc:mysql://localhost/bmw"/>
+         <property name="openjpa.slice.Honda.ConnectionURL" value="jdbc:mysql://localhost/ford"/>
+         <property name="openjpa.slice.Ford.ConnectionURL" value="jdbc:mysql://localhost/honda"/>
+         
+         <property name="openjpa.Multithreaded" value="false"/>
+         <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=native)"/>
+         <property name="openjpa.jdbc.MappingDefaults" value="DefaultMissingInfo=true"/>
+         <property name="openjpa.RuntimeUnenhancedClasses" value="unsupported"/>
+         <property name="openjpa.DynamicEnhancementAgent"   value="false"/>
+      </properties>
+   </persistence-unit>
+   
    <persistence-unit name="perf.mysql.slice">
    		<class>org.apache.openjpa.slice.Person</class>
    		<class>org.apache.openjpa.slice.Address</class>
@@ -277,4 +321,51 @@
          <property name="openjpa.DynamicEnhancementAgent"   value="false"/>
       </properties>
    </persistence-unit>
+   
+   <persistence-unit name="perf.mariadb.slice">
+        <class>org.apache.openjpa.slice.Person</class>
+        <class>org.apache.openjpa.slice.Address</class>
+        <class>org.apache.openjpa.slice.Country</class>
+        
+      <properties>
+         <property name="openjpa.BrokerFactory" value="slice"/>
+         <property name="openjpa.ConnectionDriverName" value="org.apache.commons.dbcp.BasicDataSource"/>
+
+         <property name="openjpa.slice.Names" value="S1,S2,S3,S4"/>
+         
+         <property name="openjpa.ConnectionUserName"        value="root"/>
+         <property name="openjpa.ConnectionPassword"        value=""/>
+         <property name="openjpa.slice.S1.ConnectionProperties" value="DriverClassName=org.mariadb.jdbc.Driver,Url=jdbc:mysql://localhost/S1,MaxActive=4"/>
+         <property name="openjpa.slice.S2.ConnectionProperties" value="DriverClassName=org.mariadb.jdbc.Driver,Url=jdbc:mysql://localhost/S2,MaxActive=4"/>
+         <property name="openjpa.slice.S3.ConnectionProperties" value="DriverClassName=org.mariadb.jdbc.Driver,Url=jdbc:mysql://localhost/S3,MaxActive=4"/>
+         <property name="openjpa.slice.S4.ConnectionProperties" value="DriverClassName=org.mariadb.jdbc.Driver,Url=jdbc:mysql://localhost/S4,MaxActive=4"/>
+         
+         <property name="openjpa.jdbc.DBDictionary"        value="mariadb"/>
+         <property name="openjpa.Multithreaded" value="false"/>
+         <property name="openjpa.jdbc.SynchronizeMappings" value="refresh"/>
+         <property name="openjpa.jdbc.MappingDefaults" value="DefaultMissingInfo=true"/>
+         <property name="openjpa.RuntimeUnenhancedClasses" value="unsupported"/>
+         <property name="openjpa.DynamicEnhancementAgent"   value="false"/>
+      </properties>
+   </persistence-unit>
+   <persistence-unit name="perf.mariadb.mono">
+        <class>org.apache.openjpa.slice.Person</class>
+        <class>org.apache.openjpa.slice.Address</class>
+        <class>org.apache.openjpa.slice.Country</class>
+        
+      <properties>
+         <property name="openjpa.ConnectionDriverName" value="org.apache.commons.dbcp.BasicDataSource"/>
+         
+         <property name="openjpa.ConnectionUserName"        value="root"/>
+         <property name="openjpa.ConnectionPassword"        value=""/>
+         <property name="openjpa.ConnectionProperties" value="DriverClassName=org.mariadb.jdbc.Driver,Url=jdbc:mysql://localhost/S,MaxActive=4"/>
+         
+         <property name="openjpa.jdbc.DBDictionary"        value="mariadb"/>
+         <property name="openjpa.Multithreaded" value="false"/>
+         <property name="openjpa.jdbc.SynchronizeMappings" value="refresh"/>
+         <property name="openjpa.jdbc.MappingDefaults" value="DefaultMissingInfo=true"/>
+         <property name="openjpa.RuntimeUnenhancedClasses" value="unsupported"/>
+         <property name="openjpa.DynamicEnhancementAgent"   value="false"/>
+      </properties>
+   </persistence-unit>
 </persistence>