Mercurial > hg > monetdb-java
changeset 664:a6592430c8fc
Adding test DecimalPrecisionAndScale for showing incorrect precision and scale values.
author | Martin van Dinther <martin.van.dinther@monetdbsolutions.com> |
---|---|
date | Wed, 19 Oct 2022 19:10:38 +0200 (2022-10-19) |
parents | 3c40f672174c |
children | 8f7d51c478df |
files | tests/JDBC_API_Tester.java |
diffstat | 1 files changed, 95 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/tests/JDBC_API_Tester.java +++ b/tests/JDBC_API_Tester.java @@ -99,6 +99,7 @@ final public class JDBC_API_Tester { jt.BugResultSetMetaData_Bug_6183(); jt.BugSetQueryTimeout_Bug_3357(); jt.SQLcopyinto(); + jt.DecimalPrecisionAndScale(); /* run next long running test (11 minutes) only before a new release */ /* jt.Test_PSlargeamount(); */ @@ -5718,6 +5719,100 @@ final public class JDBC_API_Tester { sb.append("CopyInto STDIN end\n"); } + private void DecimalPrecisionAndScale() { + sb.setLength(0); // clear the output log buffer + + Statement stmt = null; + ResultSet rs = null; + try { + stmt = con.createStatement(); + rs = stmt.executeQuery( + "select" + + " cast(123456789 as DECIMAL(18,0)) as dec1800" + + ", cast(123456789.0 as DECIMAL(18,1)) as dec1801" + + ", cast(123456789.0 as DECIMAL(18,2)) as dec1802" + + ", cast(123456789.0 as DECIMAL(18,3)) as dec1803" + + ", cast(123456789.0 as DECIMAL(18,4)) as dec1804" + + ", cast(123456789.0 as DECIMAL(18,5)) as dec1805" + + ", cast(123456789.0 as DECIMAL(18,6)) as dec1806" + + ", cast(123456789.0 as DECIMAL(18,7)) as dec1807" + + ", cast(123456789.0 as DECIMAL(18,8)) as dec1808" + + ", cast(123456789.0 as DECIMAL(18,9)) as dec1809" + + ", cast(12345678.9 as DECIMAL(18,10)) as dec1810" + + ", cast(1234567.89 as DECIMAL(18,11)) as dec1811" + + ", cast(123456.789 as DECIMAL(18,12)) as dec1812;"); + if (rs != null) { + ResultSetMetaData rsmd = rs.getMetaData(); + final int rscolcnt = rsmd.getColumnCount(); + sb.append("Query has ").append(rscolcnt).append(" columns:\n"); + sb.append("colnr\tlabel\ttypenm\tdisplaylength\tprecision\tscale\n"); + for (int col = 1; col <= rscolcnt; col++) { + sb.append("col ").append(col); + sb.append("\t").append(rsmd.getColumnLabel(col)); + sb.append("\t").append(rsmd.getColumnTypeName(col)); + sb.append("\t").append(rsmd.getColumnDisplaySize(col)); + sb.append("\t").append(rsmd.getPrecision(col)); + sb.append("\t").append(rsmd.getScale(col)); + sb.append("\n"); + } + sb.append("Values\n"); + while (rs.next()) { + sb.append("colnr\tasString\tasBigDecimal\n"); + for (int col = 1; col <= rscolcnt; col++) { + sb.append("col ").append(col); + sb.append("\t").append(rs.getString(col)); + sb.append("\t").append(rs.getBigDecimal(col)); + sb.append("\n"); + } + sb.append("\n"); + } + rs.close(); + rs = null; + } + } catch (SQLException se) { + sb.append("SQLException: ").append(se.getMessage()).append("\n"); + } catch (Exception e) { + sb.append("Exception: ").append(e.getMessage()).append("\n"); + } + closeStmtResSet(stmt, rs); + + // The returned precision (19 or 20) and scale (0) values are not optimal. + // This is because we only have the mapi passed on "length" value to determine the precision (and scale defaults to 0) instead of the "typesizes" values from mapi header. + // see src/main/java/org/monetdb/mcl/parser/HeaderLineParser.java + // The precision should be 18 and the scale should be from 0 to 12. + compareExpectedOutput("DecimalPrecisionAndScale()", + "Query has 13 columns:\n" + + "colnr label typenm displaylength precision scale\n" + + "col 1 dec1800 decimal 19 19 0\n" + + "col 2 dec1801 decimal 20 20 0\n" + + "col 3 dec1802 decimal 20 20 0\n" + + "col 4 dec1803 decimal 20 20 0\n" + + "col 5 dec1804 decimal 20 20 0\n" + + "col 6 dec1805 decimal 20 20 0\n" + + "col 7 dec1806 decimal 20 20 0\n" + + "col 8 dec1807 decimal 20 20 0\n" + + "col 9 dec1808 decimal 20 20 0\n" + + "col 10 dec1809 decimal 20 20 0\n" + + "col 11 dec1810 decimal 20 20 0\n" + + "col 12 dec1811 decimal 20 20 0\n" + + "col 13 dec1812 decimal 20 20 0\n" + + "Values\n" + + "colnr asString asBigDecimal\n" + + "col 1 123456789 123456789\n" + + "col 2 123456789.0 123456789.0\n" + + "col 3 123456789.00 123456789.00\n" + + "col 4 123456789.000 123456789.000\n" + + "col 5 123456789.0000 123456789.0000\n" + + "col 6 123456789.00000 123456789.00000\n" + + "col 7 123456789.000000 123456789.000000\n" + + "col 8 123456789.0000000 123456789.0000000\n" + + "col 9 123456789.00000000 123456789.00000000\n" + + "col 10 123456789.000000000 123456789.000000000\n" + + "col 11 12345678.9000000000 12345678.9000000000\n" + + "col 12 1234567.89000000000 1234567.89000000000\n" + + "col 13 123456.789000000000 123456.789000000000\n" + + "\n"); + } // some private utility methods for showing table content and params meta data private void showTblContents(String tblnm) {