diff --git a/lib/modules/Sql.pmod/pgsql.pike b/lib/modules/Sql.pmod/pgsql.pike
index 0d8e47352db3832349dcbd20013a298250344493..602fb09b42421c59c5ec689f17b2cb9b20bbc06a 100644
--- a/lib/modules/Sql.pmod/pgsql.pike
+++ b/lib/modules/Sql.pmod/pgsql.pike
@@ -997,9 +997,10 @@ private void startquery(int forcetext, .pgsql_util.sql_result portal, string q,
       mixed e = catch(portal->_preparebind(tp.datatypeoid));
       if (!this)				// Already destructed?
         throw(e);
-      if (e && !portal.delayederror) {
-        portal._unnamedstatementkey = 0;	// Release early, release often
-        throw(e);
+      if (e) {
+        portal->_purgeportal();
+        if (!portal.delayederror)
+          throw(e);
       }
     }
     if (!proxy.unnamedstatement)
diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod
index 9bf23ab616e5419ab5458a9e0800863e2871d747..9cede304cfdcd58ff935ab7880eb93f5e939dc3e 100644
--- a/lib/modules/Sql.pmod/pgsql_util.pmod
+++ b/lib/modules/Sql.pmod/pgsql_util.pmod
@@ -1970,6 +1970,26 @@ class proxy {
     procmessage();
   }
 
+  private void stasherror(int|object portal, mixed err) {
+    if (stringp(err)) {
+      if (!objectp(portal))
+        portal = this;
+      if (!portal->delayederror)
+        portal->delayederror = err;
+    }
+    if (objectp(portal))
+      portal->_purgeportal();
+  }
+
+  private void tryprepbind(sql_result portal, array dtoid) {
+    mixed err = catch(portal->_preparebind(dtoid));
+    if (err) {
+      stasherror(portal, err);
+      if (!stringp(err))
+        throw(err);
+    }
+  }
+
   private void procmessage() {
     mixed err;
     int terminating = 0;
@@ -2299,7 +2319,7 @@ class proxy {
 #endif
             if (portal._tprepared)
               portal._tprepared.datatypeoid = a;
-            Thread.Thread(portal->_preparebind, a);
+            Thread.Thread(tryprepbind, portal, a);
             break;
           }
           case 'T': {
@@ -2629,16 +2649,10 @@ class proxy {
         terminating = 1;
         err = 0;
       } else if (stringp(err)) {
-        sql_result or;
-        if (!objectp(or = portal))
-          or = this;
-        if (!or.delayederror)
-          or.delayederror = err;
 #ifdef PG_DEBUGMORE
         showportalstack("THROWN");
 #endif
-        if (objectp(portal))
-          portal->_releasesession("ERROR");
+        stasherror(portal, err);
         portal = 0;
         if (!waitforauthready)
           continue;		// Only continue if authentication did not fail