diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod
index 79fa3a920940a6a54164dcb09e8b47419a7e5bbc..9fe6b5b2fac2d3a65617fd64e144c69efd5a7406 100644
--- a/lib/modules/Sql.pmod/pgsql_util.pmod
+++ b/lib/modules/Sql.pmod/pgsql_util.pmod
@@ -340,17 +340,17 @@ outer:
 
   final int close() {
     int ret;
-    { Thread.MutexKey lock=i->fillreadmux->lock();
+    if(!termlock && nostash)
+    { termlock=termthread->lock();
+      Thread.MutexKey lock=i->fillreadmux->lock();
       if(i->fillread) {	 // Delayed close() after flushing the output buffer
         i->fillread.signal();
         i->fillread=0;
-        lock=0;
-        PD("%d>Close socket read, flush write\n",socket->query_fd());
-        ret=socket->close("r");
-        i->read_cb(socket->query_id(),0);
-        return ret;
       }
       lock=0;
+      PD("%d>Delayed close, flush write\n",socket->query_fd());
+      i->read_cb(socket->query_id(),0);
+      return ret;
     }
     destruct(nostash);
     PD("%d>Close socket\n",socket->query_fd());
@@ -363,7 +363,6 @@ outer:
   }
 
   protected void destroy() {
-    termlock=termthread->lock();
     catch(close());		// Exceptions don't work inside destructors
     connectfail=0;
     termthread->lock(1);