Bad BigDecimal
От | Jason Orendorff |
---|---|
Тема | Bad BigDecimal |
Дата | |
Msg-id | HFEKILOLEFEFMKAECNDLGEDOCAAA.jason@jorendorff.com обсуждение исходный текст |
Список | pgsql-interfaces |
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 witha 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) { thrownew 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
В списке pgsql-interfaces по дате отправления: