Re: Using BigInteger as argument to AbstractJdbc2Statement.setObject - Mailing list pgsql-jdbc
From | Sylvain Leroux |
---|---|
Subject | Re: Using BigInteger as argument to AbstractJdbc2Statement.setObject |
Date | |
Msg-id | 4A7ADF53.2070203@wanadoo.fr Whole thread Raw |
In response to | Re: Using BigInteger as argument to AbstractJdbc2Statement.setObject (Oliver Jowett <oliver@opencloud.com>) |
Responses |
Re: Using BigInteger as argument to
AbstractJdbc2Statement.setObject
|
List | pgsql-jdbc |
> So my concern with mapping Jython integer value -> BigInteger -> NUMERIC > is that you end up with a statement parameter that's not actually an > integer, and so "stmt.setObject(1,1234567899999)" will fail in cases > where you would expect an integer value to work. Ok, I understand. > > Selecting a target type based on the magnitude of the parameter value > passed may work better; then at least you get obvious behavior for cases > where the value can fit in an integer. That's what I have done now: setBigInteger will choose the narrowest integer representation. NUMERIC will still be used when no integer type is wide enough to hold the value. With this, I think we have coherent behavior between Jython and psql. As a side note, MySQL JDBC Driver accepts BigInteger in a setObject call too. But it takes less care of them, since they are simply mapped to strings: > public void setObject(int parameterIndex, Object parameterObj) > throws SQLException { > ... > ... > } else if (parameterObj instanceof BigInteger) { > setString(parameterIndex, parameterObj.toString()); Sylvain -- Website: http://www.chicoree.fr Index: org/postgresql/jdbc2/AbstractJdbc2Statement.java =================================================================== RCS file: /cvsroot/jdbc/pgjdbc/org/postgresql/jdbc2/AbstractJdbc2Statement.java,v retrieving revision 1.114 diff -u -r1.114 AbstractJdbc2Statement.java --- org/postgresql/jdbc2/AbstractJdbc2Statement.java 27 May 2009 23:55:19 -0000 1.114 +++ org/postgresql/jdbc2/AbstractJdbc2Statement.java 6 Aug 2009 13:11:03 -0000 @@ -1229,6 +1229,35 @@ } /* + * Set a parameter to a java.lang.BigInteger value. The driver + * converts this to the narrowest integer representation available + * when it sends it to the database. + * + * <b>This is an extension to the JDBC API!</b> + * + * @param parameterIndex the first parameter is 1... + * @param x the parameter value + * @exception SQLException if a database access error occurs + */ + private void setBigInteger(int parameterIndex, BigInteger x) throws SQLException + { + checkClosed(); + if (x == null) + setNull(parameterIndex, Types.DECIMAL); + else { + int bl = x.bitLength(); + if (bl < 16) + bindLiteral(parameterIndex, x.toString(), Oid.INT2); + else if (bl < 32) + bindLiteral(parameterIndex, x.toString(), Oid.INT4); + else if (bl < 64) + bindLiteral(parameterIndex, x.toString(), Oid.INT8); + else + bindLiteral(parameterIndex, x.toString(), Oid.NUMERIC); + } + } + + /* * Set a parameter to a java.lang.BigDecimal value. The driver * converts this to a SQL NUMERIC value when it sends it to the * database. @@ -1736,6 +1765,8 @@ setString(parameterIndex, (String)x); else if (x instanceof BigDecimal) setBigDecimal(parameterIndex, (BigDecimal)x); + else if (x instanceof BigInteger) + setBigInteger(parameterIndex, (BigInteger)x); else if (x instanceof Short) setShort(parameterIndex, ((Short)x).shortValue()); else if (x instanceof Integer)
pgsql-jdbc by date: