Yes this does appear to be a bug.  Can you submit a patch to 
[EMAIL PROTECTED] 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!
> 
> 



---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?

http://www.postgresql.org/users-lounge/docs/faq.html

Reply via email to