Mercurial > hg > monetdb-java
diff tests/JDBC_API_Tester.java @ 682:78253fdb3c3f
Corrected returned SQL TypeName values for the MonetDB interval types: 'day_interval', 'month_interval' and 'sec_interval'.
Those MonetDB type names can not be used in CREATE TABLE statements. Instead one has to use SQL type names: 'interval day', 'interval month' or 'interval second'.
The JDBC driver now returns those SQL type names. This applies to methods: DatabaseMetaData.getTypeInfo() for the output column TYPE_NAME (the output column LOCAL_TYPE_NAME now returns the original type name), ResultSetMetaData.getColumnTypeName() and ParameterMetaData.getParameterTypeName().
author | Martin van Dinther <martin.van.dinther@monetdbsolutions.com> |
---|---|
date | Fri, 04 Nov 2022 00:04:42 +0100 (2022-11-03) |
parents | 238d6a3a6469 |
children | 8f989e43265d |
line wrap: on
line diff
--- a/tests/JDBC_API_Tester.java +++ b/tests/JDBC_API_Tester.java @@ -63,6 +63,7 @@ final public class JDBC_API_Tester { jt.Test_DBCmetadata(); jt.Test_FetchSize(); jt.Test_Int128(); + jt.Test_Interval_Types(); jt.Test_PlanExplainTraceDebugCmds(); jt.Test_PSgeneratedkeys(); jt.Test_PSgetObject(); @@ -1484,6 +1485,84 @@ final public class JDBC_API_Tester { "SUCCESS\n"); } + private void Test_Interval_Types() { + sb.setLength(0); // clear the output log buffer + + Statement stmt = null; + ResultSet rs = null; + PreparedStatement pstmt = null; + try { + stmt = con.createStatement(); + stmt.executeUpdate("create table Test_Interval_Types (c1 interval day, c2 interval month, c3 interval second)"); + rs = stmt.executeQuery("select * from Test_Interval_Types"); + if (rs != null) { + sb.append("Showing query ResultSetMetaData\n"); + ResultSetMetaData rsmd = rs.getMetaData(); + int colCount = rsmd.getColumnCount(); + for (int col = 1; col <= colCount; col++) { + sb.append("ColumnName: ").append(rsmd.getColumnName(col)) + .append("\tColumnTypeName: ").append(rsmd.getColumnTypeName(col)) + .append("\tPrecision: ").append(rsmd.getPrecision(col)) + .append("\tScale: ").append(rsmd.getScale(col)) + .append("\tColumnDisplaySize: ").append(rsmd.getColumnDisplaySize(col)) + .append("\tColumnType: ").append(rsmd.getColumnType(col)) + .append("\tColumnClassName: ").append(rsmd.getColumnClassName(col)) + .append("\n"); + } + rs.close(); + rs = null; + } + pstmt = con.prepareStatement("select * from Test_Interval_Types where c1 = ? or c2 = ? or c3 = ?"); + if (pstmt != null) { + sb.append("Showing prepared query ResultSetMetaData\n"); + ResultSetMetaData rsmd = pstmt.getMetaData(); + int colCount = rsmd.getColumnCount(); + for (int col = 1; col <= colCount; col++) { + sb.append("ColumnName: ").append(rsmd.getColumnName(col)) + .append("\tColumnTypeName: ").append(rsmd.getColumnTypeName(col)) + .append("\tPrecision: ").append(rsmd.getPrecision(col)) + .append("\tScale: ").append(rsmd.getScale(col)) + .append("\tColumnDisplaySize: ").append(rsmd.getColumnDisplaySize(col)) + .append("\tColumnType: ").append(rsmd.getColumnType(col)) + .append("\tColumnClassName: ").append(rsmd.getColumnClassName(col)) + .append("\n"); + } + sb.append("Showing prepared query ParameterMetaData\n"); + ParameterMetaData pmd = pstmt.getParameterMetaData(); + int paramCount = pmd.getParameterCount(); + for (int param = 1; param <= paramCount; param++) { + sb.append("ParameterTypeName: ").append(pmd.getParameterTypeName(param)) + .append("\tPrecision: ").append(pmd.getPrecision(param)) + .append("\tScale: ").append(pmd.getScale(param)) + .append("\tParameterType: ").append(pmd.getParameterType(param)) + .append("\tParameterClassName: ").append(pmd.getParameterClassName(param)) + .append("\n"); + } + pstmt.close(); + pstmt = null; + } + stmt.executeUpdate("drop table Test_Interval_Types"); + } catch (SQLException e) { + sb.append("FAILED: ").append(e.getMessage()).append("\n"); + } + closeStmtResSet(pstmt, null); + closeStmtResSet(stmt, rs); + + 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: 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" + + "Showing prepared query ResultSetMetaData\n" + + "ColumnName: c1 ColumnTypeName: interval day Precision: 4 Scale: 0 ColumnDisplaySize: 4 ColumnType: 2 ColumnClassName: java.math.BigDecimal\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: 0 ColumnDisplaySize: 13 ColumnType: 3 ColumnClassName: java.math.BigDecimal\n" + + "Showing prepared query ParameterMetaData\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"); + } + private void Test_PlanExplainTraceDebugCmds() { sb.setLength(0); // clear the output log buffer @@ -5904,13 +5983,41 @@ final public class JDBC_API_Tester { } private void compareExpectedOutput(String testname, String expected) { - if (!expected.equals(sb.toString())) { + final String produced = sb.toString(); + if (!expected.equals(produced)) { foundDifferences = true; System.err.print("Test '"); System.err.print(testname); if (!testname.endsWith(")") && !testname.endsWith(";")) System.err.print("()"); System.err.println("' produced different output!"); + int expLen = expected.length(); + int prodLen = produced.length(); + int max_pos = expLen; + if (prodLen > max_pos) + max_pos = prodLen; + int line = 1; + int rowpos = 0; + for (int pos = 0; pos < max_pos; pos++) { + char a = (pos < expLen ? expected.charAt(pos) : '~'); + char b = (pos < prodLen ? produced.charAt(pos) : '~'); + if (a == '\n') { + line++; + rowpos = 0; + } + rowpos++; + if (a != b) { + if (pos + 30 < expLen) + expLen = pos + 30; + if (pos + 30 < prodLen) + prodLen = pos + 30; + System.err.println("Difference found at line " + line + " position " + rowpos + + ": Expected \"" + expected.substring(pos < expLen ? pos : expLen-1, expLen-1) + + "\" but gotten \"" + produced.substring(pos < prodLen ? pos : prodLen-1, prodLen-1) + "\""); + pos = max_pos; + } + } + System.err.println(); System.err.println("Expected:"); System.err.println(expected); System.err.println("Gotten:");