changeset 887:674f9ed21308

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.
author Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
date Thu, 04 Apr 2024 12:56:33 +0200 (12 months ago)
parents 4f50019b2cf8
children 549225b7be85
files ChangeLog src/main/java/org/monetdb/jdbc/MonetParameterMetaData.java src/main/java/org/monetdb/jdbc/MonetResultSetMetaData.java tests/JDBC_API_Tester.java
diffstat 4 files changed, 103 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- 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.dinther@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.dinther@monetdbsolutions.com>
 - Improved DatabaseMetaData.getTypeInfo(). It now also returns the serial
   and bigserial data types and all 13 possible interval data types.
--- 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) {
--- 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) {
--- 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() {