[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