You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by st...@apache.org on 2021/04/03 07:31:12 UTC

[openjpa] 02/02: OPENJPA-2856 improve MariaDB TIME handling

This is an automated email from the ASF dual-hosted git repository.

struberg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openjpa.git

commit ab8090f5566c68fd3d46600158527de14ce622f2
Author: Mark Struberg <st...@apache.org>
AuthorDate: Sat Apr 3 08:42:28 2021 +0200

    OPENJPA-2856 improve MariaDB TIME handling
    
    * java.sql.Time parameters must be on date Jan 1st 1970, otherwise MariaDB won't find anything in the DB
    * from > 10 onwards MariaDB supports up to 6 fractions in TIME as well.
---
 .../apache/openjpa/jdbc/sql/MariaDBDictionary.java | 23 ++++++++++++++++++++++
 .../TestTemporalTypeQueryParameterBinding.java     |  2 +-
 pom.xml                                            |  4 ++--
 3 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MariaDBDictionary.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MariaDBDictionary.java
index c377954..30adc89 100644
--- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MariaDBDictionary.java
+++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MariaDBDictionary.java
@@ -20,11 +20,15 @@ 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.Time;
 import java.sql.Types;
 import java.util.Arrays;
+import java.util.Calendar;
 import java.util.Collection;
+import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -196,6 +200,13 @@ public class MariaDBDictionary extends DBDictionary {
             timestampTypeName = "DATETIME{0}";
             fixedSizeTypeNameSet.remove(timestampTypeName);
             fractionalTypeNameSet.add(timestampTypeName);
+
+            // also TIME type now has optional fraction digits
+
+            if (dateFractionDigits > 0 ) {
+                timeTypeName = "TIME{0}";
+                fractionalTypeNameSet.add(timeTypeName);
+            }
         }
     }
 
@@ -516,4 +527,16 @@ public class MariaDBDictionary extends DBDictionary {
         }
         buf.append(")");
     }
+
+    @Override
+    public void setTime(PreparedStatement stmnt, int idx, Time val, Calendar cal, Column col) throws SQLException {
+        // nail down to Jan 1st 1970, because MariaDB uses getTime LONG  and freaks out.
+        final Date date = new Date(val.getTime());
+        date.setYear(70);
+        date.setMonth(0);
+        date.setDate(1);
+        val = new Time(date.getTime());
+
+        super.setTime(stmnt, idx, val, cal, col);
+    }
 }
diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestTemporalTypeQueryParameterBinding.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestTemporalTypeQueryParameterBinding.java
index 923c19d..634c7c7 100644
--- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestTemporalTypeQueryParameterBinding.java
+++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestTemporalTypeQueryParameterBinding.java
@@ -67,6 +67,7 @@ public class TestTemporalTypeQueryParameterBinding extends SingleEMFTestCase {
                 "openjpa.jdbc.DBDictionary", "(dateFractionDigits=6)",
                 TimeKeeper.class, TimeEntity.class);
         em = emf.createEntityManager();
+        em.getTransaction().begin();
 
         TimeKeeper pc = new TimeKeeper();
         pc.setDate(VALUE_DATE);
@@ -83,7 +84,6 @@ public class TestTemporalTypeQueryParameterBinding extends SingleEMFTestCase {
         te.setUDate2Time(VALUE_DATE);
         te.setUDate2Timestamp(VALUE_DATE);
 
-        em.getTransaction().begin();
         em.persist(pc);
         em.persist(te);
         em.getTransaction().commit();
diff --git a/pom.xml b/pom.xml
index 6cc2591..139b31f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -77,7 +77,7 @@
         <derby.version>10.14.2.0</derby.version>
         <hsqldb.version>2.4.1</hsqldb.version>
         <mysql.connector.version>5.1.47</mysql.connector.version>
-        <mariadb.connector.version>2.2.0</mariadb.connector.version>
+        <mariadb.connector.version>2.7.2</mariadb.connector.version>
         <postgresql.connector.version>42.2.9</postgresql.connector.version>
         <mssql.connector.version>9.2.1.jre8</mssql.connector.version>
 
@@ -718,7 +718,7 @@
                 <dbcp.maxIdle>5</dbcp.maxIdle>
                 <dbcp.minIdle>0</dbcp.minIdle>
 
-                <mariadb.server.version>10.3</mariadb.server.version>
+                <mariadb.server.version>10.5</mariadb.server.version>
             </properties>
 
             <build>