diff --git a/lib/modules/Sql.pmod/pgsql.pike b/lib/modules/Sql.pmod/pgsql.pike
index e20156f4568c50003684d487894519b126b7e9a5..e4ee797793577727bf0f3e71ad2791d13c4cbc5c 100644
--- a/lib/modules/Sql.pmod/pgsql.pike
+++ b/lib/modules/Sql.pmod/pgsql.pike
@@ -1204,8 +1204,7 @@ private void procmessage() {
   termlock=(termthread=Thread.Mutex())->lock();
   c->close();
   termthread->lock(1);
-  c=0;
-  destruct(waitforauthready);
+  destruct(c);destruct(waitforauthready);
 }
 
 protected void destroy() {
@@ -1262,7 +1261,7 @@ private int reconnect() {
     termlock=(termthread=Thread.Mutex())->lock();
     c->close();
     termthread->lock(1);
-    c=0;
+    destruct(c);
     PD("Flushing old cache\n");
     foreach(_prepareds;;mapping tp)
       m_delete(tp,"preparedname");
diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod
index ce5b97cedb9e936fb9d84207c5e464830f53c813..b554a60946b84a6d9ed2b51d41bf1496836d18ef 100644
--- a/lib/modules/Sql.pmod/pgsql_util.pmod
+++ b/lib/modules/Sql.pmod/pgsql_util.pmod
@@ -338,9 +338,9 @@ outer:
   }
 
   final int close() {
-    int ret=0;
-    if(!closenext && nostash)
-    { Thread.MutexKey lock=i->fillreadmux->lock();
+    if(!closenext && nostash) {
+      closenext=1;
+      Thread.MutexKey lock=i->fillreadmux->lock();
       if(i->fillread) {	 // Delayed close() after flushing the output buffer
         i->fillread.signal();
         i->fillread=0;
@@ -348,20 +348,22 @@ outer:
       lock=0;
       PD("%d>Delayed close, flush write\n",socket->query_fd());
       i->read_cb(socket->query_id(),0);
-      closenext=1;
-    } else {
-      destruct(nostash);
-      PD("%d>Close socket\n",socket->query_fd());
-      ret=socket->close();
-      foreach(closecallbacks;function(void|mixed:void) closecb;)
-        closecb();
-      closecallbacks=(<>);
-    }
-    return ret;
+      return 0;
+    } else
+      return -1;
   }
 
   protected void destroy() {
-    catch(close());		// Exceptions don't work inside destructors
+    if(nostash) {
+      catch {
+        destruct(nostash);
+        PD("%d>Close socket\n",socket->query_fd());
+        socket->close();
+        foreach(closecallbacks;function(void|mixed:void) closecb;)
+          closecb();
+        closecallbacks=(<>);
+      };
+    }
     connectfail=0;
   }