diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod
index 5b02577c08a0aeec5ddd7d8c4a672877d55226ea..9ca7a5f176a1aaaf514fc3ca2e8a95ff36084bba 100644
--- a/lib/modules/Sql.pmod/pgsql_util.pmod
+++ b/lib/modules/Sql.pmod/pgsql_util.pmod
@@ -743,7 +743,7 @@ class pgsql_result {
   }
 
   final void _purgeportal() {
-    _unnamedportalkey=0;
+    _unnamedportalkey=_unnamedstatementkey=0;
     Thread.MutexKey lock=closemux->lock();
     _fetchlimit=0;				   // disables further Executes
     switch(_state) {
@@ -754,6 +754,7 @@ class pgsql_result {
     }
     _state=closed;
     lock=0;
+    releaseconditions();
   }
 
   final sctype _closeportal(PGplugbuffer plugbuffer) {
@@ -768,6 +769,7 @@ class pgsql_result {
      */
     switch(_state) {
       case portalinit:
+        _unnamedstatementkey=0;
         _state=closed;
         break;
       case copyinprogress:
@@ -818,12 +820,8 @@ class pgsql_result {
     }
   }
 
-  final void _releasesession() {
-    _inflight=0;
-    _datarows->write(1);			// Signal EOF
-    PGassist plugbuffer=c->start(1);
-    plugbuffer->sendcmd(_closeportal(plugbuffer));
-    pgsqlsess=UNDEFINED;
+  private void releaseconditions() {
+    pgsqlsess=0;
     Thread.MutexKey lock;
     if(prepbuffermux) {
       Thread.MutexKey lock=prepbuffermux->lock();
@@ -832,10 +830,19 @@ class pgsql_result {
     if(!_datarowdesc) {
       lock=_ddescribemux->lock();
       _ddescribe->broadcast();
+      _datarowdesc=({});
     }
     lock=0;
   }
 
+  final void _releasesession() {
+    _inflight=0;
+    _datarows->write(1);			// Signal EOF
+    PGassist plugbuffer=c->start(1);
+    plugbuffer->sendcmd(_closeportal(plugbuffer));
+    releaseconditions();
+  }
+
   protected void destroy() {
     catch {			   // inside destructors, exceptions don't work
       _releasesession();