[libpostgresql-jdbc-java] 05/15: Work around a bug in the server's implementation of the copy protocol. It returns command complete immediately upon receiving the EOF marker in a binary copy, potentially before we've issued CopyDone/Fail. Fix this by simply not processing the command complete message until we believe that we are done with the copy as well.
Emmanuel Bourg
ebourg-guest at moszumanska.debian.org
Mon Jan 9 10:20:56 UTC 2017
This is an automated email from the git hooks/post-receive script.
ebourg-guest pushed a commit to tag REL8_4_703
in repository libpostgresql-jdbc-java.
commit c79d86830bb5ce75a092177c35068817ad1dcebe
Author: Kris Jurka <books at ejurka.com>
Date: Tue Aug 31 18:08:20 2010 +0000
Work around a bug in the server's implementation of the copy
protocol. It returns command complete immediately upon receiving
the EOF marker in a binary copy, potentially before we've issued
CopyDone/Fail. Fix this by simply not processing the command
complete message until we believe that we are done with the copy
as well.
Issue originally reported by Matthew Wakeling.
---
org/postgresql/core/PGStream.java | 17 ++++++++++++++++-
org/postgresql/core/VisibleBufferedInputStream.java | 12 +++++++++++-
org/postgresql/core/v3/QueryExecutorImpl.java | 21 ++++++++++++++++++++-
3 files changed, 47 insertions(+), 3 deletions(-)
diff --git a/org/postgresql/core/PGStream.java b/org/postgresql/core/PGStream.java
index 41a2a2e..9b5d113 100644
--- a/org/postgresql/core/PGStream.java
+++ b/org/postgresql/core/PGStream.java
@@ -3,7 +3,7 @@
* Copyright (c) 2003-2008, PostgreSQL Global Development Group
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/core/PGStream.java,v 1.21 2007/02/28 06:10:59 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/core/PGStream.java,v 1.22 2008/01/08 06:56:27 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -249,6 +249,21 @@ public class PGStream
}
/**
+ * Receives a single character from the backend, without
+ * advancing the current protocol stream position.
+ *
+ * @return the character received
+ * @exception IOException if an I/O Error occurs
+ */
+ public int PeekChar() throws IOException
+ {
+ int c = pg_input.peek();
+ if (c < 0)
+ throw new EOFException();
+ return c;
+ }
+
+ /**
* Receives a single character from the backend
*
* @return the character received
diff --git a/org/postgresql/core/VisibleBufferedInputStream.java b/org/postgresql/core/VisibleBufferedInputStream.java
index 0db6523..1843828 100644
--- a/org/postgresql/core/VisibleBufferedInputStream.java
+++ b/org/postgresql/core/VisibleBufferedInputStream.java
@@ -3,7 +3,7 @@
* Copyright (c) 2006-2008, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $PostgreSQL: pgjdbc/org/postgresql/core/VisibleBufferedInputStream.java,v 1.2 2007/12/15 15:32:37 jurka Exp $
+ * $PostgreSQL: pgjdbc/org/postgresql/core/VisibleBufferedInputStream.java,v 1.3 2008/01/08 06:56:27 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -77,6 +77,16 @@ public class VisibleBufferedInputStream extends InputStream {
}
/**
+ * Reads a byte from the buffer without advancing the index pointer.
+ */
+ public int peek() throws IOException {
+ if (ensureBytes(1)) {
+ return buffer[index] & 0xFF;
+ }
+ return -1;
+ }
+
+ /**
* Reads byte from the buffer without any checks. This method never
* reads from the underlaying stream.
* Before calling this method the {@link #ensureBytes} method must
diff --git a/org/postgresql/core/v3/QueryExecutorImpl.java b/org/postgresql/core/v3/QueryExecutorImpl.java
index 0415c2d..547dcac 100644
--- a/org/postgresql/core/v3/QueryExecutorImpl.java
+++ b/org/postgresql/core/v3/QueryExecutorImpl.java
@@ -4,7 +4,7 @@
* Copyright (c) 2004, Open Cloud Limited.
*
* IDENTIFICATION
-* $PostgreSQL: pgjdbc/org/postgresql/core/v3/QueryExecutorImpl.java,v 1.45.2.1 2009/12/04 19:53:27 jurka Exp $
+* $PostgreSQL: pgjdbc/org/postgresql/core/v3/QueryExecutorImpl.java,v 1.45.2.2 2009/12/07 22:03:14 jurka Exp $
*
*-------------------------------------------------------------------------
*/
@@ -900,6 +900,25 @@ public class QueryExecutorImpl implements QueryExecutor {
int len;
while( !endReceiving && (block || pgStream.hasMessagePending()) ) {
+
+ // There is a bug in the server's implementation of the copy
+ // protocol. It returns command complete immediately upon
+ // receiving the EOF marker in the binary protocol,
+ // potentially before we've issued CopyDone. When we are not
+ // blocking, we don't think we are done, so we hold off on
+ // processing command complete and any subsequent messages
+ // until we actually are done with the copy.
+ //
+ if (!block) {
+ int c = pgStream.PeekChar();
+ if (c == 'C') // CommandComplete
+ {
+ if (logger.logDebug())
+ logger.debug(" <=BE CommandStatus, Ignored until CopyDone");
+ break;
+ }
+ }
+
int c = pgStream.ReceiveChar();
switch(c) {
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/libpostgresql-jdbc-java.git
More information about the pkg-java-commits
mailing list