Re: "Fix" for INT8 literals being parsed as INT4 disqualifying

From: Barry Lind <blind(at)xythos(dot)com>
To: Oliver Jowett <oliver(at)opencloud(dot)com>
Cc: James Robinson <jlrobins(at)socialserve(dot)com>, pgsql-jdbc(at)postgresql(dot)org
Subject: Re: "Fix" for INT8 literals being parsed as INT4 disqualifying
Date: 2003-11-06 23:33:59
Message-ID: 3FAADA67.3080504@xythos.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

Oliver,

That patch will be applied soon. But it will *not* be in the 7.4 stable
branch. It will be fixed in head of tree. Since it will break existing
code I didn't want to add it to 7.4 in the middle of beta, or now that
7.4 is RC1.

This argues though for a short release cycle for the jdbc driver that is
off cycle from the rest of the the database to get this out in a
production version sooner rather than later.

thanks,
--Barry

Oliver Jowett wrote:
> On Thu, Nov 06, 2003 at 02:13:15PM -0500, James Robinson wrote:
>
>
>> Folks who use postgresql with JBoss and use non-INT4 number primary
>>keys have been plagued with all of their indexes built on those columns
>>being ignored in queries as simple as:
>>
>> SELECT COUNT(*) FROM foo WHERE (id=1234)
>>
>>on table
>>
>> CREATE TABLE foo (
>> id INT8 primary key not null
>> );
>
>
> [...]
>
>
>>Anyway, suggestions for fixes have varied to and from fixing in the
>>client application (JBoss, in this case), JDBC driver (tried once,
>>broke other things), and the backend parser (generally agreed to be the
>>best place to fix, but a good solution fixing more than it breaks has
>>not jumped up yet).
>
>
> There's a patch pending that should fix this problem .. it adds an explicit
> typecast to all literals that reflects the type provided to JDBC (either
> implied by the method used, or from the java.sql.Types value for
> setObject()). So the above query actually turns into:
>
> SELECT COUNT(*) FROM foo WHERE (id=1234::int8)
>
> if you use setLong() or setObject(..., Types.BIGINT) to set the parameter.
>
> This does break other cases (e.g. using setLong() when you actually want an
> int4 value) but it's necessary to get consistency between the PREPARE and
> non-PREPARE paths.. and it's almost an application error in this case
> anyway.
>
> I'm not sure what the plan is for applying the patch though -- Barry?
>
> [...]
>
>
>>This ultimately causes JBoss to make the call to
>>PreparedStatement.setObject(int index, Object value, int?targetSqlType)
>>method with targetSqlType set to java.sql.Types.VARCHAR, which,
>>ultimately, causes the JDBC driver to wrap single quotes around the
>>literal long, as in
>>
>> SELECT COUNT(*) FROM foo WHERE (id='1234')
>>
>>which causes a different parsing / type cooersion path in the backend
>>which ultimately lets the indexes get used.
>
>
> This is essentially the "fix" that was tried earlier at the driver level,
> but it does break other cases so it's not a general solution.
>
> -O
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>

In response to

Browse pgsql-jdbc by date

  From Date Subject
Next Message Binh Nguyen Thanh 2003-11-07 09:25:49 Question
Previous Message Oliver Jowett 2003-11-06 23:09:34 Re: "Fix" for INT8 literals being parsed as INT4 disqualifying index scan problem in JBoss ...