[PATCH] Empty arrays cause SQLExceptions when using Array.getArray

From: Doug Fields <dfields-postgres(at)pexicom(dot)com>
To: pgsql-jdbc(at)postgresql(dot)org
Subject: [PATCH] Empty arrays cause SQLExceptions when using Array.getArray
Date: 2002-02-21 02:28:18
Message-ID: 5.1.0.14.2.20020220212808.035013a8@mail.pexicom.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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(at)pexicom(dot)com> Feb 20, 2002 */
+ if ( rawString != null && !rawString.equals("{}") )
{
char[] chars = rawString.toCharArray();
StringBuffer sbuf = new StringBuffer();
boolean foundOpen = false;
boolean insideString = false;

Browse pgsql-jdbc by date

  From Date Subject
Next Message zhousj 2002-02-21 02:34:35 SQLException::GetErrorMessage() return so much message!!!
Previous Message Doug Fields 2002-02-21 01:39:35 [PATCH] Ability to PreparedStatement.setObject(#, int[])