This is an automated email from the git hooks/post-receive script. ebourg-guest pushed a commit to tag REL8_1_406 in repository libpostgresql-jdbc-java.
commit dd554e3ba3a394d35afe5929c8d2941c6a41d173 Author: Kris Jurka <[email protected]> Date: Sat Apr 29 00:07:02 2006 +0000 When performing replace processing we must continue processing until we hit the end of a user supplied query, not just once we've detected the end of a valid query. Consider the example: SELECT a FROM t WHERE (1>0)) ORDER BY a; We must send the whole query to the backend, not just the section before the last closing parenthesis. Reported by Senden Kris --- org/postgresql/core/PGStream.java | 42 +++++++++++++++++++++++---- org/postgresql/core/v2/QueryExecutorImpl.java | 20 +++++++++++-- org/postgresql/core/v3/QueryExecutorImpl.java | 13 +++++++-- org/postgresql/util/PSQLState.java | 3 +- 4 files changed, 66 insertions(+), 12 deletions(-) diff --git a/org/postgresql/core/PGStream.java b/org/postgresql/core/PGStream.java index c7dd8ae..16c8641 100644 --- a/org/postgresql/core/PGStream.java +++ b/org/postgresql/core/PGStream.java @@ -3,7 +3,7 @@ * Copyright (c) 2003-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/core/PGStream.java,v 1.16 2005/06/25 00:53:15 oliver Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/core/PGStream.java,v 1.16.2.1 2005/12/02 03:06:01 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -356,7 +356,7 @@ public class PGStream * an array of bytearrays * @exception IOException if a data I/O error occurs */ - public byte[][] ReceiveTupleV3() throws IOException + public byte[][] ReceiveTupleV3() throws IOException, OutOfMemoryError { //TODO: use l_msgSize int l_msgSize = ReceiveIntegerR(4); @@ -364,13 +364,24 @@ public class PGStream int l_nf = ReceiveIntegerR(2); byte[][] answer = new byte[l_nf][]; + OutOfMemoryError oom = null; for (i = 0 ; i < l_nf ; ++i) { int l_size = ReceiveIntegerR(4); - if (l_size != -1) - answer[i] = Receive(l_size); + if (l_size != -1) { + try { + answer[i] = new byte[l_size]; + Receive(answer[i], 0, l_size); + } catch(OutOfMemoryError oome) { + oom = oome; + Skip(l_size); + } + } } + if (oom != null) + throw oom; + return answer; } @@ -385,7 +396,7 @@ public class PGStream * an array of bytearrays * @exception IOException if a data I/O error occurs */ - public byte[][] ReceiveTupleV2(int nf, boolean bin) throws IOException + public byte[][] ReceiveTupleV2(int nf, boolean bin) throws IOException, OutOfMemoryError { int i, bim = (nf + 7) / 8; byte[] bitmask = Receive(bim); @@ -394,6 +405,7 @@ public class PGStream int whichbit = 0x80; int whichbyte = 0; + OutOfMemoryError oom = null; for (i = 0 ; i < nf ; ++i) { boolean isNull = ((bitmask[whichbyte] & whichbit) == 0); @@ -410,9 +422,19 @@ public class PGStream len -= 4; if (len < 0) len = 0; - answer[i] = Receive(len); + try { + answer[i] = new byte[len]; + Receive(answer[i], 0, len); + } catch(OutOfMemoryError oome) { + oom = oome; + Skip(len); + } } } + + if (oom != null) + throw oom; + return answer; } @@ -451,6 +473,14 @@ public class PGStream } } + public void Skip(int size) throws IOException { + long s = 0; + while (s < size) { + s += pg_input.skip(size - s); + } + } + + /** * Copy data from an input stream to the connection. * diff --git a/org/postgresql/core/v2/QueryExecutorImpl.java b/org/postgresql/core/v2/QueryExecutorImpl.java index 72d07e9..d5ef574 100644 --- a/org/postgresql/core/v2/QueryExecutorImpl.java +++ b/org/postgresql/core/v2/QueryExecutorImpl.java @@ -4,7 +4,7 @@ * Copyright (c) 2004, Open Cloud Limited. * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/core/v2/QueryExecutorImpl.java,v 1.13 2005/04/20 00:10:58 oliver Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/core/v2/QueryExecutorImpl.java,v 1.13.2.1 2005/12/15 23:28:51 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -421,7 +421,15 @@ public class QueryExecutorImpl implements QueryExecutor { if (Driver.logDebug) Driver.debug(" <=BE BinaryRow"); - Object tuple = pgStream.ReceiveTupleV2(fields.length, true); + Object tuple = null; + try { + tuple = pgStream.ReceiveTupleV2(fields.length, true); + } catch(OutOfMemoryError oome) { + if (maxRows == 0 || tuples.size() < maxRows) { + handler.handleError(new PSQLException(GT.tr("Ran out of memory retrieving query results."), PSQLState.OUT_OF_MEMORY, oome)); + } + } + for (int i = 0; i < fields.length; i++) fields[i].setFormat(Field.BINARY_FORMAT); //Set the field to binary format if (maxRows == 0 || tuples.size() < maxRows) @@ -455,7 +463,13 @@ public class QueryExecutorImpl implements QueryExecutor { if (Driver.logDebug) Driver.debug(" <=BE DataRow"); - Object tuple = pgStream.ReceiveTupleV2(fields.length, false); + Object tuple = null; + try { + tuple = pgStream.ReceiveTupleV2(fields.length, false); + } catch(OutOfMemoryError oome) { + if (maxRows == 0 || tuples.size() < maxRows) + handler.handleError(new PSQLException(GT.tr("Ran out of memory retrieving query results."), PSQLState.OUT_OF_MEMORY, oome)); + } if (maxRows == 0 || tuples.size() < maxRows) tuples.addElement(tuple); } diff --git a/org/postgresql/core/v3/QueryExecutorImpl.java b/org/postgresql/core/v3/QueryExecutorImpl.java index 13aaeae..0550193 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.25 2005/11/05 09:27:13 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/core/v3/QueryExecutorImpl.java,v 1.25.2.1 2006/04/26 20:07:05 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -1283,7 +1283,16 @@ public class QueryExecutorImpl implements QueryExecutor { break; case 'D': // Data Transfer (ongoing Execute response) - Object tuple = pgStream.ReceiveTupleV3(); + Object tuple = null; + try { + tuple = pgStream.ReceiveTupleV3(); + } catch(OutOfMemoryError oome) { + if (!noResults) { + handler.handleError(new PSQLException(GT.tr("Ran out of memory retrieving query results."), PSQLState.OUT_OF_MEMORY, oome)); + } + } + + if (!noResults) { if (tuples == null) diff --git a/org/postgresql/util/PSQLState.java b/org/postgresql/util/PSQLState.java index 3ef5c7b..2aadcea 100644 --- a/org/postgresql/util/PSQLState.java +++ b/org/postgresql/util/PSQLState.java @@ -3,7 +3,7 @@ * Copyright (c) 2003-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/util/PSQLState.java,v 1.8 2005/01/14 01:20:25 oliver Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/util/PSQLState.java,v 1.9 2005/01/15 07:53:03 oliver Exp $ * *------------------------------------------------------------------------- */ @@ -71,6 +71,7 @@ public class PSQLState implements java.io.Serializable public final static PSQLState DATA_TYPE_MISMATCH = new PSQLState("42821"); public final static PSQLState UNDEFINED_FUNCTION = new PSQLState("42883"); + public final static PSQLState OUT_OF_MEMORY = new PSQLState("53200"); public final static PSQLState OBJECT_NOT_IN_STATE = new PSQLState("55000"); public final static PSQLState SYSTEM_ERROR = new PSQLState("60000"); -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/libpostgresql-jdbc-java.git _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

