Accepting Object[] as an acceptable input to setObject with Types.ARRAY? - Mailing list pgsql-jdbc

From Steven Schlansker
Subject Accepting Object[] as an acceptable input to setObject with Types.ARRAY?
Date
Msg-id AFD63DD9-2CDD-41E5-AB5D-AA6D8A33A59F@gmail.com
Whole thread Raw
Responses Re: Accepting Object[] as an acceptable input to setObject with Types.ARRAY?  (Radosław Smogura <rsmogura@softperience.eu>)
Re: Accepting Object[] as an acceptable input to setObject with Types.ARRAY?  (Oliver Jowett <oliver@opencloud.com>)
List pgsql-jdbc
Hi all,

First off, the environment -
PostgreSQL 9.0, driver 9.0-801.jdbc4
C3P0 0.9.1.2
H2 1.3.154

Here's my dilemma.  I am attempting to use SQL Arrays (a JDBC 4 feature) but all the JDBC pools I have had good success
with(to date, only C3P0) do not support JDBC 4.  Specifically, if you try to call Connection.createArrayOf, the pool
interceptsit and fails with an AbstractMethodError as the Connection did not specify that interface method when C3P0
wascompiled (against the JDBC 2 API).  It is possible to break through this barrier with reflective magic, but I don't
likethis as a long term solution. 

This means that it is not possible to create the java.sql.Array instance that would be required to call setArray to set
anarray argument on a prepared statement in a portable way. 

H2 (http://www.h2database.com) supports a nifty workaround - if you call setObject with a Object[] it will "do the
rightthing" and internally convert this into the SQL Array.  This means that the driver does the work so client code
doesnot have to hack around the lack of createArrayOf. 

(ref: http://www.h2database.com/html/datatypes.html#array_type )

It looks like adding support for such a fix to the Postgres driver would be extremely easy.  In particular looking
aroundAbstractJdbc2Statement.java:1732 

            case Types.ARRAY:
                if (in instanceof Array)
                    setArray(parameterIndex, (Array)in);
                else
                    throw new PSQLException(GT.tr("Cannot cast an instance of {0} to type {1}", new
Object[]{in.getClass().getName(),"Types.ARRAY"}),PSQLState.INVALID_PARAMETER_TYPE); 
                break;

it could check if in is an array type and if so synthesize the Array object necessary.

Does this sound like a reasonable feature request?  Did I miss an easier way to do this?  It is probably outside of the
JDBCspec but it at least has some traction with H2... 

If this is a reasonable approach I would be happy to contribute a patch, although I am sure an actual PG JDBC developer
coulddo it much faster than I. 

Thanks much for any input,
Steven


pgsql-jdbc by date:

Previous
From: Johnny Luong
Date:
Subject: SELECT statement_timeout(integer) in lieu of setQueryTimeout at the statement level
Next
From: Radosław Smogura
Date:
Subject: Re: Accepting Object[] as an acceptable input to setObject with Types.ARRAY?