Обсуждение: BUG #12319: NPE in JDBC driver when using PgCopyOutputStream
The following bug has been logged on the website: Bug reference: 12319 Logged by: Daniel Halperin Email address: dhalperi@cs.washington.edu PostgreSQL version: 9.3.1 Operating system: Ubuntu 14.04.1 LTS Description: This seems like a fairly natural use case, but it runs into a NullPointerException (NPE): 1. Create a PGCopyOutputStream 2. Write a bunch of data to it, and close the stream 3. Check the number of tuples that were successfully inserted. (full code snippet below). However, this use case results in a NullPointerException at line 162 -- because on OutputStream.close(), the PGCopyOutputStream sets the copyIn to null. CopyManager cpManager = ((PGConnection) jdbcConnection).getCopyAPI(); StringBuilder copyString = new StringBuilder().append("COPY ").append(quote(relationKey)).append(" FROM STDIN WITH BINARY"); CopyIn copyIn = cpManager.copyIn(copyString.toString()); PGCopyOutputStream out = new PGCopyOutputStream(Preconditions.checkNotNull(copyIn, "copyIn")); TupleWriter tw = new PostgresBinaryTupleWriter(out); tw.writeTuples(tupleBatch); tw.done(); // Causes a null pointer exception long inserted = out.endCopy(); >From what I can tell, there is currently no reliable way to get the number of tuples after closing the stream.
dhalperi wrote > The following bug has been logged on the website: > > Bug reference: 12319 > Logged by: Daniel Halperin > Email address: > dhalperi@.washington > PostgreSQL version: 9.3.1 > Operating system: Ubuntu 14.04.1 LTS > Description: > > This seems like a fairly natural use case, but it runs into a > NullPointerException (NPE): > > 1. Create a PGCopyOutputStream > 2. Write a bunch of data to it, and close the stream > 3. Check the number of tuples that were successfully inserted. > > (full code snippet below). > > However, this use case results in a NullPointerException at line 162 -- > because on OutputStream.close(), the PGCopyOutputStream sets the copyIn to > null. > > CopyManager cpManager = ((PGConnection) > jdbcConnection).getCopyAPI(); > StringBuilder copyString = > new StringBuilder().append("COPY > ").append(quote(relationKey)).append(" FROM STDIN WITH BINARY"); > CopyIn copyIn = cpManager.copyIn(copyString.toString()); > PGCopyOutputStream out = new > PGCopyOutputStream(Preconditions.checkNotNull(copyIn, "copyIn")); > > TupleWriter tw = new PostgresBinaryTupleWriter(out); > tw.writeTuples(tupleBatch); > tw.done(); > > // Causes a null pointer exception > long inserted = out.endCopy(); > >>From what I can tell, there is currently no reliable way to get the number > of tuples after closing the stream. This isn't the proper forum, jdbc is external to the core project which is what this list is for, but... Until you tell the server you are done sending copy data it doesn't have to parse it and cannot tell you how many records it found. So, no, you cannot close the connection before calling endCopy and expect it to work. I'm not familiar with this particular API but the code you show doesn't seem standard to even the official jdbc project so that otherwise proper list probably isn't the place to ask/report. This is all that is standard: http://jdbc.postgresql.org/documentation/publicapi/index.html If you are using this code: https://github.com/uwescience/myria/blob/master/src/edu/washington/escience/myria/PostgresBinaryTupleWriter.java That library commits the sin of closing a buffer that it did not explicitly create/open. David J. -- View this message in context: http://postgresql.nabble.com/BUG-12319-NPE-in-JDBC-driver-when-using-PgCopyOutputStream-tp5831784p5831793.html Sent from the PostgreSQL - bugs mailing list archive at Nabble.com.