Changeset: 674f9ed21308 for monetdb-java URL: https://dev.monetdb.org/hg/monetdb-java/rev/674f9ed21308 Modified Files: ChangeLog src/main/java/org/monetdb/jdbc/MonetParameterMetaData.java src/main/java/org/monetdb/jdbc/MonetResultSetMetaData.java tests/JDBC_API_Tester.java Branch: default Log Message:
Improved ResultSetMetaData.getColumnTypeName() and ParameterMetaData.getParameterTypeName() for interval types. It now returns more precise information for the 13 possible interval data types. Also extended test Test_Interval_Types() to test all 13 interval types, both as result column and as parameter. diffs (190 lines): diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,11 @@ # ChangeLog file for monetdb-java # This file is updated with Maddlog +* Thu Apr 4 2024 Martin van Dinther <martin.van.dint...@monetdbsolutions.com> +- Improved ResultSetMetaData.getColumnTypeName() and + ParameterMetaData.getParameterTypeName() for interval types. It now + returns more precise information for the interval data types. + * Thu Mar 7 2024 Martin van Dinther <martin.van.dint...@monetdbsolutions.com> - Improved DatabaseMetaData.getTypeInfo(). It now also returns the serial and bigserial data types and all 13 possible interval data types. diff --git a/src/main/java/org/monetdb/jdbc/MonetParameterMetaData.java b/src/main/java/org/monetdb/jdbc/MonetParameterMetaData.java --- a/src/main/java/org/monetdb/jdbc/MonetParameterMetaData.java +++ b/src/main/java/org/monetdb/jdbc/MonetParameterMetaData.java @@ -293,12 +293,30 @@ final class MonetParameterMetaData final String monettype = monetdbTypes[param]; if (monettype != null && monettype.endsWith("_interval")) { /* convert the interval type names to valid SQL data type names */ - if ("day_interval".equals(monettype)) - return "interval day"; - if ("month_interval".equals(monettype)) - return "interval month"; - if ("sec_interval".equals(monettype)) - return "interval second"; + switch (precisions[param]) { + case 1: return "interval year"; + case 2: return "interval year to month"; + case 3: return "interval month"; + case 4: return "interval day"; + case 5: return "interval day to hour"; + case 6: return "interval day to minute"; + case 7: return "interval day to second"; + case 8: return "interval hour"; + case 9: return "interval hour to minute"; + case 10: return "interval hour to second"; + case 11: return "interval minute"; + case 12: return "interval minute to second"; + case 13: return "interval second"; + default: + { // fall back to the 3 available monettype names + if ("day_interval".equals(monettype)) + return "interval day"; + if ("month_interval".equals(monettype)) + return "interval month"; + if ("sec_interval".equals(monettype)) + return "interval second"; + } + } } return monettype; } catch (IndexOutOfBoundsException e) { diff --git a/src/main/java/org/monetdb/jdbc/MonetResultSetMetaData.java b/src/main/java/org/monetdb/jdbc/MonetResultSetMetaData.java --- a/src/main/java/org/monetdb/jdbc/MonetResultSetMetaData.java +++ b/src/main/java/org/monetdb/jdbc/MonetResultSetMetaData.java @@ -543,12 +543,34 @@ final class MonetResultSetMetaData /* convert the interval type names to valid SQL data type names, * such that generic applications can use them in create table statements */ - if ("day_interval".equals(monettype)) - return "interval day"; - if ("month_interval".equals(monettype)) - return "interval month"; - if ("sec_interval".equals(monettype)) - return "interval second"; + int prec = -1; + if (precisions != null) { + prec = precisions[column - 1]; + } + switch (prec) { + case 1: return "interval year"; + case 2: return "interval year to month"; + case 3: return "interval month"; + case 4: return "interval day"; + case 5: return "interval day to hour"; + case 6: return "interval day to minute"; + case 7: return "interval day to second"; + case 8: return "interval hour"; + case 9: return "interval hour to minute"; + case 10: return "interval hour to second"; + case 11: return "interval minute"; + case 12: return "interval minute to second"; + case 13: return "interval second"; + default: // when no precisions array was available + { // fall back to the 3 available monettype names + if ("day_interval".equals(monettype)) + return "interval day"; + if ("month_interval".equals(monettype)) + return "interval month"; + if ("sec_interval".equals(monettype)) + return "interval second"; + } + } } return monettype; } catch (IndexOutOfBoundsException e) { diff --git a/tests/JDBC_API_Tester.java b/tests/JDBC_API_Tester.java --- a/tests/JDBC_API_Tester.java +++ b/tests/JDBC_API_Tester.java @@ -47,7 +47,7 @@ final public class JDBC_API_Tester { private boolean isPostDec2023; // flag to support version specific output private boolean foundDifferences = false; - final private static int sbInitLen = 5224; + final private static int sbInitLen = 5442; /** * constructor @@ -1821,7 +1821,13 @@ final public class JDBC_API_Tester { PreparedStatement pstmt = null; try { stmt = con.createStatement(); - stmt.executeUpdate("create table Test_Interval_Types (c1 interval day, c2 interval month, c3 interval second)"); + stmt.executeUpdate("create table Test_Interval_Types (" + + "c1 interval year, c2 interval month, c3 interval day, " + + "c4 interval hour, c5 interval minute, c6 interval second, " + + "c7 interval year to month, c8 interval day to hour, " + + "c9 interval day to minute, c10 interval day to second, " + + "c11 interval hour to minute, c12 interval hour to second, " + + "c13 interval minute to second)"); rs = stmt.executeQuery("select * from Test_Interval_Types"); if (rs != null) { sb.append("Showing query ResultSetMetaData\n"); @@ -1840,7 +1846,8 @@ final public class JDBC_API_Tester { rs.close(); rs = null; } - pstmt = con.prepareStatement("select * from Test_Interval_Types where c1 = ? or c2 = ? or c3 = ?"); + pstmt = con.prepareStatement("select * from Test_Interval_Types where " + + "c1=? or c2=? or c3=? or c4=? or c5=? or c6=? or c7=? or c8=? or c9=? or c10=? or c11=? or c12=? or c13=?"); if (pstmt != null) { sb.append("Showing prepared query ResultSetMetaData\n"); ResultSetMetaData rsmd = pstmt.getMetaData(); @@ -1884,17 +1891,47 @@ final public class JDBC_API_Tester { compareExpectedOutput("Test_Interval_Types", "Showing query ResultSetMetaData\n" + - "ColumnName: c1 ColumnTypeName: interval day Precision: 4 Scale: 0 ColumnDisplaySize: 5 ColumnType: 2 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c1 ColumnTypeName: interval year Precision: 10 Scale: 0 ColumnDisplaySize: 1 ColumnType: 4 ColumnClassName: java.lang.Integer\n" + "ColumnName: c2 ColumnTypeName: interval month Precision: 10 Scale: 0 ColumnDisplaySize: 1 ColumnType: 4 ColumnClassName: java.lang.Integer\n" + - "ColumnName: c3 ColumnTypeName: interval second Precision: 13 Scale: 3 ColumnDisplaySize: 5 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c3 ColumnTypeName: interval day Precision: 4 Scale: 0 ColumnDisplaySize: 5 ColumnType: 2 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c4 ColumnTypeName: interval hour Precision: 8 Scale: 3 ColumnDisplaySize: 5 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c5 ColumnTypeName: interval minute Precision: 11 Scale: 3 ColumnDisplaySize: 5 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c6 ColumnTypeName: interval second Precision: 13 Scale: 3 ColumnDisplaySize: 5 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c7 ColumnTypeName: interval year to month Precision: 10 Scale: 0 ColumnDisplaySize: 1 ColumnType: 4 ColumnClassName: java.lang.Integer\n" + + "ColumnName: c8 ColumnTypeName: interval day to hour Precision: 5 Scale: 3 ColumnDisplaySize: 5 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c9 ColumnTypeName: interval day to minute Precision: 6 Scale: 3 ColumnDisplaySize: 5 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c10 ColumnTypeName: interval day to second Precision: 7 Scale: 3 ColumnDisplaySize: 5 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c11 ColumnTypeName: interval hour to minute Precision: 9 Scale: 3 ColumnDisplaySize: 5 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c12 ColumnTypeName: interval hour to second Precision: 10 Scale: 3 ColumnDisplaySize: 5 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c13 ColumnTypeName: interval minute to second Precision: 12 Scale: 3 ColumnDisplaySize: 5 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + "Showing prepared query ResultSetMetaData\n" + - "ColumnName: c1 ColumnTypeName: interval day Precision: 4 Scale: 0 ColumnDisplaySize: 4 ColumnType: 2 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c1 ColumnTypeName: interval year Precision: 10 Scale: 0 ColumnDisplaySize: 10 ColumnType: 4 ColumnClassName: java.lang.Integer\n" + "ColumnName: c2 ColumnTypeName: interval month Precision: 10 Scale: 0 ColumnDisplaySize: 10 ColumnType: 4 ColumnClassName: java.lang.Integer\n" + - "ColumnName: c3 ColumnTypeName: interval second Precision: 13 Scale: 3 ColumnDisplaySize: 13 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c3 ColumnTypeName: interval day Precision: 4 Scale: 0 ColumnDisplaySize: 4 ColumnType: 2 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c4 ColumnTypeName: interval hour Precision: 8 Scale: 3 ColumnDisplaySize: 8 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c5 ColumnTypeName: interval minute Precision: 11 Scale: 3 ColumnDisplaySize: 11 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c6 ColumnTypeName: interval second Precision: 13 Scale: 3 ColumnDisplaySize: 13 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c7 ColumnTypeName: interval year to month Precision: 10 Scale: 0 ColumnDisplaySize: 10 ColumnType: 4 ColumnClassName: java.lang.Integer\n" + + "ColumnName: c8 ColumnTypeName: interval day to hour Precision: 5 Scale: 3 ColumnDisplaySize: 5 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c9 ColumnTypeName: interval day to minute Precision: 6 Scale: 3 ColumnDisplaySize: 6 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c10 ColumnTypeName: interval day to second Precision: 7 Scale: 3 ColumnDisplaySize: 7 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c11 ColumnTypeName: interval hour to minute Precision: 9 Scale: 3 ColumnDisplaySize: 9 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c12 ColumnTypeName: interval hour to second Precision: 10 Scale: 3 ColumnDisplaySize: 10 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "ColumnName: c13 ColumnTypeName: interval minute to second Precision: 12 Scale: 3 ColumnDisplaySize: 12 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + "Showing prepared query ParameterMetaData\n" + + "ParameterTypeName: interval year Precision: 10 Scale: 0 ParameterType: 4 ParameterClassName: java.lang.Integer\n" + + "ParameterTypeName: interval month Precision: 10 Scale: 0 ParameterType: 4 ParameterClassName: java.lang.Integer\n" + "ParameterTypeName: interval day Precision: 4 Scale: 0 ParameterType: 2 ParameterClassName: java.math.BigDecimal\n" + - "ParameterTypeName: interval month Precision: 10 Scale: 0 ParameterType: 4 ParameterClassName: java.lang.Integer\n" + - "ParameterTypeName: interval second Precision: 13 Scale: 0 ParameterType: 3 ParameterClassName: java.math.BigDecimal\n"); + "ParameterTypeName: interval hour Precision: 8 Scale: 0 ParameterType: 3 ParameterClassName: java.math.BigDecimal\n" + + "ParameterTypeName: interval minute Precision: 11 Scale: 0 ParameterType: 3 ParameterClassName: java.math.BigDecimal\n" + + "ParameterTypeName: interval second Precision: 13 Scale: 0 ParameterType: 3 ParameterClassName: java.math.BigDecimal\n" + + "ParameterTypeName: interval year to month Precision: 10 Scale: 0 ParameterType: 4 ParameterClassName: java.lang.Integer\n" + + "ParameterTypeName: interval day to hour Precision: 5 Scale: 0 ParameterType: 3 ParameterClassName: java.math.BigDecimal\n" + + "ParameterTypeName: interval day to minute Precision: 6 Scale: 0 ParameterType: 3 ParameterClassName: java.math.BigDecimal\n" + + "ParameterTypeName: interval day to second Precision: 7 Scale: 0 ParameterType: 3 ParameterClassName: java.math.BigDecimal\n" + + "ParameterTypeName: interval hour to minute Precision: 9 Scale: 0 ParameterType: 3 ParameterClassName: java.math.BigDecimal\n" + + "ParameterTypeName: interval hour to second Precision: 10 Scale: 0 ParameterType: 3 ParameterClassName: java.math.BigDecimal\n" + + "ParameterTypeName: interval minute to second Precision: 12 Scale: 0 ParameterType: 3 ParameterClassName: java.math.BigDecimal\n"); } private void Test_PlanExplainTraceDebugCmds() { _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org