patch for jdbc BigDecimal bug - Mailing list pgsql-patches

From Barry Lind
Subject patch for jdbc BigDecimal bug
Date
Msg-id 3B839185.7050002@xythos.com
Whole thread Raw
Responses Re: patch for jdbc BigDecimal bug  (Bruce Momjian <pgman@candle.pha.pa.us>)
List pgsql-patches
Attached is a simple one line patch for the problem reported in the
following email.

thanks,
--Barry


 > -----Original Message-----
 > From: Barry Lind [mailto:barry@xythos.com]
 > Sent: Tuesday, August 21, 2001 11:45 AM
 > To: Jason Orendorff
 > Cc: pgsql-interfaces@postgresql.org; pgsql-jdbc@postgresql.org
 > Subject: Re: [INTERFACES] Bad BigDecimal
 >
 >
 > Yes this does appear to be a bug.  Can you submit a patch to
 > pgsql-patches@postgresql.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!
 > >
 > >
 >
 >
 >

*** ./src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java.orig    Wed Aug 22 02:56:25 2001
--- ./src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java    Wed Aug 22 03:57:18 2001
***************
*** 798,805 ****

      public java.math.BigDecimal getBigDecimal(int columnIndex) throws SQLException
      {
!       // Now must call BigDecimal with a scale otherwise JBuilder barfs
!       return getBigDecimal(columnIndex,0);
      }

      public java.math.BigDecimal getBigDecimal(String columnName) throws SQLException
--- 798,804 ----

      public java.math.BigDecimal getBigDecimal(int columnIndex) throws SQLException
      {
!       return getBigDecimal(columnIndex,-1);
      }

      public java.math.BigDecimal getBigDecimal(String columnName) throws SQLException

pgsql-patches by date:

Previous
From: Tatsuo Ishii
Date:
Subject: Re: encoding names
Next
From: Karel Zak
Date:
Subject: encoding names v2.