Release a dynamic request.
| 162 | |
| 163 | // Release a dynamic request. |
| 164 | void DsqlRequest::destroy(thread_db* tdbb, DsqlRequest* dsqlRequest) |
| 165 | { |
| 166 | SET_TDBB(tdbb); |
| 167 | |
| 168 | if (dsqlRequest->req_timer) |
| 169 | { |
| 170 | dsqlRequest->req_timer->stop(); |
| 171 | dsqlRequest->req_timer = nullptr; |
| 172 | } |
| 173 | |
| 174 | // If request is parent, orphan the children and release a portion of their requests |
| 175 | |
| 176 | for (auto childStatement : dsqlRequest->cursors) |
| 177 | { |
| 178 | childStatement->addFlags(DsqlStatement::FLAG_ORPHAN); |
| 179 | childStatement->setParentRequest(nullptr); |
| 180 | childStatement->setParentDbKey(nullptr); |
| 181 | childStatement->setParentRecVersion(nullptr); |
| 182 | dsqlRequest->req_dbb->dbb_statement_cache->removeStatement(tdbb, childStatement); |
| 183 | |
| 184 | // hvlad: lines below is commented out as |
| 185 | // - child is already unlinked from its parent request |
| 186 | // - we should not free child's sql text until its owner request is alive |
| 187 | // It seems to me we should destroy owner request here, not a child |
| 188 | // statement - as it always was before |
| 189 | |
| 190 | //Jrd::ContextPoolHolder context(tdbb, &childStatement->getPool()); |
| 191 | //releaseStatement(childStatement); |
| 192 | } |
| 193 | |
| 194 | // If the request had an open cursor, close it |
| 195 | |
| 196 | if (dsqlRequest->req_cursor) |
| 197 | DsqlCursor::close(tdbb, dsqlRequest->req_cursor); |
| 198 | |
| 199 | if (dsqlRequest->req_batch) |
| 200 | { |
| 201 | delete dsqlRequest->req_batch; |
| 202 | dsqlRequest->req_batch = nullptr; |
| 203 | } |
| 204 | |
| 205 | Jrd::Attachment* att = dsqlRequest->req_dbb->dbb_attachment; |
| 206 | const bool need_trace_free = dsqlRequest->req_traced && TraceManager::need_dsql_free(att); |
| 207 | if (need_trace_free) |
| 208 | { |
| 209 | TraceSQLStatementImpl stmt(dsqlRequest, NULL); |
| 210 | TraceManager::event_dsql_free(att, &stmt, DSQL_drop); |
| 211 | } |
| 212 | |
| 213 | if (dsqlRequest->req_cursor_name.hasData()) |
| 214 | dsqlRequest->req_dbb->dbb_cursors.remove(dsqlRequest->req_cursor_name); |
| 215 | |
| 216 | // If a request has been compiled, release it now |
| 217 | if (dsqlRequest->getRequest()) |
| 218 | EXE_release(tdbb, dsqlRequest->getRequest()); |
| 219 | |
| 220 | // Increase the statement refCount so its pool is not destroyed before the request is gone. |
| 221 | auto dsqlStatement = dsqlRequest->getDsqlStatement(); |
nothing calls this directly
no test coverage detected