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
import java.sql.*;
public class Range {
public static void main(String args[]) throws Exception {
Class.forName("org.postgresql.Driver");
Connection conn =
DriverManager.getConnection("jdbc:postgresql://localhost:5750/jurka","jurka","");
setupDB(conn);
insert(conn,Double.NaN,0);
insert(conn,Double.MAX_VALUE,0);
insert(conn,Double.MIN_VALUE,0);
insert(conn,Double.NEGATIVE_INFINITY,0);
insert(conn,Double.POSITIVE_INFINITY,0);
insert(conn,0,Float.MIN_VALUE);
insert(conn,0,Float.MAX_VALUE);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a,b FROM floattable");
while (rs.next()) {
System.out.println(rs.getDouble(1)+", "+rs.getFloat(2));
}
rs.close();
stmt.close();
conn.close();
}
private static void setupDB(Connection conn) throws SQLException {
Statement stmt = conn.createStatement();
try {
stmt.executeUpdate("DROP TABLE floattable");
} catch (SQLException sqle) {
conn.rollback();
}
stmt.executeUpdate("CREATE TABLE floattable(a float, b real)");
stmt.executeUpdate("INSERT INTO floattable VALUES ('nan','nan')");
}
private static void insert(Connection conn, double d, float f) {
try {
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO
floattable(a,b) VALUES (?,?)");
pstmt.setDouble(1,d);
pstmt.setFloat(2,f);
pstmt.executeUpdate();
pstmt.close();
} catch (SQLException sqle) {
sqle.printStackTrace();
try {
conn.rollback();
} catch (SQLException e) { }
}
}
}
---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?
http://archives.postgresql.org