Changeset: 549225b7be85 for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java/rev/549225b7be85
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:

Corrected ResultSetMetaData methods getPrecision(), getColumnDisplaySize() and 
ParameterMetaData method getPrecision() for the interval data types. They now 
return more precise information for the 13 possible interval data types.


diffs (257 lines):

diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,9 +2,10 @@
 # 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.
+- Corrected ResultSetMetaData methods getColumnTypeName(), getPrecision(),
+  getColumnDisplaySize() and ParameterMetaData methods getParameterTypeName()
+  and getPrecision() for the interval data types. They now return
+  more precise information for the 13 possible interval data types.
 
 * Thu Mar  7 2024 Martin van Dinther <martin.van.dint...@monetdbsolutions.com>
 - Improved DatabaseMetaData.getTypeInfo(). It now also returns the serial
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
@@ -198,6 +198,36 @@ final class MonetParameterMetaData
                        case Types.NUMERIC:
                                // these data types have a variable precision 
(max precision is 38)
                                try {
+                                       // Special handling for: day_interval 
and sec_interval as they are
+                                       // mapped to Types.NUMERIC and 
Types.DECIMAL types (see MonetDriver typeMap)
+                                       final String monettype = 
monetdbTypes[param];
+                                       if (monettype != null && 
monettype.endsWith("_interval")) {
+                                               /* for interval types, 
precisions[] contains the interval subtype code */
+                                               switch (precisions[param]) {
+                                                       case 1: return 4;       
// interval year
+                                                       case 2: return 6;       
// interval year to month
+                                                       case 3: return 6;       
// interval month
+                                                       case 4: return 9;       
// interval day
+                                                       case 5: return 11;      
// interval day to hour
+                                                       case 6: return 13;      
// interval day to minute
+                                                       case 7: return 15;      
// interval day to second
+                                                       case 8: return 11;      
// interval hour
+                                                       case 9: return 13;      
// interval hour to minute
+                                                       case 10: return 15;     
// interval hour to second
+                                                       case 11: return 13;     
// interval minute
+                                                       case 12: return 15;     
// interval minute to second
+                                                       case 13: return 15;     
// interval second
+                                                       default:
+                                                       {       // fall back to 
the 3 available monettype names
+                                                               if 
("sec_interval".equals(monettype))
+                                                                       return 
15;
+                                                               if 
("day_interval".equals(monettype))
+                                                                       return 
9;
+                                                               if 
("month_interval".equals(monettype))
+                                                                       return 
6;
+                                                       }
+                                               }
+                                       }
                                        return precisions[param];
                                } catch (IndexOutOfBoundsException e) {
                                        throw 
newSQLInvalidParameterIndexException(param);
@@ -293,6 +323,7 @@ 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 */
+                               /* for interval types, precisions[] contains 
the interval subtype code */
                                switch (precisions[param]) {
                                        case 1: return "interval year";
                                        case 2: return "interval year to month";
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
@@ -411,12 +411,44 @@ final class MonetResultSetMetaData
        public int getColumnDisplaySize(final int column) throws SQLException {
                checkColumnIndexValidity(column);
                try {
-                       int len = lengths[column - 1];
+                       // Special handling for interval types
+                       final String monettype = types[column - 1];
+                       if (monettype != null && 
monettype.endsWith("_interval")) {
+                               /* for interval types, precisions[] contains 
the interval subtype code */
+                               int prec = -1;
+                               if (precisions != null) {
+                                       prec = precisions[column - 1];
+                               }
+                               switch (prec) {
+                                       case 1: return 4;       // interval year
+                                       case 2: return 6;       // interval 
year to month
+                                       case 3: return 6;       // interval 
month
+                                       case 4: return 9;       // interval day
+                                       case 5: return 11;      // interval day 
to hour
+                                       case 6: return 13;      // interval day 
to minute
+                                       case 7: return 15;      // interval day 
to second
+                                       case 8: return 11;      // interval hour
+                                       case 9: return 13;      // interval 
hour to minute
+                                       case 10: return 15;     // interval 
hour to second
+                                       case 11: return 13;     // interval 
minute
+                                       case 12: return 15;     // interval 
minute to second
+                                       case 13: return 15;     // interval 
second
+                                       default:
+                                       {       // fall back to the 3 available 
monettype names
+                                               if 
("sec_interval".equals(monettype))
+                                                       return 15;
+                                               if 
("day_interval".equals(monettype))
+                                                       return 9;
+                                               if 
("month_interval".equals(monettype))
+                                                       return 6;
+                                       }
+                               }
+                       }
+                       final int len = lengths[column - 1];
                        if (len == 0) {
-                               final String monettype = types[column - 1];
                                // in case of inet it always has 0 as length. 
we need to correct it.
                                if ("inet".equals(monettype)) {
-                                       len = 18;       // 128.127.126.125/24
+                                       return 18;      // 128.127.126.125/24
                                }
                        }
                        return len;
@@ -543,6 +575,7 @@ 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
                                 */
+                               /* for interval types, precisions[] contains 
the interval subtype code */
                                int prec = -1;
                                if (precisions != null) {
                                        prec = precisions[column - 1];
@@ -614,6 +647,36 @@ final class MonetResultSetMetaData
                                // these data types have a variable precision 
(max precision is 38)
                                if (precisions != null) {
                                        try {
+                                               // Special handling for: 
day_interval and sec_interval as they are
+                                               // mapped to Types.NUMERIC and 
Types.DECIMAL types (see MonetDriver typeMap)
+                                               final String monettype = 
types[column - 1];
+                                               if (monettype != null && 
monettype.endsWith("_interval")) {
+                                                       /* for interval types, 
precisions[] contains the interval subtype code */
+                                                       switch 
(precisions[column - 1]) {
+                                                               case 1: return 
4;       // interval year
+                                                               case 2: return 
6;       // interval year to month
+                                                               case 3: return 
6;       // interval month
+                                                               case 4: return 
9;       // interval day
+                                                               case 5: return 
11;      // interval day to hour
+                                                               case 6: return 
13;      // interval day to minute
+                                                               case 7: return 
15;      // interval day to second
+                                                               case 8: return 
11;      // interval hour
+                                                               case 9: return 
13;      // interval hour to minute
+                                                               case 10: return 
15;     // interval hour to second
+                                                               case 11: return 
13;     // interval minute
+                                                               case 12: return 
15;     // interval minute to second
+                                                               case 13: return 
15;     // interval second
+                                                               default:
+                                                               {       // fall 
back to the 3 available monettype names
+                                                                       if 
("sec_interval".equals(monettype))
+                                                                               
return 15;
+                                                                       if 
("day_interval".equals(monettype))
+                                                                               
return 9;
+                                                                       if 
("month_interval".equals(monettype))
+                                                                               
return 6;
+                                                               }
+                                                       }
+                                               }
                                                return precisions[column - 1];
                                        } catch (IndexOutOfBoundsException e) {
                                                throw 
MonetResultSet.newSQLInvalidColumnIndexException(column);
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 = 5442;
+       final private static int sbInitLen = 5468;
 
        /**
         * constructor
@@ -1891,47 +1891,47 @@ final public class JDBC_API_Tester {
 
                compareExpectedOutput("Test_Interval_Types",
                        "Showing query ResultSetMetaData\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 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" +
+                       "ColumnName: c1 ColumnTypeName: interval year   
Precision: 10   Scale: 0        ColumnDisplaySize: 4    ColumnType: 4   
ColumnClassName: java.lang.Integer\n" +
+                       "ColumnName: c2 ColumnTypeName: interval month  
Precision: 10   Scale: 0        ColumnDisplaySize: 6    ColumnType: 4   
ColumnClassName: java.lang.Integer\n" +
+                       "ColumnName: c3 ColumnTypeName: interval day    
Precision: 9    Scale: 0        ColumnDisplaySize: 9    ColumnType: 2   
ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c4 ColumnTypeName: interval hour   
Precision: 11   Scale: 3        ColumnDisplaySize: 11   ColumnType: 3   
ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c5 ColumnTypeName: interval minute 
Precision: 13   Scale: 3        ColumnDisplaySize: 13   ColumnType: 3   
ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c6 ColumnTypeName: interval second 
Precision: 15   Scale: 3        ColumnDisplaySize: 15   ColumnType: 3   
ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c7 ColumnTypeName: interval year to month  
Precision: 10   Scale: 0        ColumnDisplaySize: 6    ColumnType: 4   
ColumnClassName: java.lang.Integer\n" +
+                       "ColumnName: c8 ColumnTypeName: interval day to hour    
Precision: 11   Scale: 3        ColumnDisplaySize: 11   ColumnType: 3   
ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c9 ColumnTypeName: interval day to minute  
Precision: 13   Scale: 3        ColumnDisplaySize: 13   ColumnType: 3   
ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c10        ColumnTypeName: interval day to 
second  Precision: 15   Scale: 3        ColumnDisplaySize: 15   ColumnType: 3   
ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c11        ColumnTypeName: interval hour 
to minute Precision: 13   Scale: 3        ColumnDisplaySize: 13   ColumnType: 3 
  ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c12        ColumnTypeName: interval hour 
to second Precision: 15   Scale: 3        ColumnDisplaySize: 15   ColumnType: 3 
  ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c13        ColumnTypeName: interval minute 
to second       Precision: 15   Scale: 3        ColumnDisplaySize: 15   
ColumnType: 3   ColumnClassName: java.math.BigDecimal\n" +
                        "Showing prepared query ResultSetMetaData\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 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" +
+                       "ColumnName: c1 ColumnTypeName: interval year   
Precision: 10   Scale: 0        ColumnDisplaySize: 4    ColumnType: 4   
ColumnClassName: java.lang.Integer\n" +
+                       "ColumnName: c2 ColumnTypeName: interval month  
Precision: 10   Scale: 0        ColumnDisplaySize: 6    ColumnType: 4   
ColumnClassName: java.lang.Integer\n" +
+                       "ColumnName: c3 ColumnTypeName: interval day    
Precision: 9    Scale: 0        ColumnDisplaySize: 9    ColumnType: 2   
ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c4 ColumnTypeName: interval hour   
Precision: 11   Scale: 3        ColumnDisplaySize: 11   ColumnType: 3   
ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c5 ColumnTypeName: interval minute 
Precision: 13   Scale: 3        ColumnDisplaySize: 13   ColumnType: 3   
ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c6 ColumnTypeName: interval second 
Precision: 15   Scale: 3        ColumnDisplaySize: 15   ColumnType: 3   
ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c7 ColumnTypeName: interval year to month  
Precision: 10   Scale: 0        ColumnDisplaySize: 6    ColumnType: 4   
ColumnClassName: java.lang.Integer\n" +
+                       "ColumnName: c8 ColumnTypeName: interval day to hour    
Precision: 11   Scale: 3        ColumnDisplaySize: 11   ColumnType: 3   
ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c9 ColumnTypeName: interval day to minute  
Precision: 13   Scale: 3        ColumnDisplaySize: 13   ColumnType: 3   
ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c10        ColumnTypeName: interval day to 
second  Precision: 15   Scale: 3        ColumnDisplaySize: 15   ColumnType: 3   
ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c11        ColumnTypeName: interval hour 
to minute Precision: 13   Scale: 3        ColumnDisplaySize: 13   ColumnType: 3 
  ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c12        ColumnTypeName: interval hour 
to second Precision: 15   Scale: 3        ColumnDisplaySize: 15   ColumnType: 3 
  ColumnClassName: java.math.BigDecimal\n" +
+                       "ColumnName: c13        ColumnTypeName: interval minute 
to second       Precision: 15   Scale: 3        ColumnDisplaySize: 15   
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 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 day        Precision: 9    
Scale: 0        ParameterType: 2        ParameterClassName: 
java.math.BigDecimal\n" +
+                       "ParameterTypeName: interval hour       Precision: 11   
Scale: 0        ParameterType: 3        ParameterClassName: 
java.math.BigDecimal\n" +
+                       "ParameterTypeName: interval minute     Precision: 13   
Scale: 0        ParameterType: 3        ParameterClassName: 
java.math.BigDecimal\n" +
+                       "ParameterTypeName: interval second     Precision: 15   
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");
+                       "ParameterTypeName: interval day to hour        
Precision: 11   Scale: 0        ParameterType: 3        ParameterClassName: 
java.math.BigDecimal\n" +
+                       "ParameterTypeName: interval day to minute      
Precision: 13   Scale: 0        ParameterType: 3        ParameterClassName: 
java.math.BigDecimal\n" +
+                       "ParameterTypeName: interval day to second      
Precision: 15   Scale: 0        ParameterType: 3        ParameterClassName: 
java.math.BigDecimal\n" +
+                       "ParameterTypeName: interval hour to minute     
Precision: 13   Scale: 0        ParameterType: 3        ParameterClassName: 
java.math.BigDecimal\n" +
+                       "ParameterTypeName: interval hour to second     
Precision: 15   Scale: 0        ParameterType: 3        ParameterClassName: 
java.math.BigDecimal\n" +
+                       "ParameterTypeName: interval minute to second   
Precision: 15   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