Re: AbstractJdbc2Array - another patch - Mailing list pgsql-jdbc
From | Kris Jurka |
---|---|
Subject | Re: AbstractJdbc2Array - another patch |
Date | |
Msg-id | 4717A074.4000109@ejurka.com Whole thread Raw |
In response to | AbstractJdbc2Array - another patch (Marek Lewczuk <newsy@lewczuk.com>) |
Responses |
Re: AbstractJdbc2Array - another patch
|
List | pgsql-jdbc |
Marek Lewczuk wrote: > >> 3) When determing if NULL in an array string is a null value, you need >> to check the server version. Prior to 8.2 an unadorned NULL is the >> text "null", not an actual null value. > See line 106 (of the attached AbstractJdbc2Array.java) - I'm checking, > whether Object[] should be used instead of primitive arrays. It also > used to check, whether NULL elements can be used. Now, see line 230/231 > - at this point, I'm checking, whether element is a text "NULL" or null > element - it works just fine. Perhaps that's OK. If you asked for primitive types on an int[] array with a NULL value, you could want zero instead of an error trying to convert the String "NULL" to an int, similar to rs.getInt() on a NULL value. Let's leave this for now and work on fixing/writing new tests and #6 and we can revisit this later. >> 4) Shouldn't toString(PgArrayList) be PgArrayList.toString() ? > It could be, but see line 598 (of the attached AbstractJdbc2Array.java) > - I'm using escapeString, that throws SQLException and I cannot declare > PgArrayList.toString() as throwing SQLException (super class declaration > doesn't allow for that) - I could of course catch SQLException but it > think it is better to stay with current implementation. You're right, it's fine. >> 6) I was unable to recursively retrieve multidimensional arrays as >> ResultSets as I thought I should be able to do (in the attached test). >> Shouldn't you retain an array as the base type for the top level of a >> multi-dimensional array and expose a dimension at a time via each >> ResultSet? > You have made a mistake, please try attached ArrayTest. Doh! OK, now it mostly works, but there's still an issue with setting the basetype on a subarray to the base element type instead of an array type, as attached. rs.getObject() (and metadata) are confused about what the correct type is. import java.sql.*; public class ArrayTest { public static void main(String args[]) throws Exception { Class.forName("org.postgresql.Driver"); Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5830/jurka","jurka",""); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT '{{1,2,3},{4,5,6}}'::int[]"); rs.next(); Array arr = rs.getArray(1); System.out.println(arr.getBaseType()); System.out.println(arr.getBaseTypeName()); ResultSet arrRS = arr.getResultSet(); arrRS.next(); System.out.println(arrRS.getString(2)); Object o1 = arrRS.getObject(2); System.out.println(o1); Array a1 = arrRS.getArray(2); ResultSet rs1 = a1.getResultSet(); while (rs1.next()) { System.out.println(rs1.getInt(1)); } rs1.close(); arrRS.next(); System.out.println(arrRS.getString(2)); Array a2 = arrRS.getArray(2); System.out.println(a2.getBaseTypeName()); System.out.println(a2.getBaseType()); ResultSet rs2 = a2.getResultSet(); while (rs2.next()) { System.out.println(rs2.getInt(1)); } rs2.close(); arrRS.close(); rs.close(); stmt.close(); conn.close(); } }
pgsql-jdbc by date: