[libpostgresql-jdbc-java] 02/11: 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.
Emmanuel Bourg
ebourg-guest at moszumanska.debian.org
Mon Jan 9 10:19:53 UTC 2017
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 <books at ejurka.com>
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
More information about the pkg-java-commits
mailing list