[PATCH] Empty arrays cause SQLExceptions when using Array.getArray - Mailing list pgsql-jdbc

From Doug Fields
Subject [PATCH] Empty arrays cause SQLExceptions when using Array.getArray
Date
Msg-id 5.1.0.14.2.20020220195236.03458808@mail.pexicom.com
Whole thread Raw
Responses Re: [PATCH] Empty arrays cause SQLExceptions when using Array.getArray
Re: [PATCH] Empty arrays cause SQLExceptions when using Array.getArray
List pgsql-jdbc
I have fixed a minor bug in empty arrays as described below - Unified
Context Diff provided at the end:

I have the following table and values:

=# \d array_test
                               Table "array_test"
  Attribute
|   Type    |                       Modifier
-----------+-----------+-------------------------------------------------------
  id        | integer   | not null default nextval('"array_test_id_seq"'::text)
  first     | integer[] |
  second    | integer[] |
  number    | integer   |
Index: array_test_pkey

=# select * from array_test;
  id |   first    |              second               | number
----+------------+-----------------------------------+--------
   1 | {1,2,3}    | {4,5,6}                           |      7
   2 | {10,20,30} | {40,50,60}                        |     70
   3 | {100,200}  | {300,400,500,600}                 |    700
   4 | {1000}     | {2000,3000,4000,5000,6000}        |   7000
   5 | {}         | {10000,2000,3000,4000,5000,6000}  |  70000
   6 |            | {100000,2000,3000,4000,5000,6000} | 700000
   7 | {9,8,7}    | {6,5,4}                           |   8482
(7 rows)

When I am getting row 5, the ResultSet.getArray().getArray() call fails:

DbArrayTest.doTest: SQLException: Bad Integer
DbArrayTest.doTest: SQLState:     null
DbArrayTest.doTest: VendorError:  0
Bad Integer
         at org.postgresql.jdbc2.ResultSet.toInt(ResultSet.java:1481)
         at org.postgresql.jdbc2.Array.getArray(Array.java:127)
         at org.postgresql.jdbc2.Array.getArray(Array.java:54)
         at com.pexicom.test.DbArrayTest.doTest(DbArrayTest.java:55)

Code snippet in question:

         Array arrayObj;
         int[] array;
             while (rs.next()) {
                 System.out.println("\nColumn 1: " + rs.getInt(1));
                 arrayObj = rs.getArray(2);
                 if (arrayObj != null) {
                     array = (int[])arrayObj.getArray();
                     System.out.println("Column 2: " + arrayObj);

It fails at the arrayObj.getArray() call.

This shouldn't happen; it should return a zero-length array.

The diffs for my fix against the 7.2 source code:

diff -ru5 org-orig/postgresql/jdbc2/Array.java org/postgresql/jdbc2/Array.java
--- org-orig/postgresql/jdbc2/Array.java        Mon Nov 19 18:16:46 2001
+++ org/postgresql/jdbc2/Array.java     Wed Feb 20 19:50:41 2002
@@ -72,11 +72,15 @@
                 if (index < 1)
                         throw new PSQLException("postgresql.arr.range");
                 Object retVal = null;

                 ArrayList array = new ArrayList();
-               if ( rawString != null )
+               /* Check if the String is also not an empty array
+                * otherwise there will be an exception thrown below
+                * in the ResultSet.toX with an empty string.
+                * -- Doug Fields <dfields-pg-jdbc@pexicom.com> Feb 20, 2002 */
+               if ( rawString != null && !rawString.equals("{}") )
                 {
                         char[] chars = rawString.toCharArray();
                         StringBuffer sbuf = new StringBuffer();
                         boolean foundOpen = false;
                         boolean insideString = false;


pgsql-jdbc by date:

Previous
From: Doug Fields
Date:
Subject: Re: javadoc
Next
From: Doug Fields
Date:
Subject: Empty arrays cause SQLExceptions when using Array.getArray