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 <[email protected]> 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>
