Changeset: bf521f343172 for monetdb-java URL: https://dev.monetdb.org/hg/monetdb-java?cmd=changeset;node=bf521f343172 Modified Files: ChangeLog src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java src/main/java/nl/cwi/monetdb/jdbc/MonetDriver.java.in src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java Branch: default Log Message:
Added support for new Java 8 java.sql.Types: Types.TIME_WITH_TIMEZONE and Types.TIMESTAMP_WITH_TIMEZONE. diffs (262 lines): diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,10 @@ # ChangeLog file for monetdb-java # This file is updated with Maddlog +* Wed Oct 7 2020 Martin van Dinther <martin.van.dint...@monetdbsolutions.com> +- Added support for new Java 8 java.sql.Types: Types.TIME_WITH_TIMEZONE and + Types.TIMESTAMP_WITH_TIMEZONE. + * Wed Sep 23 2020 Martin van Dinther <martin.van.dint...@monetdbsolutions.com> - Updated JDBC driver to comply with JDBC 4.2 interface now we compile for Java 8. This includes: diff --git a/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java b/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java --- a/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java +++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java @@ -638,7 +638,9 @@ public class MonetDatabaseMetaData case Types.BLOB: case Types.DATE: case Types.TIME: + case Types.TIME_WITH_TIMEZONE: case Types.TIMESTAMP: + case Types.TIMESTAMP_WITH_TIMEZONE: return true; } // conversion to all other types is not supported @@ -651,22 +653,26 @@ public class MonetDatabaseMetaData case Types.CLOB: case Types.DATE: case Types.TIMESTAMP: + case Types.TIMESTAMP_WITH_TIMEZONE: return true; } // conversion to all other types is not supported return false; case Types.TIME: + case Types.TIME_WITH_TIMEZONE: switch (toType) { case Types.CHAR: case Types.VARCHAR: /* case Types.LONGVARCHAR: is not supported by MonetDB and will fail */ case Types.CLOB: case Types.TIME: + case Types.TIME_WITH_TIMEZONE: return true; } // conversion to all other types is not supported return false; case Types.TIMESTAMP: + case Types.TIMESTAMP_WITH_TIMEZONE: switch (toType) { case Types.CHAR: case Types.VARCHAR: @@ -674,7 +680,9 @@ public class MonetDatabaseMetaData case Types.CLOB: case Types.DATE: case Types.TIME: + case Types.TIME_WITH_TIMEZONE: case Types.TIMESTAMP: + case Types.TIMESTAMP_WITH_TIMEZONE: return true; } // conversion to all other types is not supported diff --git a/src/main/java/nl/cwi/monetdb/jdbc/MonetDriver.java.in b/src/main/java/nl/cwi/monetdb/jdbc/MonetDriver.java.in --- a/src/main/java/nl/cwi/monetdb/jdbc/MonetDriver.java.in +++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetDriver.java.in @@ -323,7 +323,7 @@ final public class MonetDriver implement /** A static Map containing the mapping between MonetDB types and Java SQL types */ /* use SELECT sqlname, * FROM sys.types order by 1, id; to view all MonetDB types */ - /* see http://docs.oracle.com/javase/7/docs/api/java/sql/Types.html to view all supported java SQL types */ + /* see http://docs.oracle.com/javase/8/docs/api/java/sql/Types.html to view all supported java SQL types */ private static final java.util.Map<String, Integer> typeMap = new java.util.HashMap<String, Integer>(); static { // fill the typeMap once @@ -354,10 +354,8 @@ final public class MonetDriver implement // typeMap.put("table", Integer.valueOf(Types.???)); typeMap.put("time", Integer.valueOf(Types.TIME)); typeMap.put("timestamp", Integer.valueOf(Types.TIMESTAMP)); - typeMap.put("timestamptz", Integer.valueOf(Types.TIMESTAMP)); -// new in Java 8: Types.TIMESTAMP_WITH_TIMEZONE (value 2014). Can't use it yet as we compile for java 7 - typeMap.put("timetz", Integer.valueOf(Types.TIME)); -// new in Java 8: Types.TIME_WITH_TIMEZONE (value 2013). Can't use it yet as we compile for java 7 + typeMap.put("timestamptz", Integer.valueOf(Types.TIMESTAMP_WITH_TIMEZONE)); // new in Java 8: Types.TIMESTAMP_WITH_TIMEZONE (value 2014) + typeMap.put("timetz", Integer.valueOf(Types.TIME_WITH_TIMEZONE)); // new in Java 8: Types.TIME_WITH_TIMEZONE (value 2013) typeMap.put("tinyint", Integer.valueOf(Types.TINYINT)); typeMap.put("url", Integer.valueOf(Types.VARCHAR)); typeMap.put("uuid", Integer.valueOf(Types.VARCHAR)); diff --git a/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java b/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java --- a/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java +++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetPreparedStatement.java @@ -505,11 +505,13 @@ public class MonetPreparedStatement return false; } return true; - case Types.BIT: // we don't use type BIT, it's here for completeness - case Types.BOOLEAN: - case Types.DATE: - case Types.TIME: - case Types.TIMESTAMP: + // All other types should return false + // case Types.BOOLEAN: + // case Types.DATE: + // case Types.TIME: + // case Types.TIME_WITH_TIMEZONE: + // case Types.TIMESTAMP: + // case Types.TIMESTAMP_WITH_TIMEZONE: default: return false; } @@ -841,11 +843,13 @@ public class MonetPreparedStatement return false; } return true; - case Types.BIT: // we don't use type BIT, it's here for completeness - case Types.BOOLEAN: - case Types.DATE: - case Types.TIME: - case Types.TIMESTAMP: + // All other types should return false + // case Types.BOOLEAN: + // case Types.DATE: + // case Types.TIME: + // case Types.TIME_WITH_TIMEZONE: + // case Types.TIMESTAMP: + // case Types.TIMESTAMP_WITH_TIMEZONE: default: return false; } @@ -1945,6 +1949,7 @@ public class MonetPreparedStatement } break; case Types.TIME: + case Types.TIME_WITH_TIMEZONE: if (x instanceof Time) { setTime(parameterIndex, (Time)x); } else if (x instanceof Timestamp) { @@ -1960,6 +1965,7 @@ public class MonetPreparedStatement } break; case Types.TIMESTAMP: + case Types.TIMESTAMP_WITH_TIMEZONE: if (x instanceof Timestamp) { setTimestamp(parameterIndex, (Timestamp)x); } else if (x instanceof java.sql.Date) { @@ -2332,17 +2338,19 @@ public class MonetPreparedStatement break; case Types.DATE: case Types.TIME: + case Types.TIME_WITH_TIMEZONE: case Types.TIMESTAMP: + case Types.TIMESTAMP_WITH_TIMEZONE: try { // check if the string represents a valid calendar date or time or timestamp to prevent // failing exec #(..., ...) calls which destroy the prepared statement, see bug 6351 if (paramJdbcType == Types.DATE) { java.sql.Date datum = java.sql.Date.valueOf(x); } else - if (paramJdbcType == Types.TIME) { + if (paramJdbcType == Types.TIME || paramJdbcType == Types.TIME_WITH_TIMEZONE) { Time tijdstip = Time.valueOf(x); } else - if (paramJdbcType == Types.TIMESTAMP) { + if (paramJdbcType == Types.TIMESTAMP || paramJdbcType == Types.TIMESTAMP_WITH_TIMEZONE) { Timestamp tijdstip = Timestamp.valueOf(x); } } catch (IllegalArgumentException iae) { diff --git a/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java b/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java --- a/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java +++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java @@ -1433,11 +1433,13 @@ public class MonetResultSet return false; } return true; - case Types.BIT: // we don't use type BIT, it's here for completeness - case Types.BOOLEAN: - case Types.DATE: - case Types.TIME: - case Types.TIMESTAMP: + // All other types should return false + // case Types.BOOLEAN: + // case Types.DATE: + // case Types.TIME: + // case Types.TIME_WITH_TIMEZONE: + // case Types.TIMESTAMP: + // case Types.TIMESTAMP_WITH_TIMEZONE: default: return false; } @@ -1573,9 +1575,11 @@ public class MonetResultSet _precision[column] = 10; break; case Types.TIME: + case Types.TIME_WITH_TIMEZONE: _precision[column] = 8; break; case Types.TIMESTAMP: + case Types.TIMESTAMP_WITH_TIMEZONE: _precision[column] = 19; break; default: @@ -1943,8 +1947,10 @@ public class MonetResultSet case Types.DATE: return getDate(columnIndex, null); case Types.TIME: + case Types.TIME_WITH_TIMEZONE: return getTime(columnIndex, null); case Types.TIMESTAMP: + case Types.TIMESTAMP_WITH_TIMEZONE: return getTimestamp(columnIndex, null); case Types.BINARY: case Types.VARBINARY: @@ -2257,8 +2263,10 @@ public class MonetResultSet case Types.DATE: return java.sql.Date.class; case Types.TIME: + case Types.TIME_WITH_TIMEZONE: return Time.class; case Types.TIMESTAMP: + case Types.TIMESTAMP_WITH_TIMEZONE: return Timestamp.class; case Types.CLOB: return Clob.class; @@ -2572,7 +2580,8 @@ public class MonetResultSet JdbcType = type; } - if ((JdbcType == Types.DATE || JdbcType == Types.TIMESTAMP) && monetDateStr.startsWith("-")) { + if ((JdbcType == Types.DATE || JdbcType == Types.TIMESTAMP || JdbcType == Types.TIMESTAMP_WITH_TIMEZONE) + && monetDateStr.startsWith("-")) { // the SimpleDateFormat parsers do not support to parse negative year numbers, deal with it separately negativeYear = true; monetDate = monetDateStr.substring(1); @@ -2608,6 +2617,7 @@ public class MonetResultSet pdate = dateFormat.parse(monetDate, ppos); break; case Types.TIME: + case Types.TIME_WITH_TIMEZONE: if (timeFormat == null) { // first time usage, create and keep the timeFormat object for next usage timeFormat = new SimpleDateFormat("HH:mm:ss"); @@ -2616,6 +2626,7 @@ public class MonetResultSet pdate = timeFormat.parse(monetDate, ppos); break; case Types.TIMESTAMP: + case Types.TIMESTAMP_WITH_TIMEZONE: if (timestampFormat == null) { // first time usage, create and keep the timestampFormat object for next usage timestampFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @@ -2660,7 +2671,10 @@ public class MonetResultSet // System.out.println("Corrected cal: " + cal.toString()); } - if (JdbcType == Types.TIME || JdbcType == Types.TIMESTAMP) { + if (JdbcType == Types.TIME + || JdbcType == Types.TIME_WITH_TIMEZONE + || JdbcType == Types.TIMESTAMP + || JdbcType == Types.TIMESTAMP_WITH_TIMEZONE) { // parse additional nanos (if any) int nanos = 0; int pos = ppos.getIndex(); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list