Обсуждение: oid int issue with CachedRowSet upgrading from JDBC 8.4 to 9.1
Hi,
We are in the process of upgrading from Postgres JDBC 8.4 to 9.1-901-1.jdbc4
and discovered that CacheRowSet now call the methods isAutoIncrement() and
fetchFieldMetaData(), which will fail converting a OID to an int.
The following code works with the 8.4 driver, but fails with 9.1:
public static void main(String[] args) throws Exception {
Properties connectionProperties = new Properties();
connectionProperties.put("user", "otran");
connectionProperties.put("pass", "”);
Class.forName("org.postgresql.Driver");
Connection connection =
DriverManager.getConnection("jdbc:postgresql://postgres-9.1",
connectionProperties);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("select * from
airports");
CachedRowSet cachedRowSet = new CachedRowSetImpl();
cachedRowSet.populate(resultSet);
}
$ export CLASSPATH=postgresql-8.4-702.jdbc4.jar:.
$ java Test
$ export CLASSPATH=postgresql-9.1-901-1.jdbc4.jar:.
$ java Test
Exception in thread "main" org.postgresql.util.PSQLException: Bad value for
type int : 3090704121
at
org.postgresql.jdbc2.AbstractJdbc2ResultSet.toInt(AbstractJdbc2ResultSet.java:2731)
at
org.postgresql.jdbc2.AbstractJdbc2ResultSet.getInt(AbstractJdbc2ResultSet.java:1983)
at
org.postgresql.jdbc2.AbstractJdbc2ResultSetMetaData.fetchFieldMetaData(AbstractJdbc2ResultSetMetaData.java:242)
at
org.postgresql.jdbc2.AbstractJdbc2ResultSetMetaData.isAutoIncrement(AbstractJdbc2ResultSetMetaData.java:61)
at
com.sun.rowset.CachedRowSetImpl.initMetaData(CachedRowSetImpl.java:701)
at
com.sun.rowset.CachedRowSetImpl.populate(CachedRowSetImpl.java:621)
at Test.main(Test.java:22)
It only affects our production environments where the oids are larger than
an int, but many of our tables have that issue. We can try ripping out
CachedRowSets, but wonder if someone has a fix.
Seems related to:
RELEASE NOTE...
With Version 89.3-dev600 (2007-04-18). Make the default object return type
of oids to be a Java Long instead of Integer because oids are unsigned and
exceed the range of Integer. (jurka)
http://postgresql.1045698.n5.nabble.com/oid-as-long-type-td2169988.html
Thanks,
Owen
--
View this message in context:
http://postgresql.1045698.n5.nabble.com/oid-int-issue-with-CachedRowSet-upgrading-from-JDBC-8-4-to-9-1-tp5551763p5551763.html
Sent from the PostgreSQL - jdbc mailing list archive at Nabble.com.
On Fri, Mar 9, 2012 at 4:25 PM, otran <otran@switchfly.com> wrote:
> Hi,
>
> We are in the process of upgrading from Postgres JDBC 8.4 to 9.1-901-1.jdbc4
> and discovered that CacheRowSet now call the methods isAutoIncrement() and
> fetchFieldMetaData(), which will fail converting a OID to an int.
>
> The following code works with the 8.4 driver, but fails with 9.1:
>
> public static void main(String[] args) throws Exception {
> Properties connectionProperties = new Properties();
> connectionProperties.put("user", "otran");
> connectionProperties.put("pass", "”);
>
> Class.forName("org.postgresql.Driver");
> Connection connection =
> DriverManager.getConnection("jdbc:postgresql://postgres-9.1",
> connectionProperties);
> Statement statement = connection.createStatement();
> ResultSet resultSet = statement.executeQuery("select * from
> airports");
> CachedRowSet cachedRowSet = new CachedRowSetImpl();
> cachedRowSet.populate(resultSet);
> }
>
> $ export CLASSPATH=postgresql-8.4-702.jdbc4.jar:.
> $ java Test
>
> $ export CLASSPATH=postgresql-9.1-901-1.jdbc4.jar:.
> $ java Test
>
> Exception in thread "main" org.postgresql.util.PSQLException: Bad value for
> type int : 3090704121
> at
> org.postgresql.jdbc2.AbstractJdbc2ResultSet.toInt(AbstractJdbc2ResultSet.java:2731)
> at
> org.postgresql.jdbc2.AbstractJdbc2ResultSet.getInt(AbstractJdbc2ResultSet.java:1983)
> at
> org.postgresql.jdbc2.AbstractJdbc2ResultSetMetaData.fetchFieldMetaData(AbstractJdbc2ResultSetMetaData.java:242)
> at
> org.postgresql.jdbc2.AbstractJdbc2ResultSetMetaData.isAutoIncrement(AbstractJdbc2ResultSetMetaData.java:61)
> at
> com.sun.rowset.CachedRowSetImpl.initMetaData(CachedRowSetImpl.java:701)
> at
> com.sun.rowset.CachedRowSetImpl.populate(CachedRowSetImpl.java:621)
> at Test.main(Test.java:22)
>
> It only affects our production environments where the oids are larger than
> an int, but many of our tables have that issue. We can try ripping out
> CachedRowSets, but wonder if someone has a fix.
>
If your oid's exceed an int, then I don't see how CachedRowSets could
possibly work ?
Dave Cramer
dave.cramer(at)credativ(dot)ca
http://www.credativ.ca
Hi Dave, This did work when we were using the 8.4 jdbc driver. With 9.1, we see a call com.sun.rowset.CachedRowSetImpl.initMetaData(CachedRowSetImpl.java:701) that is trying to read the OID now when building this metadata. So CacheRowSetImpl is just highlighting a difference between the 8.4 and 9.1 jdbc drivers in terms of the implementation of grabbing the initMetaData. Thanks, Owen -- View this message in context: http://postgresql.1045698.n5.nabble.com/oid-int-issue-with-CachedRowSet-upgrading-from-JDBC-8-4-to-9-1-tp5551763p5551923.html Sent from the PostgreSQL - jdbc mailing list archive at Nabble.com.
Owen, So did I miss something ? You said that your OID's were larger than an int didn't you ? If so even if the signature of the method is correct how do you expect it to work ? Dave Cramer dave.cramer(at)credativ(dot)ca http://www.credativ.ca On Fri, Mar 9, 2012 at 5:59 PM, otran <otran@switchfly.com> wrote: > Hi Dave, > > This did work when we were using the 8.4 jdbc driver. With 9.1, we see a > call com.sun.rowset.CachedRowSetImpl.initMetaData(CachedRowSetImpl.java:701) > that is trying to read the OID now when building this metadata. > > So CacheRowSetImpl is just highlighting a difference between the 8.4 and 9.1 > jdbc drivers in terms of the implementation of grabbing the initMetaData. > > Thanks, > Owen > > > > > -- > View this message in context: http://postgresql.1045698.n5.nabble.com/oid-int-issue-with-CachedRowSet-upgrading-from-JDBC-8-4-to-9-1-tp5551763p5551923.html > Sent from the PostgreSQL - jdbc mailing list archive at Nabble.com. > > -- > Sent via pgsql-jdbc mailing list (pgsql-jdbc@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-jdbc
On Fri, 9 Mar 2012, otran wrote: > We are in the process of upgrading from Postgres JDBC 8.4 to 9.1-901-1.jdbc4 > and discovered that CacheRowSet now call the methods isAutoIncrement() and > fetchFieldMetaData(), which will fail converting a OID to an int. > I have pushed a fix for this to git for 9.1 and master. Thanks for the report. I've found another problem with master for binary transfer setup with high OIDs. If people want to test this situation and don't have a high oid use database handy, you can set the oid counter to an arbitrary value with pg_resetxlog. Kris Jurka
On Mon, Mar 12, 2012 at 1:19 PM, Dave Cramer <pg@fastcrypt.com> wrote: > Owen, > > So did I miss something ? You said that your OID's were larger than an > int didn't you ? > > If so even if the signature of the method is correct how do you expect > it to work ? > > Dave Cramer > > dave.cramer(at)credativ(dot)ca > http://www.credativ.ca For anyone interested, I think the issue was that while OIDs are 32-bit entities, they are unsigned, so they could not be treated as Java (signed) ints beyond 2^31-1. The nature of Kris' patch [1] seems to support that. [1]: https://github.com/pgjdbc/pgjdbc/commit/4d60ea616eff61262721176db6e77819a23f6dc2 --- Maciek Sakrejda | System Architect | Truviso 1065 E. Hillsdale Blvd., Suite 215 Foster City, CA 94404 (650) 242-3500 Main www.truviso.com
And I guess the commit comment supports that even more. Apologies for the list noise. --- Maciek Sakrejda | System Architect | Truviso 1065 E. Hillsdale Blvd., Suite 215 Foster City, CA 94404 (650) 242-3500 Main www.truviso.com