Thread: JDBC 7.4 to 8.1 regression problem

JDBC 7.4 to 8.1 regression problem

From
"Carsten Friedrich"
Date:
I just tried to switch from Postgres 7.4 to 8.1. Works fine as far as the
server is concerned, as long as I use the JDBC 7.4 driver in my program. If
I use the JDBC driver postgresql-8.1-407.jdbc3.jar I have the following
problem:

I use the following prepared statement:

[...]
    final static String SQL= "SELECT " +
[...]
      " WHERE " +
[...]
    + "   AND service_date <= ?" +
      " and service_date > date ? - interval '365 days'; "
[...]

This statement works fine with the 7.4 JDBC, but using

statement.setDate(5, someDate); // where someDate is a valid java.sql.Date

I get the following error message when executing the statement:

ERROR: syntax error at or near "$5"

The last "?" (before "- interval") is $5.

Playing around a bit (leaving out the " date " bit) I noticed that JDBC
seems to substitute the "?" by "2005-05-02 +1000". However, I don't know if
this is a good or bad thing.

Your help in this would be much appreciated.

Thanks,
Carsten




Re: JDBC 7.4 to 8.1 regression problem

From
Tom Lane
Date:
"Carsten Friedrich" <carsten@dtecht.com.au> writes:
> I use the following prepared statement:

>     final static String SQL= "SELECT " +
> [...]
>       " WHERE " +
> [...]
>     + "   AND service_date <= ?" +
>       " and service_date > date ? - interval '365 days'; "

The above is broken code, and always has been: the fact that it failed
to malfunction back in 7.4 was purely accidental.  You can only use the
syntax "typename literal" with a literal constant.  Instead of "date ?"
use "?::date", or if you want to be fully SQL-spec-compliant write it
out as "CAST(? AS date)".

Actually, it'd probably be better to use "date_trunc('day', ?)" anyway,
since that's what you're trying to achieve with the cast.

            regards, tom lane