Обсуждение: BUG #4617: JDBC Drivers 8.2/8.3 return no ResultSet

Поиск
Список
Период
Сортировка

BUG #4617: JDBC Drivers 8.2/8.3 return no ResultSet

От
"Raymond L. Naseef"
Дата:
The following bug has been logged online:

Bug reference:      4617
Logged by:          Raymond L. Naseef
Email address:      naseef@egr.msu.edu
PostgreSQL version: 8.3 & 7.4
Operating system:   FreeBSD
Description:        JDBC Drivers 8.2/8.3 return no ResultSet
Details:

Below is query using temporary table instead of "IN" to greatly improve
performance.  This worked in older JDBC driver, but no longer does.  The
following were checked, making no difference:

1) Removed from query:
CREATE UNIQUE INDEX lookup_username_idx
 ON lookup_username
 USING btree
 (username);

2) Setting auto-commit (checked with false and true, and unset).


Servers:
    PostgreSQL 7.4.19 on amd64-portbld-freebsd7.0, compiled by GCC cc (GCC)
4.2.1.20070719 [FreeBSD]
    PostgreSQL 8.3.5 on amd64-portbld-freebsd7.0, compiled by GCC cc (GCC)
4.2.1.20070719 [FreeBSD]

JDBC Drivers:

Result    Driver
======  ===================
WORK    pg74.216.jdbc3.jar

FAIL    postgresql-8.2-506.jdbc3.jar
FAIL    postgresql-8.3-604.jdbc3.jar


This was tested using AutoCommit default and false, using EITHER A or B:
  PreparedStatement ps = connection.prepareStatement([shown_below]);
[ A ]
  ps.execute();
  ResultSet rs = ps.getResultSet();
RESULT:
    rs == null
[ B ]
  ResultSet rs = ps.executeQuery();
RESULT:
    org.postgresql.util.PSQLException: No results were returned by the query.


QUERY:
------
create temporary table lookup_username (username varchar) on commit drop;
insert into lookup_username values ('naseef');
CREATE UNIQUE INDEX lookup_username_idx
 ON lookup_username
 USING btree
 (username);

SELECT enp.username, trim(enp.full_name)
FROM egr_nis_person as enp
JOIN lookup_username as lu
 ON lu.username = enp.username
WHERE enp.start_date < now() + interval '30 seconds'
AND enp.end_date > now() + interval '30 seconds';

Re: BUG #4617: JDBC Drivers 8.2/8.3 return no ResultSet

От
Kris Jurka
Дата:
On Thu, 15 Jan 2009, Raymond L. Naseef wrote:

>
> The following bug has been logged online:
>
> Bug reference:      4617
> PostgreSQL version: 8.3 & 7.4
> Operating system:   FreeBSD
> Description:        JDBC Drivers 8.2/8.3 return no ResultSet
> Details:
>
> Below is query using temporary table instead of "IN" to greatly improve
> performance.  This worked in older JDBC driver, but no longer does.  The
> following were checked, making no difference:
>
> RESULT:
>     org.postgresql.util.PSQLException: No results were returned by the query.
>
>
> QUERY:
> ------
> create temporary table lookup_username (username varchar) on commit drop;
> insert into lookup_username values ('naseef');
> CREATE UNIQUE INDEX lookup_username_idx
> ON lookup_username
> USING btree
> (username);
>
> SELECT enp.username, trim(enp.full_name)
> FROM egr_nis_person as enp
> JOIN lookup_username as lu
> ON lu.username = enp.username
> WHERE enp.start_date < now() + interval '30 seconds'
> AND enp.end_date > now() + interval '30 seconds';
>

What's happening here is that you are actually issuing four commands, not
a single query.  The newer drivers will return a status for each command
executed, and won't just give you the final select result.  For
multi-command statements you should use Statement.execute() and then
getResultSet or getUpdateCount until getMoreResults is false.

Kris Jurka

Re: BUG #4617: JDBC Drivers 8.2/8.3 return no ResultSet

От
Raymond Naseef
Дата:
Excellent.

So useful getUpdateCount(), getResultSet(), and getMoreResults() return
very detailed data about each query in a statement.

Updating driver also found place we were using ps.setString(value) for a
parameter for ID = ?, and we got error asking for proper use of
ps.setInt(value).


Kris Jurka wrote:
>
>
> On Thu, 15 Jan 2009, Raymond L. Naseef wrote:
>
>>
>> The following bug has been logged online:
>>
>> Bug reference:      4617
>> PostgreSQL version: 8.3 & 7.4
>> Operating system:   FreeBSD
>> Description:        JDBC Drivers 8.2/8.3 return no ResultSet
>> Details:
>>
>> Below is query using temporary table instead of "IN" to greatly improve
>> performance.  This worked in older JDBC driver, but no longer does.  The
>> following were checked, making no difference:
>>
>> RESULT:
>>     org.postgresql.util.PSQLException: No results were returned by the
>> query.
>>
>>
>> QUERY:
>> ------
>> create temporary table lookup_username (username varchar) on commit drop;
>> insert into lookup_username values ('naseef');
>> CREATE UNIQUE INDEX lookup_username_idx
>> ON lookup_username
>> USING btree
>> (username);
>>
>> SELECT enp.username, trim(enp.full_name)
>> FROM egr_nis_person as enp
>> JOIN lookup_username as lu
>> ON lu.username = enp.username
>> WHERE enp.start_date < now() + interval '30 seconds'
>> AND enp.end_date > now() + interval '30 seconds';
>>
>
> What's happening here is that you are actually issuing four commands,
> not a single query.  The newer drivers will return a status for each
> command executed, and won't just give you the final select result.  For
> multi-command statements you should use Statement.execute() and then
> getResultSet or getUpdateCount until getMoreResults is false.
>
> Kris Jurka
>