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
|
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: