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

Reply via email to