Thread: JDBC driver doesn't handle NaN values

JDBC driver doesn't handle NaN values

From
Jonathan Purvis
Date:
The JDBC driver that ships with PostgreSQL 7.4.1 doesn't insert floats
of value NaN.  As it uses Float.toString(x) to convert the value for
insertion into the database, it tries to insert NaN instead of 'NaN' and
gets the error "Attribute 'nan' not found".  The same bug occurs for
doubles and will probably occur for infinite values as well (i haven't
tested it).  This bug also exists in 7.2.4 and in the 7.2.1 version
currently in Debian stable.


Here is a patch for the
"src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java"
file.  There may need to be other files changed (eg in the jdbc2 or
jdbc3 directories), but i don't know where.


1062c1062,1063
<         bind(parameterIndex, Float.toString(x), PG_FLOAT);
---
 >         String value = Float.isNaN(x) ? "'NaN'" : Float.toString(x);
 >         bind(parameterIndex, value, PG_FLOAT);
1075c1076,1077
<         bind(parameterIndex, Double.toString(x), PG_DOUBLE);
---
 >         String value = Double.isNaN(x) ? "'NaN'" : Double.toString(x);
 >         bind(parameterIndex, value, PG_DOUBLE);
1553a1556,1559
 >         else if (x instanceof Float)
 >             return ((Float) x).isNaN() ? "'NaN'" : x.toString();
 >         else if (x instanceof Double)
 >             return ((Double) x).isNaN() ? "'NaN'" : x.toString();
1555,1556c1561
<                  x instanceof Double || x instanceof Short ||
<                  x instanceof Number || x instanceof Float)
---
 >                  x instanceof Number || x instanceof Short)



Regards,

    Jon

Re: JDBC driver doesn't handle NaN values

From
Kris Jurka
Date:

On Fri, 9 Jan 2004, Jonathan Purvis wrote:

> The JDBC driver that ships with PostgreSQL 7.4.1 doesn't insert floats
> of value NaN.  As it uses Float.toString(x) to convert the value for
> insertion into the database, it tries to insert NaN instead of 'NaN' and
> gets the error "Attribute 'nan' not found".  The same bug occurs for
> doubles and will probably occur for infinite values as well (i haven't
> tested it).  This bug also exists in 7.2.4 and in the 7.2.1 version
> currently in Debian stable.

As you noted this is a problem with positive and negative infinity, but
there are some more problems as evidenced by the attached test case.

Double.MIN_VALUE will cause underflow.
Double.MAX_VALUE goes in alright, but comes out as POSITIVE_INFINITY

when trying Float.MAX_VALUE and MIN_VALUE on a real or float4 field they
overflow and underflow respectively.

Kris Jurka

Attachment