Re: JBoss w/int8 primary keys in postgres ... - Mailing list pgsql-jdbc

From Oliver Jowett
Subject Re: JBoss w/int8 primary keys in postgres ...
Date
Msg-id 20030911062448.GJ6485@opencloud.com
Whole thread Raw
In response to Re: JBoss w/int8 primary keys in postgres ...  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-jdbc
On Thu, Sep 11, 2003 at 01:40:21AM -0400, Tom Lane wrote:
> Oliver Jowett <oliver@opencloud.com> writes:
> > which should use the index. However with server-side prepared queries
> > enabled the query is transformed to something like this:
>
> >   PREPARE jdbc_statement_N(int8) AS SELECT * FROM foo WHERE bar = $1;
> >   EXECUTE jdbc_statement_N(12345)
>
> > Which I suspect won't use the index as $1 is typed to int8. (anyone know for
> > sure? I can't find an easy way to get at the query plan produced by
> > PREPARE).
>
> In 7.4 you can do EXPLAIN EXECUTE.  But no, this wouldn't use the index
> :-(.  What exactly is causing the driver to decide to type the parameter
> as int8?

JDBC doesn't provide a separate parameter-typing step for parameterized
queries, so the driver has to infer the type from the method used to set the
actual value of a parameter. In this case, setLong() takes a Java long which
is a signed 64-bit integer, so the driver picks int8.

There's a more general interface (setObject()) that allows both a value and
a target SQL type to be specified, but that's not commonly used for
primitive types thanks to Java's primitive-vs-Object distinction.

See http://java.sun.com/j2se/1.4.2/docs/api/java/sql/PreparedStatement.html

-O

pgsql-jdbc by date:

Previous
From: Tom Lane
Date:
Subject: Re: JBoss w/int8 primary keys in postgres ...
Next
From: jonathan.lister@vaisala.com
Date:
Subject: Re: Stored Procedure returns a ResultSet