Re: BUG #12319: NPE in JDBC driver when using PgCopyOutputStream

From: David G Johnston <david(dot)g(dot)johnston(at)gmail(dot)com>
To: pgsql-bugs(at)postgresql(dot)org
Subject: Re: BUG #12319: NPE in JDBC driver when using PgCopyOutputStream
Date: 2014-12-23 06:02:43
Message-ID: 1419314563387-5831793.post@n5.nabble.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

dhalperi wrote
> The following bug has been logged on the website:
>
> Bug reference: 12319
> Logged by: Daniel Halperin
> Email address:

> dhalperi(at)(dot)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.

In response to

Browse pgsql-bugs by date

  From Date Subject
Next Message pawelkokoszkiewicz 2014-12-23 16:14:54 BUG #12321: problem with installation
Previous Message postgres 2014-12-22 20:52:48 BUG #12320: json parsing with embedded double quotes