{"id":468713,"date":"2025-07-25T21:01:47","date_gmt":"2025-07-25T21:01:47","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=468713"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=468713","title":{"rendered":"<span>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 Firebird, \u0447\u0430\u0441\u0442\u044c 3<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0438\u0437\u0443\u0447\u0430\u043b\u0438, \u043a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041c\u044b \u0434\u043e\u0438\u0437\u0443\u0447\u0430\u043b\u0438\u0441\u044c \u0434\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 EXE \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>EXE_looper()<\/strong> \u0432 \u0446\u0438\u043a\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <strong>StmtNode::execute()<\/strong>, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435, \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043e\u0442 <strong>StmtNode<\/strong>. \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043f\u0440\u043e\u0439\u0434\u0451\u043c \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0443\u0437\u043b\u043e\u0432.<\/p>\n<h2>Dsql@2<\/h2>\n<p>\u041c\u044b \u0441\u043d\u043e\u0432\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u0432 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0435 Dsql, \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043a\u043b\u0430\u0441\u0441\u044b, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0442\u043e\u043c\u043a\u0430\u043c\u0438 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <strong>StmtNode<\/strong>. \u041f\u0435\u0440\u0432\u044b\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c, \u0431\u0443\u0434\u0435\u0442 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/dsql\/StmtNodes.cpp#L8651\" rel=\"noopener noreferrer nofollow\"><strong>StallNode<\/strong><\/a>.<\/p>\n<pre><code class=\"cpp\">const StmtNode* StallNode::execute(thread_db* \/*tdbb*\/, Request* request, ExeState* \/*exeState*\/) const { switch (request-&gt;req_operation) { case Request::req_evaluate: case Request::req_return: request-&gt;req_message = this; request-&gt;req_operation = Request::req_return; request-&gt;req_flags |= req_stall; return this;  case Request::req_proceed: request-&gt;req_operation = Request::req_return; return parentStmt;  default: return parentStmt; } }<\/code><\/pre>\n<p>\u0410\u0433\u0430, \u0442\u0443\u0442 \u0447\u0442\u043e-\u0442\u043e \u0442\u0438\u043f\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430, event-\u043e\u043c \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 <em>request-&gt;req_operation<\/em>, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <em>req_operation<\/em> \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 &#8212; \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0421\u0430\u043c\u044b\u043c \u043f\u0435\u0440\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <em>req_operation<\/em> \u0431\u0443\u0434\u0435\u0442 <em>req_sync<\/em>, \u0438 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <strong>StallNode::execute()<\/strong> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <em>parentStmt<\/em>, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/dsql\/StmtNodes.cpp#L5187\" rel=\"noopener noreferrer nofollow\"><strong>ForNode<\/strong><\/a>.<\/p>\n<pre><code class=\"cpp\">const StmtNode* ForNode::execute(thread_db* tdbb, Request* request, ExeState* \/*exeState*\/) const { jrd_tra* transaction = request-&gt;req_transaction; ImpureMerge* merge = request-&gt;getImpure&lt;ImpureMerge&gt;(impureOffset); Impure* impure = merge;  switch (request-&gt;req_operation) { case Request::req_evaluate: \/\/ initialize impure values impure-&gt;savepoint = 0; impure-&gt;writeLockMode = false; if (marks &amp; MARK_MERGE) merge-&gt;recUpdated = nullptr;  if (!(transaction-&gt;tra_flags &amp; TRA_system) &amp;&amp; transaction-&gt;tra_save_point &amp;&amp; transaction-&gt;tra_save_point-&gt;hasChanges()) { const Savepoint* const savepoint = transaction-&gt;startSavepoint(); impure-&gt;savepoint = savepoint-&gt;getNumber(); }  cursor-&gt;open(tdbb);  if (cursor-&gt;isUpdateCounters()) request-&gt;req_records_affected.clear();  \/\/ fall into  case Request::req_return: if (stall) return stall;  \/\/ fall into  case Request::req_sync: {  const bool fetched = cursor-&gt;fetchNext(tdbb); if (withLock) { const Request* top_request = request-&gt;req_snapshot.m_owner; if ((top_request) &amp;&amp; (top_request-&gt;req_flags &amp; req_update_conflict)) impure-&gt;writeLockMode = true; }  if (fetched) { if (impure-&gt;writeLockMode &amp;&amp; withLock) { \/\/ Skip statement execution and fetch (and try to lock) next record. request-&gt;req_operation = Request::req_sync; return this; }  request-&gt;req_operation = Request::req_evaluate; return statement; } }  if (impure-&gt;writeLockMode) restartRequest(request, transaction);  request-&gt;req_operation = Request::req_return;  if (impure-&gt;savepoint) { while (transaction-&gt;tra_save_point &amp;&amp; transaction-&gt;tra_save_point-&gt;getNumber() &gt;= impure-&gt;savepoint) { fb_assert(!transaction-&gt;tra_save_point-&gt;isChanging()); transaction-&gt;releaseSavepoint(tdbb); } }  \/\/ fall into  default: { if (request-&gt;req_operation == Request::req_unwind) { if (request-&gt;req_flags &amp; (req_leave | req_continue_loop)) { const auto label = nodeAs&lt;LabelNode&gt;(parentStmt.getObject());  \/\/ If CONTINUE matches our label, restart fetching records  if (label &amp;&amp; request-&gt;req_label == label-&gt;labelNumber &amp;&amp; (request-&gt;req_flags &amp; req_continue_loop)) { request-&gt;req_flags &amp;= ~req_continue_loop; request-&gt;req_operation = Request::req_sync; return this; }  \/\/ Otherwise (BREAK\/LEAVE\/EXIT or mismatched CONTINUE), we should unwind further. \/\/ Thus cleanup our savepoint.  if (impure-&gt;savepoint) { while (transaction-&gt;tra_save_point &amp;&amp; transaction-&gt;tra_save_point-&gt;getNumber() &gt;= impure-&gt;savepoint) { transaction-&gt;releaseSavepoint(tdbb); } } } }  cursor-&gt;close(tdbb);  if (marks &amp; MARK_MERGE) { delete merge-&gt;recUpdated; merge-&gt;recUpdated = nullptr; }  return parentStmt; } }  return NULL; }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, <strong>ForNode<\/strong> &#8212; \u044d\u0442\u043e \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 <em>cursor<\/em>, \u0438 \u0432\u044b\u0437\u043e\u0432 <strong>ForNode::execute()<\/strong> \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 <em>req_operation<\/em> \u0440\u0430\u0432\u0435\u043d <em>Request::req_sync<\/em> , \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0432\u044b\u0437\u043e\u0432\u0443 <em>cursor-&gt;fetchNext()<\/em>, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e <em>req_operation<\/em> \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0451\u0442\u0441\u044f \u0432 <em>Request::req_evaluate<\/em>, \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f <em>statement<\/em>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 <strong>SuspendNode<\/strong>.<\/p>\n<h2>RecordSource@2<\/h2>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/recsrc\/Cursor.cpp#L232\" rel=\"noopener noreferrer nofollow\"><strong>Cursor::fetchNext()<\/strong><\/a> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">bool Cursor::fetchNext(thread_db* tdbb) const { if (m_rse-&gt;isScrollable()) return fetchRelative(tdbb, 1);  if (!validate(tdbb)) return false;  const auto request = tdbb-&gt;getRequest(); Impure* const impure = request-&gt;getImpure&lt;Impure&gt;(m_impure);  if (!impure-&gt;irsb_active) { \/\/ error: invalid cursor state status_exception::raise(Arg::Gds(isc_cursor_not_open)); }  if (impure-&gt;irsb_state == EOS) return false;  if (!m_root-&gt;getRecord(tdbb)) { impure-&gt;irsb_state = EOS; return false; }  if (m_updateCounters) { request-&gt;req_records_selected++; request-&gt;req_records_affected.bumpFetched(); }  impure-&gt;irsb_state = POSITIONED; return true; }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043a\u0438\u0439 <em>impure<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u0415\u0433\u043e \u043f\u043e\u043b\u0435 <em>irsb_state<\/em> \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a EOS (end of stream), \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u0438 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 <em>m_root-&gt;getRecord()<\/em>, \u0430 <em>m_root<\/em> &#8212; \u044d\u0442\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 <strong>RecordSource<\/strong>. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 <strong>FullTableScan<\/strong>. \u0412\u043e\u0442 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/recsrc\/FullTableScan.cpp#L135\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430<\/a>:<\/p>\n<pre><code class=\"cpp\">bool FullTableScan::internalGetRecord(thread_db* tdbb) const { JRD_reschedule(tdbb);  Request* const request = tdbb-&gt;getRequest(); record_param* const rpb = &amp;request-&gt;req_rpb[m_stream]; Impure* const impure = request-&gt;getImpure&lt;Impure&gt;(m_impure);  if (!(impure-&gt;irsb_flags &amp; irsb_open)) { rpb-&gt;rpb_number.setValid(false); return false; }  const RecordNumber* upper = impure-&gt;irsb_upper.isValid() ? &amp;impure-&gt;irsb_upper : nullptr;  if (VIO_next_record(tdbb, rpb, request-&gt;req_transaction, request-&gt;req_pool, DPM_next_all, upper)) { rpb-&gt;rpb_number.setValid(true); return true; }  rpb-&gt;rpb_number.setValid(false); return false; }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 <strong>VIO_next_record()<\/strong>. \u0423\u0433\u043b\u0443\u0431\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u0433\u043e \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u043d\u043e \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>\u041a\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043b <strong>Cursor<\/strong> \u0438 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043b <em>m_root<\/em> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <strong>FullTableScan<\/strong> ?<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b VIO, \u0442\u043e \u0442\u0430\u043c \u0431\u044b\u043b\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u0432 <em>rpb<\/em> \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f <strong>Relation<\/strong>, \u0432 \u043a\u043e\u0442\u043e\u043c \u0437\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d <strong>Format<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0446\u0435\u043f\u043b\u044f\u0435\u0442\u0441\u044f \u043a \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u0440\u0438 \u0435\u0451 \u0447\u0442\u0435\u043d\u0438\u0438. \u0417\u043d\u0430\u0447\u0438\u0442, \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b <em>rpb<\/em> \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0445 \u0441\u0442\u0440\u043e\u043a. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 <em>rpb<\/em> \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <em>request-&gt;req_rpb<\/em> \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 <em>m_stream<\/em> , \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435. \u042f \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0443, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 <em>request<\/em> &#8212; \u044d\u0442\u043e \u043e\u0434\u0438\u043d SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u043e\u0439 (select securityId, avg(price) from orders group by securityId), \u0442\u043e \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <strong>RecordSource<\/strong>: \u043e\u0434\u0438\u043d \u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0432\u0442\u043e\u0440\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u0442. \u0418 \u0442\u043e\u0433\u0434\u0430 <em>m_stream<\/em> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c <strong>RecordSource<\/strong>. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430: \u043f\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e <em>m_stream<\/em> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a <em>req_rpb<\/em>. \u042f, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u0438 \u0432\u0441\u0451 \u0442\u0430\u043a\u043e\u0435, \u043d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 <em>m_stream<\/em> \u0438 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 <em>rpb<\/em>, \u043d\u0430 \u043f\u0430\u0440\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043c\u0435\u043d\u044c\u0448\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 ? \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c. \u041f\u0435\u0440\u0432\u0430\u044f \u0438\u0434\u0435\u044f: <em>request<\/em> \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 \u0442\u043e\u043c \u0448\u0430\u0433\u0435, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u041d\u043e \u044f \u043c\u043e\u0433\u0443 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c: \u0432 <strong>FullTableScan::internalOpen()<\/strong> , \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c <strong>internalGetRecord()<\/strong>, \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a <em>rpb<\/em>, \u044f \u0431\u044b \u0435\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b \u0432 this.<\/p>\n<\/li>\n<li>\n<p>\u041d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c, \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <em>impure-&gt;irsb_upper<\/em> . \u0427\u0442\u043e \u044d\u0442\u043e \u0438 \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0451\u0442\u0441\u044f ?<\/p>\n<\/li>\n<\/ol>\n<h2>Dsql@3<\/h2>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0443\u0437\u043b\u043e\u043c \u0432 \u043d\u0430\u0448\u0435\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/dsql\/StmtNodes.cpp#L8745\" rel=\"noopener noreferrer nofollow\"><strong>SuspendNode<\/strong><\/a>, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0439 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 <em>req_evaluate<\/em><\/p>\n<pre><code class=\"cpp\">const StmtNode* SuspendNode::execute(thread_db* tdbb, Request* request, ExeState* \/*exeState*\/) const { switch (request-&gt;req_operation) { case Request::req_evaluate: { \/\/ ASF: If this is the send in the tail of a procedure and the procedure was called \/\/ with a SELECT, don't run all the send statements. It may make validations fail when \/\/ the procedure didn't return any rows. See CORE-2204. \/\/ But we should run the last assignment, as it's the one who make the procedure stop.  if (!(request-&gt;req_flags &amp; req_proc_fetch)) return statement;  const CompoundStmtNode* list = nodeAs&lt;CompoundStmtNode&gt;(parentStmt);  if (list &amp;&amp; !list-&gt;parentStmt &amp;&amp; list-&gt;statements[list-&gt;statements.getCount() - 1] == this) { list = nodeAs&lt;CompoundStmtNode&gt;(statement);  if (list &amp;&amp; list-&gt;onlyAssignments &amp;&amp; list-&gt;statements.hasData()) { \/\/ This is the assignment that sets the EOS parameter. const AssignmentNode* assign = static_cast&lt;const AssignmentNode*&gt;( list-&gt;statements[list-&gt;statements.getCount() - 1].getObject()); EXE_assignment(tdbb, assign); } else return statement; } else return statement;  \/\/ fall into }  case Request::req_return: request-&gt;req_operation = Request::req_send; request-&gt;req_message = message; request-&gt;req_flags |= req_stall; return this;  case Request::req_proceed: request-&gt;req_operation = Request::req_return; return parentStmt;  default: return parentStmt; } }<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 <em>request-&gt;req_flags<\/em> \u043d\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0444\u043b\u0430\u0433 <em>req_proc_fetch<\/em> (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441, \u0430 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u043c\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430), \u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0439 return statement. \u0418 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/dsql\/StmtNodes.cpp#L879\" rel=\"noopener noreferrer nofollow\"><strong>CompondStmtNode<\/strong><\/a>.<\/p>\n<pre><code class=\"cpp\">const StmtNode* CompoundStmtNode::execute(thread_db* tdbb, Request* request, ExeState* \/*exeState*\/) const { const NestConst&lt;StmtNode&gt;* end = statements.end();  if (onlyAssignments &amp;&amp; !request-&gt;req_attachment-&gt;isProfilerActive()) { if (request-&gt;req_operation == Request::req_evaluate) { for (const NestConst&lt;StmtNode&gt;* i = statements.begin(); i != end; ++i) { const StmtNode* stmt = i-&gt;getObject(); EXE_assignment(tdbb, static_cast&lt;const AssignmentNode*&gt;(stmt)); }  request-&gt;req_operation = Request::req_return; }  return parentStmt; }  impure_state* impure = request-&gt;getImpure&lt;impure_state&gt;(impureOffset);  switch (request-&gt;req_operation) { case Request::req_evaluate: impure-&gt;sta_state = 0; \/\/ fall into  case Request::req_return: case Request::req_sync: if (impure-&gt;sta_state &lt; statements.getCount()) { request-&gt;req_operation = Request::req_evaluate; return statements[impure-&gt;sta_state++]; } request-&gt;req_operation = Request::req_return; \/\/ fall into  default: return parentStmt; } }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0442\u0443\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 <em>onlyAssignments<\/em>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 true. \u0420\u0430\u0437 \u0442\u0430\u043a, \u0432 \u0446\u0438\u043a\u043b\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/master\/src\/jrd\/exe.cpp#L318\" rel=\"noopener noreferrer nofollow\"><strong>EXE_assignment()<\/strong><\/a> \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 <strong>AssignmentNode<\/strong>.<\/p>\n<pre><code class=\"cpp\">void EXE_assignment(thread_db* tdbb, const AssignmentNode* node) { DEV_BLKCHK(node, type_nod);  SET_TDBB(tdbb); Request* request = tdbb-&gt;getRequest();  \/\/ Get descriptors of src field\/parameter\/variable, etc. request-&gt;req_flags &amp;= ~req_null; dsc* from_desc = EVL_expr(tdbb, request, node-&gt;asgnFrom);  EXE_assignment(tdbb, node-&gt;asgnTo, from_desc, (request-&gt;req_flags &amp; req_null), node-&gt;missing, node-&gt;missing2); }  \/\/ Evaluate a value expression. inline dsc* EVL_expr(thread_db* tdbb, Request* request, const ValueExprNode* node) { if (!node) BUGCHECK(303);\/\/ msg 303 Invalid expression for evaluation  SET_TDBB(tdbb); JRD_reschedule(tdbb); request-&gt;req_flags &amp;= ~req_null;  dsc* desc = node-&gt;execute(tdbb, request);  if (desc) request-&gt;req_flags &amp;= ~req_null; else request-&gt;req_flags |= req_null;  return desc; }  dsc* LiteralNode::execute(thread_db* \/*tdbb*\/, Request* \/*request*\/) const { return const_cast&lt;dsc*&gt;(&amp;litDesc); }<\/code><\/pre>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 <strong>AssignmentNode<\/strong> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0432\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u0430: \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a <em>asgnFrom<\/em> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c <em>asgnTo<\/em>.<\/p>\n<p>\u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <em>asgnFrom<\/em>, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0442\u044c. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 <strong>LiteralNode<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <em>dsc<\/em>. \u041c\u044b \u0443\u0436\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c \u0441 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438, \u043e\u043d\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u0435 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0442\u0438\u043f, \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0438 \u0434\u043b\u0438\u043d\u0443. \u0414\u043b\u044f \u043d\u0430\u0441 \u043f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0430\u0434\u043a\u043e\u0439, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u044b\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430, \u0432\u0438\u0434\u0438\u043c\u043e, \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0430 \u043d\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a, \u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <strong>Format<\/strong>. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e, \u0447\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <em>dsc<\/em> \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u043e \u043f\u043e\u043b\u044f\u043c \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 <strong>Ods::Descriptor<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u043c \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0443 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0431\u0435\u0437 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0439.<\/p>\n<p>\u042d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/master\/src\/jrd\/exe.cpp#L347\" rel=\"noopener noreferrer nofollow\"><strong>EXE_assignment()<\/strong><\/a>. \u041f\u0435\u0440\u0432\u044b\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c \u0432 \u043d\u0451\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432 <strong>EVL_assign_to()<\/strong>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c dsc \u0434\u043b\u044f \u0443\u0437\u043b\u0430-\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f.<\/p>\n<pre><code class=\"cpp\">\/\/ Perform an assignment. void EXE_assignment(thread_db* tdbb, const ValueExprNode* to, dsc* from_desc, bool from_null, const ValueExprNode* missing_node, const ValueExprNode* missing2_node) { SET_TDBB(tdbb); Request* request = tdbb-&gt;getRequest();  const auto toVar = nodeAs&lt;VariableNode&gt;(to);  if (toVar &amp;&amp; toVar-&gt;outerDecl) request = toVar-&gt;getVarRequest(request);  AutoSetRestore2&lt;Request*, thread_db&gt; autoSetRequest( tdbb, &amp;thread_db::getRequest, &amp;thread_db::setRequest, request);  \/\/ Get descriptors of receiving and sending fields\/parameters, variables, etc.  dsc* missing = NULL; if (missing_node) missing = EVL_expr(tdbb, request, missing_node);  \/\/ Get descriptor of target field\/parameter\/variable, etc. DSC* to_desc = EVL_assign_to(tdbb, to);  request-&gt;req_flags &amp;= ~req_null;  \/\/ NS: If we are assigning to NULL, we finished. \/\/ This functionality is currently used to allow calling UDF routines \/\/ without assigning resulting value anywhere. if (!to_desc) return;  SSHORT null = from_null ? -1 : 0;  if (!null &amp;&amp; missing &amp;&amp; MOV_compare(tdbb, missing, from_desc) == 0) null = -1;  USHORT* impure_flags = NULL; const auto toParam = nodeAs&lt;ParameterNode&gt;(to);  if (toParam) { const MessageNode* message = toParam-&gt;message; const auto paramRequest = toParam-&gt;getParamRequest(request);  if (toParam-&gt;argInfo) { AutoSetRestore2&lt;Request*, thread_db&gt; autoSetRequest( tdbb, &amp;thread_db::getRequest, &amp;thread_db::setRequest, paramRequest);  EVL_validate(tdbb, Item(Item::TYPE_PARAMETER, message-&gt;messageNumber, toParam-&gt;argNumber), toParam-&gt;argInfo, from_desc, null == -1); }  impure_flags = paramRequest-&gt;getImpure&lt;USHORT&gt;( message-&gt;impureFlags + (sizeof(USHORT) * toParam-&gt;argNumber)); } else if (toVar) { const auto varRequest = toVar-&gt;getVarRequest(request);  if (toVar-&gt;varInfo) { AutoSetRestore2&lt;Request*, thread_db&gt; autoSetRequest( tdbb, &amp;thread_db::getRequest, &amp;thread_db::setRequest, varRequest);  EVL_validate(tdbb, Item(Item::TYPE_VARIABLE, toVar-&gt;varId), toVar-&gt;varInfo, from_desc, null == -1); }  impure_flags = &amp;varRequest-&gt;getImpure&lt;impure_value&gt;( toVar-&gt;varDecl-&gt;impureOffset)-&gt;vlu_flags; }  if (impure_flags != NULL) *impure_flags |= VLU_checked;  \/\/ If the value is non-missing, move\/convert it.  Otherwise fill the \/\/ field with appropriate nulls. dsc temp;  if (!null) { if (!DSC_EQUIV(from_desc, to_desc, false)) { MOV_move(tdbb, from_desc, to_desc); } else if (from_desc-&gt;dsc_dtype == dtype_short) { *((SSHORT*) to_desc-&gt;dsc_address) = *((SSHORT*) from_desc-&gt;dsc_address); } else if (from_desc-&gt;dsc_dtype == dtype_long) { *((SLONG*) to_desc-&gt;dsc_address) = *((SLONG*) from_desc-&gt;dsc_address); } else if (from_desc-&gt;dsc_dtype == dtype_int64) { *((SINT64*) to_desc-&gt;dsc_address) = *((SINT64*) from_desc-&gt;dsc_address); } else { memcpy(to_desc-&gt;dsc_address, from_desc-&gt;dsc_address, from_desc-&gt;dsc_length); }  to_desc-&gt;dsc_flags &amp;= ~DSC_null; } else { if (missing2_node &amp;&amp; (missing = EVL_expr(tdbb, request, missing2_node))) MOV_move(tdbb, missing, to_desc); else memset(to_desc-&gt;dsc_address, 0, to_desc-&gt;dsc_length);  to_desc-&gt;dsc_flags |= DSC_null; }  \/\/ Handle the null flag as appropriate for fields and message arguments.  const FieldNode* toField = nodeAs&lt;FieldNode&gt;(to); if (toField) { Record* record = request-&gt;req_rpb[toField-&gt;fieldStream].rpb_record;  if (null) record-&gt;setNull(toField-&gt;fieldId); else record-&gt;clearNull(toField-&gt;fieldId);  } else if (toParam &amp;&amp; toParam-&gt;argFlag) { to_desc = EVL_assign_to(tdbb, toParam-&gt;argFlag);  \/\/ If the null flag is a string with an effective length of one, \/\/ then -1 will not fit.  Therefore, store 1 instead.  if (null &amp;&amp; to_desc-&gt;dsc_dtype &lt;= dtype_varying) { USHORT minlen;  switch (to_desc-&gt;dsc_dtype) { case dtype_text: minlen = 1; break; case dtype_cstring: minlen = 2; break; case dtype_varying: minlen = 3; break; }  if (to_desc-&gt;dsc_length &lt;= minlen) null = 1; }  temp.dsc_dtype = dtype_short; temp.dsc_length = sizeof(SSHORT); temp.dsc_scale = 0; temp.dsc_sub_type = 0; temp.dsc_address = (UCHAR*) &amp;null; MOV_move(tdbb, &amp;temp, to_desc); } }     dsc* EVL_assign_to(thread_db* tdbb, const ValueExprNode* node) {  SET_TDBB(tdbb);  DEV_BLKCHK(node, type_nod);  Request* request = tdbb-&gt;getRequest();  \/\/ The only nodes that can be assigned to are: argument, field and variable. if (auto paramNode = nodeAs&lt;ParameterNode&gt;(node)) { auto message = paramNode-&gt;message; auto arg_number = paramNode-&gt;argNumber; auto desc = &amp;message-&gt;format-&gt;fmt_desc[arg_number];  auto impure = request-&gt;getImpure&lt;impure_value&gt;(node-&gt;impureOffset);  impure-&gt;vlu_desc.dsc_address = paramNode-&gt;getParamRequest(request)-&gt;getImpure&lt;UCHAR&gt;(message-&gt;impureOffset + (IPTR) desc-&gt;dsc_address); impure-&gt;vlu_desc.dsc_dtype = desc-&gt;dsc_dtype; impure-&gt;vlu_desc.dsc_length = desc-&gt;dsc_length; impure-&gt;vlu_desc.dsc_scale = desc-&gt;dsc_scale; impure-&gt;vlu_desc.dsc_sub_type = desc-&gt;dsc_sub_type;  if (DTYPE_IS_TEXT(desc-&gt;dsc_dtype) &amp;&amp; ((INTL_TTYPE(desc) == ttype_dynamic) || (INTL_GET_CHARSET(desc) == CS_dynamic))) { \/\/ Value is a text value, we're assigning it back to the user \/\/ process, user process has not specified a subtype, user \/\/ process specified dynamic translation and the dsc isn't from \/\/ a 3.3 type request (blr_cstring2 instead of blr_cstring) so \/\/ convert the charset to the declared charset of the process.  impure-&gt;vlu_desc.setTextType(tdbb-&gt;getCharSet()); }  return &amp;impure-&gt;vlu_desc; } else if (nodeIs&lt;NullNode&gt;(node)) return NULL; else if (auto varNode = nodeAs&lt;VariableNode&gt;(node)) { auto impure = varNode-&gt;getVarRequest(request)-&gt;getImpure&lt;impure_value&gt;(varNode-&gt;varDecl-&gt;impureOffset); return &amp;impure-&gt;vlu_desc; } else if (auto fieldNode = nodeAs&lt;FieldNode&gt;(node)) { auto record = request-&gt;req_rpb[fieldNode-&gt;fieldStream].rpb_record; auto impure = request-&gt;getImpure&lt;impure_value&gt;(node-&gt;impureOffset);  if (!EVL_field(0, record, fieldNode-&gt;fieldId, &amp;impure-&gt;vlu_desc)) { \/\/ The below condition means that EVL_field() returned \/\/ a read-only dummy value which cannot be assigned to. \/\/ The usual reason is a field being unexpectedly dropped. if (impure-&gt;vlu_desc.dsc_address &amp;&amp; !(impure-&gt;vlu_desc.dsc_flags &amp; DSC_null)) ERR_post(Arg::Gds(isc_field_disappeared)); }  if (!impure-&gt;vlu_desc.dsc_address) ERR_post(Arg::Gds(isc_read_only_field) &lt;&lt; \"&lt;unknown&gt;\");  return &amp;impure-&gt;vlu_desc; }  SOFT_BUGCHECK(229);\/\/ msg 229 EVL_assign_to: invalid operation return NULL; }<\/code><\/pre>\n<p>\u0412 <strong>EVL_assign_to()<\/strong> \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0439\u0434\u0451\u0442 \u0432 if-\u0432\u0435\u0442\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 <em>paramNode<\/em>. \u0418 \u0447\u0442\u043e \u0436\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0432\u043d\u0443\u0442\u0440\u0438: \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <em>paramNode-&gt;message<\/em>, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0435\u0440\u0451\u043c <em>format<\/em>, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e, \u0437\u043d\u0430\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <em>dsc<\/em>, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0442\u043e, \u043a\u0443\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c . \u041d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u044b \u043d\u0435 \u0435\u0433\u043e, \u0430 \u0435\u0433\u043e \u043a\u043e\u043f\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 <em>impure-&gt;vlu_desc<\/em>. \u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043d\u043e \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0434\u043b\u044f \u043d\u0430\u0441 \u0442\u0443\u0442 \u0442\u043e, \u0447\u0442\u043e <em>dsc_address<\/em> \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0442 <em>message-&gt;impureOffset<\/em>, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043f\u0438\u044f <em>impure-&gt;vlu_desc<\/em> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e.<\/p>\n<p>\u0412 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 <strong>EXE_assignment()<\/strong> \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0432\u0438\u0434\u043d\u043e if \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0439 <strong>CompondStmtNode::execute()<\/strong> \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0451\u0442 \u0440\u0435\u0436\u0438\u043c <em>req_operation<\/em> \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <em>req_return<\/em>, \u0438 \u0432\u0435\u0440\u043d\u0451\u0442 <em>parentStmt<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 <strong>SuspendNode<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0432\u0451\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 <strong>CompoundStmtNode<\/strong>. \u041d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <em>req_operation<\/em> \u0443\u0436\u0435 \u0434\u0440\u0443\u0433\u043e\u0439, \u0442\u043e \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 <strong>SuspendNode::execute()<\/strong> \u0431\u0443\u0434\u0443\u0442 \u0434\u0440\u0443\u0433\u0438\u043c\u0438: \u0440\u0435\u0436\u0438\u043c <em>req_operation<\/em> \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0432 <em>req_send<\/em>, \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0444\u043b\u0430\u0433 <em>stall<\/em>, \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432 <em>request-&gt;req_message<\/em> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u043e\u043b\u044f <em>message<\/em>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0430 <strong>MessageNode<\/strong>. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0433\u0430\u0434\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 message \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043b. \u041d\u043e \u044f \u0441\u043c\u043e\u0433 \u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>EVL_assign_to()<\/strong> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <em>paramNode-&gt;message<\/em> \u0431\u0443\u0434\u0443\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <strong>MessageNode<\/strong>, \u043e\u0445 \u0443\u0436 \u044d\u0442\u0438 \u0441\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435, \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044e, \u043a\u0430\u043a \u044d\u0442\u043e \u0442\u0430\u043a \u0432\u044b\u0448\u043b\u043e. \u0412 \u0438\u0442\u043e\u0433\u0435 <strong>SuspendNode::execute()<\/strong> \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 <em>req_return<\/em> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0435\u0431\u044f. \u0424\u043b\u0430\u0433 <em>stall<\/em> \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0446\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0443\u0437\u043b\u043e\u0432 \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0412\u0441\u0435 \u044d\u0442\u0438 \u043f\u0435\u0440\u0435\u0441\u043a\u043e\u043a\u0438 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e <strong>StmtNode<\/strong> \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043b \u0441\u0445\u0435\u043c\u0443. \u0422\u0435 \u0448\u0430\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438, \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u044b \u0441\u0438\u043d\u0438\u043c\u0438 \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c\u0438 \u0441 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u043e\u0442 1 \u0434\u043e 6. \u041d\u0430 \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u0445 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <em>req_operation<\/em>.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/393\/373\/797\/393373797d7fdc03ce1618e1521b1dc4.png\" alt=\"\u0426\u0435\u043f\u043e\u0447\u043a\u0430 StmtNode\" title=\"\u0426\u0435\u043f\u043e\u0447\u043a\u0430 StmtNode\" width=\"1160\" height=\"687\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/393\/373\/797\/393373797d7fdc03ce1618e1521b1dc4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/393\/373\/797\/393373797d7fdc03ce1618e1521b1dc4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0426\u0435\u043f\u043e\u0447\u043a\u0430 StmtNode<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0447\u0430\u0441\u0442\u0438 2, \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0440\u0430\u0441\u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u0434\u043e <strong>EXE_receive()<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 <em>request-&gt;req_message<\/em> , \u0437\u043d\u0430\u0447\u0438\u0442 \u044f \u043e\u0442\u0432\u0435\u0442\u0438\u043b \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0436\u0435 \u0437\u0430\u0434\u0430\u043b \u0432 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e \u0442\u043e\u043c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0451\u0442\u0441\u044f <em>request-&gt;req_message<\/em>. \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b  \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e <strong>EXE_receive()<\/strong> \u0432\u044b\u0437\u043e\u0432\u0435\u0442 <strong>execute_looper()<\/strong> \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437, \u0443\u0436\u0435 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <em>Request::req_proceed<\/em>. \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0437\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e. \u0428\u0430\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u0437\u0435\u043b\u0451\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c\u0438 \u0441 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u043e\u0442 7 \u0434\u043e 10<\/p>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0441\u044f \u0441 <strong>SuspendNode<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442 <em>req_operation<\/em> \u0432 <em>req_return<\/em>, \u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0443\u0437\u043b\u0430 \u0432\u0435\u0440\u043d\u0451\u0442 \u0441\u0432\u043e\u0439 <em>parentStmt<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 <strong>ForNode<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0449\u0451 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 <strong>SuspendNode<\/strong>. \u0410 <strong>ForNode<\/strong> \u0442\u0443\u043f\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0432\u043e\u0451 \u043f\u043e\u043b\u0435 <em>stall<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 <strong>StallNode<\/strong>, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0441\u0451 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u043e\u0441\u044c.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0441\u044f \u0441 \u044d\u0442\u0438\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u044f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0432\u043e\u0442 \u043a\u0430\u043a\u0443\u044e \u0448\u0442\u0443\u043a\u0443. \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 isql \u0438\u043c\u0435\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 &#171;SET EXEC_PATH_DISPLAY BLR;&#187; , \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c BLR, \u043d\u0435\u043a\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 Firebird. \u0415\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441, \u0442\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435:<\/p>\n<pre><code>SQL&gt; select orderid, securityid,qty,price from orders;  Execution path (BLR):      0 blr_version5,     1 blr_begin,     2    blr_message, 1, 9,0,     6       blr_short, 0,     8       blr_short, 0,    10       blr_double,    11       blr_short, 0,    13       blr_long, 0,    15       blr_short, 0,    17       blr_long, 0,    19       blr_short, 0,    21       blr_varying2, 0,0, 0,2,    26    blr_for,    27       blr_stall,    28       blr_rse, 1,    30          blr_rid, 128,0, 0,    34          blr_end,    35    blr_send, 1,    37       blr_begin,    38          blr_assignment,    39             blr_literal, blr_short, 0, 1,0,    44             blr_parameter, 1, 0,0,    48          blr_assignment,    49             blr_fid, 0, 3,0,    53             blr_parameter2, 1, 2,0, 1,0,    59          blr_assignment,    60             blr_fid, 0, 2,0,    64             blr_parameter2, 1, 4,0, 3,0,    70          blr_assignment,    71             blr_fid, 0, 4,0,    75             blr_parameter2, 1, 6,0, 5,0,    81          blr_assignment,    82             blr_fid, 0, 1,0,    86             blr_parameter2, 1, 8,0, 7,0,    92          blr_end,    93    blr_send, 1,    95       blr_assignment,    96          blr_literal, blr_short, 0, 0,0,   101          blr_parameter, 1, 0,0,   105    blr_end,   106 blr_eoc<\/code><\/pre>\n<p>\u0418 \u0442\u0443\u0442 \u043c\u044b \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0438\u0434\u0451\u0442 <strong>MessageNode<\/strong>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c. \u041f\u043e\u0442\u043e\u043c \u0438\u0434\u0451\u0442 <strong>ForNode<\/strong>, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c <strong>StallNode<\/strong> \u0438 \u0435\u0449\u0451 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e RSE (\u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u044d\u0442\u043e SuspendNode). \u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0451\u0442 Send, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043f\u043e\u0445\u043e\u0436\u0435, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430\u0448\u0435\u043c\u0443 <strong>CompoundStmtNode<\/strong>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u0434\u0443\u0442 <strong>AssignmentNode<\/strong>. \u0412\u043e\u0442 \u0442\u0430\u043a\u0438\u0435 \u043f\u0438\u0440\u043e\u0433\u0438. \u0415\u0441\u043b\u0438 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0430\u0439\u043b <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/dsql\/StmtNodes.cpp\" rel=\"noopener noreferrer nofollow\">StmtNodes.cpp<\/a> , \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u043e\u0442\u043e\u043c\u043a\u0438 StmtNode \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u043c\u0435\u0442\u043e\u0434 genBlr(), \u0432\u043e\u0442 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/dsql\/StmtNodes.cpp#L5079\" rel=\"noopener noreferrer nofollow\"><strong>ForNode::genBlr()<\/strong><\/a> .<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041c\u044b \u043f\u0440\u043e\u0448\u043b\u0438\u0441\u044c \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0442\u0430\u043a, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043a\u0430\u043a C++ \u043a\u043b\u0430\u0441\u0441, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439\u0441\u044f \u043e\u0442 <strong>StmtNode<\/strong>, \u0441 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 execute().<\/p>\n<p>\u0427\u0442\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0446\u0438\u043a\u043b\u0435 \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0445 \u043f\u043e\u043b\u0435\u0439, \u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0431\u0443\u0444\u0435\u0440 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d \u0432 \u0443\u0437\u043b\u0435 <strong>MessageNode<\/strong>. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u044d\u0442\u0438 <strong>StmtNode<\/strong>, \u0438 \u0441\u0430\u043c\u044b\u0439 \u0437\u0430\u0433\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e <strong>ParameterNode<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u043a\u0443\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u043e\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 message, \u0447\u0442\u043e \u0438 <strong>SuspendNode<\/strong>.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0441\u0442\u0440\u043e\u043a\u0438? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c:<\/p>\n<ol>\n<li>\n<p>\u0412 VIO c\u0442\u0440\u043e\u043a\u0430 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 rle-\u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0430, \u0432 \u0431\u0443\u0444\u0435\u0440, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e Format-\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 EXE_assignment() \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 \u0431\u0443\u0444\u0435\u0440, \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0433\u0434\u0435 \u0442\u043e \u0432 request-&gt;impure.<\/p>\n<\/li>\n<li>\n<p>EXE_receive() \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0431\u0443\u0444\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438-\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432 \u0441\u0432\u043e\u0439 \u0431\u0443\u0444\u0435\u0440.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434 DsqlDmlRequest::mapInOut() \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 \u0446\u0438\u043a\u043b\u0435 \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0431\u0443\u0444\u0435\u0440.<\/p>\n<\/li>\n<\/ol>\n<h2>\u0421\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430<\/h2>\n<ol>\n<li>\n<p>\u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0430\u0448\u043b\u0430\u0441\u044c. \u0410 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u0435\u0441\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043d\u0435\u0442? \u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: <span class=\"habrahidden\">\u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0432 ForNode::execute()<\/span>.<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/931218\/\"> https:\/\/habr.com\/ru\/articles\/931218\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0438\u0437\u0443\u0447\u0430\u043b\u0438, \u043a\u0430\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041c\u044b \u0434\u043e\u0438\u0437\u0443\u0447\u0430\u043b\u0438\u0441\u044c \u0434\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 EXE \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>EXE_looper()<\/strong> \u0432 \u0446\u0438\u043a\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <strong>StmtNode::execute()<\/strong>, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435, \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043e\u0442 <strong>StmtNode<\/strong>. \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043f\u0440\u043e\u0439\u0434\u0451\u043c \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0443\u0437\u043b\u043e\u0432.<\/p>\n<h2>Dsql@2<\/h2>\n<p>\u041c\u044b \u0441\u043d\u043e\u0432\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u0432 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0435 Dsql, \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043a\u043b\u0430\u0441\u0441\u044b, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0442\u043e\u043c\u043a\u0430\u043c\u0438 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <strong>StmtNode<\/strong>. \u041f\u0435\u0440\u0432\u044b\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c, \u0431\u0443\u0434\u0435\u0442 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/dsql\/StmtNodes.cpp#L8651\" rel=\"noopener noreferrer nofollow\"><strong>StallNode<\/strong><\/a>.<\/p>\n<pre><code class=\"cpp\">const StmtNode* StallNode::execute(thread_db* \/*tdbb*\/, Request* request, ExeState* \/*exeState*\/) const { switch (request-&gt;req_operation) { case Request::req_evaluate: case Request::req_return: request-&gt;req_message = this; request-&gt;req_operation = Request::req_return; request-&gt;req_flags |= req_stall; return this;  case Request::req_proceed: request-&gt;req_operation = Request::req_return; return parentStmt;  default: return parentStmt; } }<\/code><\/pre>\n<p>\u0410\u0433\u0430, \u0442\u0443\u0442 \u0447\u0442\u043e-\u0442\u043e \u0442\u0438\u043f\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430, event-\u043e\u043c \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 <em>request-&gt;req_operation<\/em>, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <em>req_operation<\/em> \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 &#8212; \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0421\u0430\u043c\u044b\u043c \u043f\u0435\u0440\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <em>req_operation<\/em> \u0431\u0443\u0434\u0435\u0442 <em>req_sync<\/em>, \u0438 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <strong>StallNode::execute()<\/strong> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <em>parentStmt<\/em>, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/dsql\/StmtNodes.cpp#L5187\" rel=\"noopener noreferrer nofollow\"><strong>ForNode<\/strong><\/a>.<\/p>\n<pre><code class=\"cpp\">const StmtNode* ForNode::execute(thread_db* tdbb, Request* request, ExeState* \/*exeState*\/) const { jrd_tra* transaction = request-&gt;req_transaction; ImpureMerge* merge = request-&gt;getImpure&lt;ImpureMerge&gt;(impureOffset); Impure* impure = merge;  switch (request-&gt;req_operation) { case Request::req_evaluate: \/\/ initialize impure values impure-&gt;savepoint = 0; impure-&gt;writeLockMode = false; if (marks &amp; MARK_MERGE) merge-&gt;recUpdated = nullptr;  if (!(transaction-&gt;tra_flags &amp; TRA_system) &amp;&amp; transaction-&gt;tra_save_point &amp;&amp; transaction-&gt;tra_save_point-&gt;hasChanges()) { const Savepoint* const savepoint = transaction-&gt;startSavepoint(); impure-&gt;savepoint = savepoint-&gt;getNumber(); }  cursor-&gt;open(tdbb);  if (cursor-&gt;isUpdateCounters()) request-&gt;req_records_affected.clear();  \/\/ fall into  case Request::req_return: if (stall) return stall;  \/\/ fall into  case Request::req_sync: {  const bool fetched = cursor-&gt;fetchNext(tdbb); if (withLock) { const Request* top_request = request-&gt;req_snapshot.m_owner; if ((top_request) &amp;&amp; (top_request-&gt;req_flags &amp; req_update_conflict)) impure-&gt;writeLockMode = true; }  if (fetched) { if (impure-&gt;writeLockMode &amp;&amp; withLock) { \/\/ Skip statement execution and fetch (and try to lock) next record. request-&gt;req_operation = Request::req_sync; return this; }  request-&gt;req_operation = Request::req_evaluate; return statement; } }  if (impure-&gt;writeLockMode) restartRequest(request, transaction);  request-&gt;req_operation = Request::req_return;  if (impure-&gt;savepoint) { while (transaction-&gt;tra_save_point &amp;&amp; transaction-&gt;tra_save_point-&gt;getNumber() &gt;= impure-&gt;savepoint) { fb_assert(!transaction-&gt;tra_save_point-&gt;isChanging()); transaction-&gt;releaseSavepoint(tdbb); } }  \/\/ fall into  default: { if (request-&gt;req_operation == Request::req_unwind) { if (request-&gt;req_flags &amp; (req_leave | req_continue_loop)) { const auto label = nodeAs&lt;LabelNode&gt;(parentStmt.getObject());  \/\/ If CONTINUE matches our label, restart fetching records  if (label &amp;&amp; request-&gt;req_label == label-&gt;labelNumber &amp;&amp; (request-&gt;req_flags &amp; req_continue_loop)) { request-&gt;req_flags &amp;= ~req_continue_loop; request-&gt;req_operation = Request::req_sync; return this; }  \/\/ Otherwise (BREAK\/LEAVE\/EXIT or mismatched CONTINUE), we should unwind further. \/\/ Thus cleanup our savepoint.  if (impure-&gt;savepoint) { while (transaction-&gt;tra_save_point &amp;&amp; transaction-&gt;tra_save_point-&gt;getNumber() &gt;= impure-&gt;savepoint) { transaction-&gt;releaseSavepoint(tdbb); } } } }  cursor-&gt;close(tdbb);  if (marks &amp; MARK_MERGE) { delete merge-&gt;recUpdated; merge-&gt;recUpdated = nullptr; }  return parentStmt; } }  return NULL; }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, <strong>ForNode<\/strong> &#8212; \u044d\u0442\u043e \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 <em>cursor<\/em>, \u0438 \u0432\u044b\u0437\u043e\u0432 <strong>ForNode::execute()<\/strong> \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 <em>req_operation<\/em> \u0440\u0430\u0432\u0435\u043d <em>Request::req_sync<\/em> , \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0432\u044b\u0437\u043e\u0432\u0443 <em>cursor-&gt;fetchNext()<\/em>, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e <em>req_operation<\/em> \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0451\u0442\u0441\u044f \u0432 <em>Request::req_evaluate<\/em>, \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f <em>statement<\/em>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 <strong>SuspendNode<\/strong>.<\/p>\n<h2>RecordSource@2<\/h2>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/recsrc\/Cursor.cpp#L232\" rel=\"noopener noreferrer nofollow\"><strong>Cursor::fetchNext()<\/strong><\/a> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">bool Cursor::fetchNext(thread_db* tdbb) const { if (m_rse-&gt;isScrollable()) return fetchRelative(tdbb, 1);  if (!validate(tdbb)) return false;  const auto request = tdbb-&gt;getRequest(); Impure* const impure = request-&gt;getImpure&lt;Impure&gt;(m_impure);  if (!impure-&gt;irsb_active) { \/\/ error: invalid cursor state status_exception::raise(Arg::Gds(isc_cursor_not_open)); }  if (impure-&gt;irsb_state == EOS) return false;  if (!m_root-&gt;getRecord(tdbb)) { impure-&gt;irsb_state = EOS; return false; }  if (m_updateCounters) { request-&gt;req_records_selected++; request-&gt;req_records_affected.bumpFetched(); }  impure-&gt;irsb_state = POSITIONED; return true; }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043a\u0438\u0439 <em>impure<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u0415\u0433\u043e \u043f\u043e\u043b\u0435 <em>irsb_state<\/em> \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a EOS (end of stream), \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u0438 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 <em>m_root-&gt;getRecord()<\/em>, \u0430 <em>m_root<\/em> &#8212; \u044d\u0442\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 <strong>RecordSource<\/strong>. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 <strong>FullTableScan<\/strong>. \u0412\u043e\u0442 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/recsrc\/FullTableScan.cpp#L135\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430<\/a>:<\/p>\n<pre><code class=\"cpp\">bool FullTableScan::internalGetRecord(thread_db* tdbb) const { JRD_reschedule(tdbb);  Request* const request = tdbb-&gt;getRequest(); record_param* const rpb = &amp;request-&gt;req_rpb[m_stream]; Impure* const impure = request-&gt;getImpure&lt;Impure&gt;(m_impure);  if (!(impure-&gt;irsb_flags &amp; irsb_open)) { rpb-&gt;rpb_number.setValid(false); return false; }  const RecordNumber* upper = impure-&gt;irsb_upper.isValid() ? &amp;impure-&gt;irsb_upper : nullptr;  if (VIO_next_record(tdbb, rpb, request-&gt;req_transaction, request-&gt;req_pool, DPM_next_all, upper)) { rpb-&gt;rpb_number.setValid(true); return true; }  rpb-&gt;rpb_number.setValid(false); return false; }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 <strong>VIO_next_record()<\/strong>. \u0423\u0433\u043b\u0443\u0431\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u0433\u043e \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u043d\u043e \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>\u041a\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043b <strong>Cursor<\/strong> \u0438 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043b <em>m_root<\/em> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <strong>FullTableScan<\/strong> ?<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b VIO, \u0442\u043e \u0442\u0430\u043c \u0431\u044b\u043b\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u0432 <em>rpb<\/em> \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f <strong>Relation<\/strong>, \u0432 \u043a\u043e\u0442\u043e\u043c \u0437\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d <strong>Format<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0446\u0435\u043f\u043b\u044f\u0435\u0442\u0441\u044f \u043a \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u0440\u0438 \u0435\u0451 \u0447\u0442\u0435\u043d\u0438\u0438. \u0417\u043d\u0430\u0447\u0438\u0442, \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b <em>rpb<\/em> \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0445 \u0441\u0442\u0440\u043e\u043a. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 <em>rpb<\/em> \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <em>request-&gt;req_rpb<\/em> \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 <em>m_stream<\/em> , \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435. \u042f \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0443, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 <em>request<\/em> &#8212; \u044d\u0442\u043e \u043e\u0434\u0438\u043d SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u043e\u0439 (select securityId, avg(price) from orders group by securityId), \u0442\u043e \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <strong>RecordSource<\/strong>: \u043e\u0434\u0438\u043d \u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0432\u0442\u043e\u0440\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u0442. \u0418 \u0442\u043e\u0433\u0434\u0430 <em>m_stream<\/em> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c <strong>RecordSource<\/strong>. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430: \u043f\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e <em>m_stream<\/em> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a <em>req_rpb<\/em>. \u042f, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u0438 \u0432\u0441\u0451 \u0442\u0430\u043a\u043e\u0435, \u043d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 <em>m_stream<\/em> \u0438 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 <em>rpb<\/em>, \u043d\u0430 \u043f\u0430\u0440\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043c\u0435\u043d\u044c\u0448\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 ? \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c. \u041f\u0435\u0440\u0432\u0430\u044f \u0438\u0434\u0435\u044f: <em>request<\/em> \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 \u0442\u043e\u043c \u0448\u0430\u0433\u0435, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u041d\u043e \u044f \u043c\u043e\u0433\u0443 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c: \u0432 <strong>FullTableScan::internalOpen()<\/strong> , \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c <strong>internalGetRecord()<\/strong>, \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a <em>rpb<\/em>, \u044f \u0431\u044b \u0435\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b \u0432 this.<\/p>\n<\/li>\n<li>\n<p>\u041d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c, \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <em>impure-&gt;irsb_upper<\/em> . \u0427\u0442\u043e \u044d\u0442\u043e \u0438 \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0451\u0442\u0441\u044f ?<\/p>\n<\/li>\n<\/ol>\n<h2>Dsql@3<\/h2>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0443\u0437\u043b\u043e\u043c \u0432 \u043d\u0430\u0448\u0435\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/dsql\/StmtNodes.cpp#L8745\" rel=\"noopener noreferrer nofollow\"><strong>SuspendNode<\/strong><\/a>, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0439 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 <em>req_evaluate<\/em><\/p>\n<pre><code class=\"cpp\">const StmtNode* SuspendNode::execute(thread_db* tdbb, Request* request, ExeState* \/*exeState*\/) const { switch (request-&gt;req_operation) { case Request::req_evaluate: { \/\/ ASF: If this is the send in the tail of a procedure and the procedure was called \/\/ with a SELECT, don't run all the send statements. It may make validations fail when \/\/ the procedure didn't return any rows. See CORE-2204. \/\/ But we should run the last assignment, as it's the one who make the procedure stop.  if (!(request-&gt;req_flags &amp; req_proc_fetch)) return statement;  const CompoundStmtNode* list = nodeAs&lt;CompoundStmtNode&gt;(parentStmt);  if (list &amp;&amp; !list-&gt;parentStmt &amp;&amp; list-&gt;statements[list-&gt;statements.getCount() - 1] == this) { list = nodeAs&lt;CompoundStmtNode&gt;(statement);  if (list &amp;&amp; list-&gt;onlyAssignments &amp;&amp; list-&gt;statements.hasData()) { \/\/ This is the assignment that sets the EOS parameter. const AssignmentNode* assign = static_cast&lt;const AssignmentNode*&gt;( list-&gt;statements[list-&gt;statements.getCount() - 1].getObject()); EXE_assignment(tdbb, assign); } else return statement; } else return statement;  \/\/ fall into }  case Request::req_return: request-&gt;req_operation = Request::req_send; request-&gt;req_message = message; request-&gt;req_flags |= req_stall; return this;  case Request::req_proceed: request-&gt;req_operation = Request::req_return; return parentStmt;  default: return parentStmt; } }<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 <em>request-&gt;req_flags<\/em> \u043d\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0444\u043b\u0430\u0433 <em>req_proc_fetch<\/em> (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441, \u0430 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u043c\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430), \u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0439 return statement. \u0418 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/dsql\/StmtNodes.cpp#L879\" rel=\"noopener noreferrer nofollow\"><strong>CompondStmtNode<\/strong><\/a>.<\/p>\n<pre><code class=\"cpp\">const StmtNode* CompoundStmtNode::execute(thread_db* tdbb, Request* request, ExeState* \/*exeState*\/) const { const NestConst&lt;StmtNode&gt;* end = statements.end();  if (onlyAssignments &amp;&amp; !request-&gt;req_attachment-&gt;isProfilerActive()) { if (request-&gt;req_operation == Request::req_evaluate) { for (const NestConst&lt;StmtNode&gt;* i = statements.begin(); i != end; ++i) { const StmtNode* stmt = i-&gt;getObject(); EXE_assignment(tdbb, static_cast&lt;const AssignmentNode*&gt;(stmt)); }  request-&gt;req_operation = Request::req_return; }  return parentStmt; }  impure_state* impure = request-&gt;getImpure&lt;impure_state&gt;(impureOffset);  switch (request-&gt;req_operation) {<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-468713","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/468713","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=468713"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/468713\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=468713"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=468713"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=468713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}