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();