From: | "Jason Orendorff" <jason(at)jorendorff(dot)com> |
---|---|
To: | <pgsql-interfaces(at)postgresql(dot)org> |
Subject: | Bad BigDecimal |
Date: | 2001-08-18 03:55:13 |
Message-ID: | HFEKILOLEFEFMKAECNDLGEDOCAAA.jason@jorendorff.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-interfaces pgsql-jdbc |
Reply-To: sender
Hi. I'm having a problem with the JDBC driver. It's excellent for
the most part - kudos to Mr. Mount - and this is the first problem
I've run into. I think there's a bug; read below for my explanation
and (I think) the fix.
The problem: When I call getBigDecimal() on a ResultSet, it
sometimes throws an exception:
Bad BigDecimal 174.50
at org.postgresql.jdbc2.ResultSet.getBigDecimal(ResultSet.java:373)
at org.postgresql.jdbc2.ResultSet.getBigDecimal(ResultSet.java:984)
...blah blah blah...
org.postgresql.util.PSQLException: Bad BigDecimal 174.50
I think the problem is on line 984 of
org/postgresql/jdbc2/ResultSet.java. Here's the method I'm looking at
(slightly reformatted to fit in this e-mail message):
public java.math.BigDecimal getBigDecimal(int columnIndex)
throws SQLException
{
// Now must call BigDecimal with a scale otherwise JBuilder
// barfs
return getBigDecimal(columnIndex,0);
}
Notice that it's calling getBigDecimal(int, int) with a 0 for the
second argument. Here's the source of that method (again, slightly
reformatted):
public BigDecimal getBigDecimal(int columnIndex, int scale)
throws SQLException
{
String s = getFixedString(columnIndex);
BigDecimal val;
if (s != null)
{
try
{
val = new BigDecimal(s);
} catch (NumberFormatException e) {
throw new PSQLException("postgresql.res.badbigdec",s);
}
if (scale==-1) return val;
try
{
return val.setScale(scale);
} catch (ArithmeticException e) {
throw new PSQLException("postgresql.res.badbigdec",s);
}
}
return null; // SQL NULL
}
Okay. The fact that the default scale is 0 causes essentially
the following to happen:
BigDecimal val;
val = new BigDecimal("174.50");
return val.setScale(0);
This causes an exception because 174.50 can't be exactly represented
by a BigDecimal that has scale 0.
The fix: change the appropriate line to read:
return getBigDecimal(columnIndex, -1);
I'm sure I'm probably overlooking something; please let me know...
Also, please copy me on replies! Thanks!
--
Thanks in advance,
Jason Orendorff
freelance programmer
From | Date | Subject | |
---|---|---|---|
Next Message | Killian May | 2001-08-18 19:11:13 | mdopen error |
Previous Message | Dave Page | 2001-08-17 19:51:45 | RE: [ODBC] RE: ODBC merge module for Microsoft Insta ller |
From | Date | Subject | |
---|---|---|---|
Next Message | Peter Rogers | 2001-08-19 21:51:29 | Re: Unable to connect to database |
Previous Message | Peter Rogers | 2001-08-17 20:26:40 | Unable to connect to database |