Re: Possible regression: setNull() usage changed from 7.4 to - Mailing list pgsql-jdbc

From Kris Jurka
Subject Re: Possible regression: setNull() usage changed from 7.4 to
Date
Msg-id Pine.BSO.4.63.0604131857140.32765@leary2.csoft.net
Whole thread Raw
In response to Possible regression: setNull() usage changed from 7.4 to 8.0 and up  (Jeff Hubbach <jeff.hubbach@chha.com>)
Responses Re: Possible regression: setNull() usage changed from 7.4 to
List pgsql-jdbc

On Thu, 13 Apr 2006, Jeff Hubbach wrote:

> In the process of upgrading an app, I came across a change in behavior
> of PreparedStatement.setNull(). The behavior of the driver for 7.3 and
> 7.4 is consistent, a call to:
>  stmt.setNull(1,java.sql.Types.NULL);
> succeeds. However, in 8.0 and up (including the 8.2 dev driver), this
> call fails with a "Could not determine data type" error.
>
> PreparedStatement st = conn.prepareStatement("select count(*) from
> test_null where ? is null");
> st.setNull(1,java.sql.Types.NULL);    // Fails
> //st.setNull(1,java.sql.Types.INTEGER); // Works
>

This is an expected change when the driver was modified to use server side
prepared statements instead of just interpolating text values into the
query string.  When given a null value, the driver cannot try to infer any
type information about it and must let the server determine what the type
is.  Your example is a situation where the server cannot possible do so.
If you had written "WHERE intcol = ?", then it could infer that the
parameter should be an integer.  For a situation like "? is null" you must
provide the server with the parameter type (integer is a real type,
Types.NULL, Types.OTHER are not).  The driver cannot pick an arbitrary
type because if the server infers a different type then an
appropriate cast must exist or the query will bail out.

The server generally does a reasonable job of inferring types, the example
you've shown is an awfully contrived one, why would you need the server to
tell you if a value was null?

Kris Jurka

pgsql-jdbc by date:

Previous
From: Jeff Hubbach
Date:
Subject: Possible regression: setNull() usage changed from 7.4 to 8.0 and up
Next
From: Ash Grove
Date:
Subject: stored function, multiple queries, best practices