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 3d46f253d5c10f8d27b1427f2aff584e9a58e01d Author: Kris Jurka <[email protected]> Date: Wed Apr 26 20:07:07 2006 +0000 When a prepared statement uses different parameter types than what the statement was originally prepared for, the driver must replan the query for the new types. When doing this in batches the driver was not correctly freeing old plans. To cleanup prepared statements the driver records a reference to a query object in response to the ParseComplete message. The problem in this case was that since the driver sends multiple Parse messages before a Sync, when the driver receives the first ParseComplete message the query object now contains a reference to the latest parsed statement, not the first. So it was only cleaning up the last parsed statement not all of them. As reported by Peter Eisentraut. --- org/postgresql/core/v3/QueryExecutorImpl.java | 20 ++++++++++++-------- org/postgresql/core/v3/SimpleQuery.java | 6 +++++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/org/postgresql/core/v3/QueryExecutorImpl.java b/org/postgresql/core/v3/QueryExecutorImpl.java index fb0a2e0..13aaeae 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.24 2005/10/25 22:43:02 davec Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/core/v3/QueryExecutorImpl.java,v 1.25 2005/11/05 09:27:13 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -680,6 +680,7 @@ public class QueryExecutorImpl implements QueryExecutor { // Clean up any existing statement, as we can't use it. query.unprepare(); + processDeadParsedQueries(); String statementName = null; if (!oneShot) @@ -766,7 +767,7 @@ public class QueryExecutorImpl implements QueryExecutor { for (int i = 1; i <= params.getParameterCount(); ++i) pgStream.SendInteger4(params.getTypeOID(i)); - pendingParseQueue.add(query); + pendingParseQueue.add(new Object[]{query, query.getStatementName()}); } private void sendBind(SimpleQuery query, SimpleParameterList params, Portal portal) throws IOException { @@ -1084,8 +1085,7 @@ public class QueryExecutorImpl implements QueryExecutor { private final HashMap parsedQueryMap = new HashMap(); private final ReferenceQueue parsedQueryCleanupQueue = new ReferenceQueue(); - private void registerParsedQuery(SimpleQuery query) { - String statementName = query.getStatementName(); + private void registerParsedQuery(SimpleQuery query, String statementName) { if (statementName == null) return ; @@ -1170,11 +1170,14 @@ public class QueryExecutorImpl implements QueryExecutor { case '1': // Parse Complete (response to Parse) pgStream.ReceiveIntegerR(4); // len, discarded - SimpleQuery parsedQuery = (SimpleQuery)pendingParseQueue.get(parseIndex++); + Object[] parsedQueryAndStatement = (Object[])pendingParseQueue.get(parseIndex++); + SimpleQuery parsedQuery = (SimpleQuery)parsedQueryAndStatement[0]; + String parsedStatementName = (String)parsedQueryAndStatement[1]; + if (Driver.logDebug) - Driver.debug(" <=BE ParseComplete [" + parsedQuery.getStatementName() + "]"); + Driver.debug(" <=BE ParseComplete [" + parsedStatementName + "]"); - registerParsedQuery(parsedQuery); + registerParsedQuery(parsedQuery, parsedStatementName); break; case 't': // ParameterDescription @@ -1367,7 +1370,8 @@ public class QueryExecutorImpl implements QueryExecutor { // Reset the statement name of Parses that failed. while (parseIndex < pendingParseQueue.size()) { - SimpleQuery failedQuery = (SimpleQuery)pendingParseQueue.get(parseIndex++); + Object[] failedQueryAndStatement = (Object[])pendingParseQueue.get(parseIndex++); + SimpleQuery failedQuery = (SimpleQuery)failedQueryAndStatement[0]; failedQuery.unprepare(); } diff --git a/org/postgresql/core/v3/SimpleQuery.java b/org/postgresql/core/v3/SimpleQuery.java index 48a8f7f..d3a8beb 100644 --- a/org/postgresql/core/v3/SimpleQuery.java +++ b/org/postgresql/core/v3/SimpleQuery.java @@ -4,7 +4,7 @@ * Copyright (c) 2004, Open Cloud Limited. * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/core/v3/SimpleQuery.java,v 1.8 2005/02/01 07:27:54 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/core/v3/SimpleQuery.java,v 1.9 2005/07/04 18:50:29 davec Exp $ * *------------------------------------------------------------------------- */ @@ -102,6 +102,10 @@ class SimpleQuery implements V3Query { } void setCleanupRef(PhantomReference cleanupRef) { + if (this.cleanupRef != null) { + this.cleanupRef.clear(); + this.cleanupRef.enqueue(); + } this.cleanupRef = cleanupRef; } -- 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

