Re: Bad BigDecimal

From: Barry Lind <barry(at)xythos(dot)com>
To: Jason Orendorff <jason(at)jorendorff(dot)com>
Cc: pgsql-interfaces(at)postgresql(dot)org, pgsql-jdbc(at)postgresql(dot)org
Subject: Re: Bad BigDecimal
Date: 2001-08-21 16:45:19
Message-ID: 3B82901F.7060605@xythos.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-interfaces pgsql-jdbc

Yes this does appear to be a bug. Can you submit a patch to
pgsql-patches(at)postgresql(dot)org with the fix. If you don't have time, let
me know and I will submit the patch.

thanks,
--Barry

Jason Orendorff wrote:
> 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!
>
>

In response to

Browse pgsql-interfaces by date

  From Date Subject
Next Message Carlos Moreno 2001-08-23 17:07:17 Installing PG as a regular user?
Previous Message Jeff Eckermann 2001-08-20 19:08:39 Re: SuSE 7.1 PostgreSQL COPY

Browse pgsql-jdbc by date

  From Date Subject
Next Message Dave Cramer 2001-08-21 18:04:58 RE: Current CVS will not compile
Previous Message Peter Eisentraut 2001-08-21 16:25:20 RE: select on multiple tables