Re: JDBC 9.2: multiple execution of prepared statement-query delivers different double precision results via getString()

From: "Tilman Sandig" <info(at)sandig(dot)com>
To: "'Mikko Tiihonen'" <Mikko(dot)Tiihonen(at)nitorcreations(dot)com>
Cc: <pgsql-jdbc(at)postgresql(dot)org>
Subject: Re: JDBC 9.2: multiple execution of prepared statement-query delivers different double precision results via getString()
Date: 2013-09-13 17:47:23
Message-ID: 004601ceb0a9$4fab48b0$ef01da10$@com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

I think, you are right; but it might be a potential pitfall, since

- the behavior is nondeterministic
- the results differ from documented sample codes and PgAdmin-query-results, especially when using the
EXTRACT-function like

select EXTRACT(YEAR FROM now())

I didn't expect to retrieve "2013.0" with the 6th call...

Actually, my website crashed when processing the results in my xml-framework (that is the reason, why I use getString())
building a new date-string from extracted components.

-Tilman

-----Ursprüngliche Nachricht-----
Von: Mikko Tiihonen [mailto:Mikko(dot)Tiihonen(at)nitorcreations(dot)com]
Gesendet: Freitag, 13. September 2013 18:12
An: Tilman Sandig; pgsql-jdbc(at)postgresql(dot)org
Betreff: RE: [JDBC] JDBC 9.2: multiple execution of prepared statement-query delivers different double precision results via
getString()

The first few times the driver requests the server to return "1 as double precision" as a text value (thus using server side
toString function).

After that the driver evaluates the actual types of the columns and requests the server to send the value in binary format. Your
toString method will then invoke Double(1).toString on your client side.

If you modify your code to do
System.out.println("Value: " + rs.getDouble(1)); the result should not change as statements change column values to binary
data encoding.

I do not think the driver can make guarantees about the format of getString values, unless the original database field is
textual.

-Mikko
________________________________________
From: pgsql-jdbc-owner(at)postgresql(dot)org <pgsql-jdbc-owner(at)postgresql(dot)org> on behalf of Tilman Sandig <info(at)sandig(dot)com>
Sent: 13 September 2013 18:44
To: pgsql-jdbc(at)postgresql(dot)org
Subject: [JDBC] JDBC 9.2: multiple execution of prepared statement-query delivers different double precision results via
getString()

Hello,

there might be a problem in the latest JDBC-driver (9.2 build 1003) when querying double precision-result columns multiple times
and retrieving the result with ResultSet.getString():

The first five queries work as expected, further calls append ".0" to the result-string.

Here is a sample code:

PreparedStatement stmt = myConnection.prepareStatement("select cast(1 as double precision)"); for (int x=0;x<12;x++){
ResultSet rs = stmt.executeQuery();
while (rs.next()){
System.out.println("Value: " + rs.getString(1));
}
}

-------
Output:
-------

Value: 1
Value: 1
Value: 1
Value: 1
Value: 1
Value: 1.0
Value: 1.0
Value: 1.0
Value: 1.0
Value: 1.0
Value: 1.0
Value: 1.0

The problem does not occur when using JDBC-driver version 9.1; I use PostgreSQL Version 9.3.0 (Win64/Vista)

Best regards,
Tilman Sandig

--
Sent via pgsql-jdbc mailing list (pgsql-jdbc(at)postgresql(dot)org) To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-jdbc

In response to

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message David Johnston 2013-09-13 21:21:09 Re: JDBC 9.2: multiple execution of prepared statement-query delivers different double precision results via getString()
Previous Message Mikko Tiihonen 2013-09-13 16:12:16 Re: JDBC 9.2: multiple execution of prepared statement-query delivers different double precision results via getString()