Changeset: 224d73363dc9 for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java/rev/224d73363dc9
Modified Files:
        src/main/java/org/monetdb/jdbc/MonetResultSet.java
        src/main/java/org/monetdb/jdbc/MonetResultSetMetaData.java
        tests/JDBC_API_Tester.java
Branch: default
Log Message:

Fixed issue when you create a new Statement, call 
getGeneratedKeys().getMetaData().
It throwed: Exception in thread "main" java.lang.IllegalArgumentException: 
Header may not be null!
        at 
org.monetdb.jdbc.MonetResultSetMetaData.<init>(MonetResultSetMetaData.java:88)
        at org.monetdb.jdbc.MonetResultSet.getMetaData(MonetResultSet.java:1255)
Added test to JDBC_API_Tester.java


diffs (113 lines):

diff --git a/src/main/java/org/monetdb/jdbc/MonetResultSet.java 
b/src/main/java/org/monetdb/jdbc/MonetResultSet.java
--- a/src/main/java/org/monetdb/jdbc/MonetResultSet.java
+++ b/src/main/java/org/monetdb/jdbc/MonetResultSet.java
@@ -1247,12 +1247,38 @@ public class MonetResultSet
         * columns.
         *
         * @return the description of this ResultSet object's columns
+        * @throws SQLException if a database access error occurs or this 
method is called on a closed result set
         */
        @Override
        public ResultSetMetaData getMetaData() throws SQLException {
                if (rsmd == null) {
                        // first use, construct it once and reuse it for all 
next calls
-                       rsmd = new MonetResultSetMetaData((MonetConnection) 
getStatement().getConnection(), header);
+                       if (header != null) {
+                               rsmd = new 
MonetResultSetMetaData((MonetConnection) getStatement().getConnection(), 
header);
+                       } else {
+                               // this will be a MonetVirtualResultSet object, 
see MonetStatement.getGeneratedKeys()
+                               // create arrays for storing the result columns 
meta data to pass to the constructor
+                               final int array_size = 1;
+                               final String[] schemas = new String[array_size];
+                               final String[] tables = new String[array_size];
+                               final String[] columns = new String[array_size];
+                               final String[] types = new String[array_size];
+                               final int[] jdbcTypes = new int[array_size];
+                               final int[] lengths = new int[array_size];
+                               final int[] precisions = new int[array_size];
+                               final int[] scales = new int[array_size];
+                               // fill the arrays with the getGeneratedKeys() 
resultset columns metadata. It only has 1 column.
+                               schemas[0] = null;
+                               tables[0] = null;
+                               columns[0] = "GENERATED_KEY";
+                               types[0] = "bigint";
+                               jdbcTypes[0] = Types.BIGINT;
+                               lengths[0] = 20;
+                               precisions[0] = 19;
+                               scales[0] = 0;
+                               rsmd = new 
MonetResultSetMetaData((MonetConnection) getStatement().getConnection(), 1,
+                                       schemas, tables, columns, types, 
jdbcTypes, lengths, precisions, scales);
+                       }
                }
                return rsmd;
        }
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
@@ -520,7 +520,7 @@ final class MonetResultSetMetaData
                checkColumnIndexValidity(column);
                try {
                        final String monettype = types[column - 1];
-                       if (monettype.endsWith("_interval")) {
+                       if (monettype != null && 
monettype.endsWith("_interval")) {
                                /* convert the interval type names to valid SQL 
data type names,
                                 * such that generic applications can use them 
in create table statements
                                 */
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
@@ -91,6 +91,7 @@ final public class JDBC_API_Tester {
                jt.Test_Rtimedate();
                jt.Test_RSgetMetaData();
                jt.Test_Sbatching();
+               jt.Test_SgeneratedKeys();
                jt.Test_Smoreresults();
                jt.Test_Wrapper();
                jt.bogus_auto_generated_keys();
@@ -4318,6 +4319,46 @@ final public class JDBC_API_Tester {
                        "0. true        true\n");
        }
 
+       private void Test_SgeneratedKeys() {
+               sb.setLength(0);        // clear the output log buffer
+
+               Statement stmt = null;
+               ResultSet rsk = null;
+               try {
+                       stmt = con.createStatement();
+                       // test getGeneratedKeys
+                       rsk = stmt.getGeneratedKeys();
+                       // test meta data retrieval of this 
MonetVirtualResultSet.
+                       // It used to fail with: Exception in thread "main" 
java.lang.IllegalArgumentException: Header may not be null!
+                       final ResultSetMetaData rsmd = rsk.getMetaData();
+                       sb.append("rsmd has 
").append(rsmd.getColumnCount()).append(" columns\n");
+                       for (int col = 1; col <= rsmd.getColumnCount(); col++) {
+                               sb.append("ColumnName: 
").append(rsmd.getColumnName(col))
+                               .append(" ColumnTypeName: 
").append(rsmd.getColumnTypeName(col))
+                               .append(" Precision: 
").append(rsmd.getPrecision(col))
+                               .append(" Scale: ").append(rsmd.getScale(col))
+                               .append(" ColumnDisplaySize: 
").append(rsmd.getColumnDisplaySize(col))
+                               .append(" ColumnType: 
").append(rsmd.getColumnType(col))
+                               .append(" ColumnClassName: 
").append(rsmd.getColumnClassName(col))
+                               .append(" isNullable: 
").append(rsmd.isNullable(col))
+                               .append(" isAutoIncrement: 
").append(rsmd.isAutoIncrement(col))
+                               .append("\n");
+                       }
+                       rsk.close();
+                       rsk = null;
+                       stmt.close();
+                       stmt = null;
+               } catch (SQLException e) {
+                       sb.append("FAILED: 
").append(e.getMessage()).append("\n");
+               }
+
+               closeStmtResSet(stmt, rsk);
+
+               compareExpectedOutput("Test_SgeneratedKeys",
+                               "rsmd has 1 columns\n" +
+                               "ColumnName: GENERATED_KEY ColumnTypeName: 
bigint Precision: 19 Scale: 0 ColumnDisplaySize: 20 ColumnType: -5 
ColumnClassName: java.lang.Long isNullable: 2 isAutoIncrement: false\n");
+       }
+
        private void Test_Smoreresults() {
                sb.setLength(0);        // clear the output log buffer
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to