Обсуждение: BUG #4617: JDBC Drivers 8.2/8.3 return no ResultSet
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';
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
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
>