Bad BigDecimal

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

Responses

Browse pgsql-interfaces by date

  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

Browse pgsql-jdbc by date

  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