{"id":467894,"date":"2025-07-20T21:48:49","date_gmt":"2025-07-20T21:48:49","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=467894"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=467894","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 2<\/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 <a href=\"https:\/\/habr.com\/ru\/articles\/918552\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/a> \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c, \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \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. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0441 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<h2>RecordSource<\/h2>\n<p>\u041f\u043e\u0438\u0449\u0435\u043c, \u043a\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <strong>VIO_get()<\/strong>, \u0438 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0434\u0432\u0430 \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430: <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/recsrc\/BitmapTableScan.cpp#L113\" rel=\"noopener noreferrer nofollow\"><strong>BitmapTableScan::internalGetRecord()<\/strong><\/a> \u0438 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/recsrc\/IndexTableScan.cpp#L320\" rel=\"noopener noreferrer nofollow\"><strong>IndexTableScan::internalGetRecord()<\/strong><\/a>, \u043e\u0431\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \/src\/jrd\/recsrc\/ . \u042f \u043d\u0430\u0437\u043e\u0432\u0443 \u044d\u0442\u0443 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0443 &#171;Record Source&#187;, \u043d\u043e \u0435\u0449\u0451 \u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 &#171;\u041c\u0435\u0442\u043e\u0434\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430\/Access methods&#187; \u0432\u043e\u0442 \u0432 <a href=\"https:\/\/www.ibase.ru\/files\/articles\/firebird5\/data_access_methods\/firebird-dataaccess-path-ru.html\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u0439 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>. \u0420\u0430\u0441\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043c\u044b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0441 \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439: \u043a\u043b\u0430\u0441\u0441\u044b <strong>BitmapTableScan<\/strong> \u0438 <strong>IndexTableScan<\/strong> \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043c\u043a\u0430\u043c\u0438 <strong>RecordStream<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u043c <strong>RecordSource<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u043c <strong>AccessPath<\/strong>. \u0422\u043e \u0435\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0442\u0443\u0442 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 framework. \u0412 VSCode \u044f \u043d\u0435 \u0437\u043d\u0430\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u0430, \u043a\u0430\u043a \u0438\u0441\u043a\u0430\u0442\u044c, \u043a\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b, \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e &#171;Find references&#187;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0449\u0435\u0442 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u0432 \u043a\u043b\u0430\u0441\u0441\u0430\u0445-\u043f\u043e\u0442\u043e\u043c\u043a\u0430\u0445. \u0427\u0435\u0440\u0435\u0437 \u0430\u043d\u0430\u043b\u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0432\u044b\u0440\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<h2>Debugger<\/h2>\n<p>\u0427\u0442\u043e \u0436\u0435, \u043e\u043f\u044f\u0442\u044c \u043c\u0435\u043d\u044f\u0435\u043c \u043f\u043e\u0434\u0445\u043e\u0434 \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043d\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043f\u0440\u0438\u0451\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0438: \u043e\u0442\u043b\u0430\u0434\u043a\u0430! \u042f \u0431\u0443\u0434\u0443 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437 VSCode c \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 C\/C++. \u041a\u0442\u043e-\u0442\u043e \u0438\u0437 \u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u0442\u043e\u0436\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f VSCode, \u0438 \u0434\u0430\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043a\u0430\u0442\u0430\u043b\u043e\u0433 &#171;.vscode&#187; \u0432 git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u043d\u0435 \u043d\u0430\u0434\u043e \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c. \u0412\u044b\u0431\u0438\u0440\u0430\u044e \u0432 \u043c\u0435\u043d\u044e &#171;Run&#187;\/&#187;Open configurations&#187;, \u0441\u0442\u0438\u0440\u0430\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0430\u0432\u0442\u043e\u0440\u043e\u0432, \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e \u0441\u0432\u043e\u044e, \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e:<\/p>\n<pre><code class=\"json\">\"configurations\": [ { \"name\": \"(Windows) Attach\", \"type\": \"cppvsdbg\", \"request\": \"attach\", \"program\": \"C:\\\\tools\\\\firebird\\\\firebird.exe\", \"symbolSearchPath\": \"C:\\\\tools\\\\firebird\\\\;C:\\\\tools\\\\firebird\\\\plugins\\\\\", \"requireExactSource\": true }, ] <\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u044b, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0438\u0441\u044c, \u044f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0430\u043f \u0441\u0431\u043e\u0440\u043a\u0438 Firebird \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0438\u0437 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430 \u0441\u043e\u0431\u0440\u0430\u043d \u0438\u0437 \u0442\u0435\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0441\u043a\u0430\u0447\u0430\u043b \u043f\u043e git-\u0442\u0435\u0433\u0443. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043c\u043d\u0435 \u043f\u0440\u0438\u0446\u0435\u043f\u043b\u044f\u0442\u044c\u0441\u044f \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u043e\u043c \u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c\u0443 \u0438\u0437 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430. \u0425\u043e\u0440\u043e\u0448\u0430\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c: \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, VSCode \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043b\u044f \u043f\u0440\u0438\u0446\u0435\u043f\u043b\u044f\u043d\u0438\u044f, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c firebird.exe . \u0415\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e: \u0441\u0442\u0430\u0432\u043b\u044e \u044f \u0442\u043e\u0447\u043a\u0443 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 <strong>VIO_data()<\/strong>, \u0438 \u044d\u0442\u0430 \u0442\u043e\u0447\u043a\u0430 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442, \u043d\u043e VSCode \u0433\u043e\u0432\u043e\u0440\u0438\u0442: \u043d\u0435 \u043c\u043e\u0433\u0443 \u043d\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043b &#171;c:\\firebird-build\\src\\jrd\\vio.cpp&#187;. \u041d\u0443 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043e\u043d \u043d\u0435 \u043c\u043e\u0436\u0435\u0442, \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u0443\u0442\u0438 \u043b\u0435\u0436\u0430\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043d\u0430 \u0442\u043e\u0439 build-\u043c\u0430\u0448\u0438\u043d\u0435, \u0433\u0434\u0435 Firebird \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438 \u0432 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432, \u0438 \u044d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u0432 pdb-\u0444\u0430\u0439\u043b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0441\u044f, \u0430 \u0443 \u043c\u0435\u043d\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043b\u0435\u0436\u0430\u0442. \u042f \u043d\u0435 \u0437\u043d\u0430\u044e, \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0442\u0443\u0434\u0430 \u0436\u0435, \u0433\u0434\u0435 \u043e\u043d\u0438 \u043b\u0435\u0436\u0430\u043b\u0438 \u043d\u0430 build-\u043c\u0430\u0448\u0438\u043d\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451.<\/p>\n<p>\u0421\u0442\u0430\u0432\u0438\u043c \u0442\u043e\u0447\u043a\u0443 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0430 \u0432 <strong>VIO_data()<\/strong>, \u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0443\u043f\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 &#171;SELECT * FROM ORDERS&#187;, \u0442\u043e\u0447\u043a\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0430 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 stacktrace:<\/p>\n<pre><code>engine13.dll!VIO_data() engine13.dll!VIO_next_record() engine13.dll!Jrd::FullTableScan::internalGetRecord() engine13.dll!Jrd::RecordSource::getRecord() engine13.dll!Jrd::Cursor::fetchNext() engine13.dll!Jrd::ForNode::execute() engine13.dll!EXE_looper() engine13.dll!looper_seh() engine13.dll!execute_looper() engine13.dll!EXE_receive() engine13.dll!JRD_receive() engine13.dll!Jrd::DsqlDmlRequest::executeReceiveWithRestarts() engine13.dll!Jrd::DsqlDmlRequest::fetch() engine13.dll!Jrd::DsqlCursor::fetchNext() engine13.dll!Jrd::JResultSet::fetchNext() engine13.dll!Firebird::IResultSetBaseImpl::cloopfetchNextDispatcher() [Inline Frame] fbclient.dll!Firebird::IResultSet::fetchNext() fbclient.dll!Why::YResultSet::fetchNext() fbclient.dll!Firebird::IResultSetBaseImpl::cloopfetchNextDispatcher() [Inline Frame] firebird.exe!Firebird::IResultSet::fetchNext() firebird.exe!rem_port::fetch() firebird.exe!process_packet() firebird.exe!loopThread() [Inline Frame] firebird.exe!`anonymous-namespace'::ThreadArgs::run() firebird.exe!threadStart() ucrtbase.dll!00007ffc494a1bb2() kernel32.dll!00007ffc4b4a7374() ntdll.dll!00007ffc4b93cc91()<\/code><\/pre>\n<p>\u0427\u0442\u043e \u0436\u0435 \u0442\u0443\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e? \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0444\u0443\u043d\u043a\u0446\u0438\u044f <strong>VIO_data()<\/strong> \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043d\u0435 \u0438\u0437 <strong>VIO_get()<\/strong>, \u0430 \u0438\u0437 <strong>VIO_next_record()<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0435\u0449\u0451 \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438. \u0410 \u0432\u043e\u0442 \u043e\u043d\u0430 \u0443\u0436\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 <strong>FullTableScan::internalGetRecord()<\/strong>, \u044d\u0442\u043e \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0442\u0440\u043e\u043a\u0430\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0441\u043c\u044b\u0441\u043b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0442\u0443\u043f\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0430\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0434\u0440\u044f\u0434. \u041e\u043d \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u043a \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 WHERE, \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430\u0448 \u0441\u043b\u0443\u0447\u0430\u0439. \u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0441\u0442\u0435\u043a\u0442\u0440\u0435\u0439\u0441\u0443 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 RecordSource. \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0438 \u043e \u0447\u0451\u043c \u043d\u0435 \u0441\u043a\u0430\u0436\u0443\u0442, \u0438 \u0432\u0438\u0434\u0438\u043c <strong>Jrd::JResultSet::fetchNext()<\/strong>, \u044d\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 API-\u0432\u044b\u0437\u043e\u0432. \u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0443\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/remote\/server\/server.cpp#L5007\" rel=\"noopener noreferrer nofollow\"><strong>process_packet()<\/strong><\/a> \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 &#171;server.cpp&#187;. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440 \u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442 \u0441 \u0434\u0432\u0443\u043c\u044f \u0432\u0435\u0449\u0430\u043c\u0438: \u0441\u0435\u0442\u044c \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0434\u0438\u0441\u043a \u0441 \u0434\u0440\u0443\u0433\u043e\u0439. \u0422\u0430\u043a \u0432\u043e\u0442, <strong>process_packet()<\/strong> &#8212; \u044d\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u0422\u0430\u043c \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u0439 switch \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e, \u0447\u0442\u043e \u044f \u043d\u0435 \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0441\u043a\u043e\u043f\u043a\u0438 \u043e\u0442\u0442\u0443\u0434\u0430. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 Firebird, \u0442\u043e \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0447\u0430\u0442\u044c. \u041e\u0442 \u0441\u0435\u0431\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044e \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u0441 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u043c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u0432\u0441\u0451 \u043f\u043b\u043e\u0445\u043e: \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0435\u0442 \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<p>\u0420\u0430\u043d\u0435\u0435, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434, \u043c\u044b \u0448\u043b\u0438 \u043e\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043a \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u043c, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c &#171;\u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445&#187;. \u0412 \u043e\u0442\u043b\u0430\u0434\u043a\u0435 \u0442\u0430\u043a \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e: \u0442\u043e\u0447\u043a\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0430 \u043f\u043e\u043c\u043e\u0433\u043b\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u044f\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u0434\u0435\u043b\u0430\u044e \u0442\u0430\u043a: \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u0431\u0435\u0440\u0443\u0441\u044c \u043f\u043e\u0432\u044b\u0448\u0435, \u0432 <strong>JResultSet::fetchNext()<\/strong>, \u0438 \u0431\u0443\u0434\u0443 \u0441\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u0442\u0443\u0434\u0430. \u0410 stacktrace \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c. \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043f\u0440\u043e\u0439\u0434\u0451\u043c \u043f\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0445 \u0432 stacktrace.<\/p>\n<p>\u0421\u0430\u043c <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/EngineInterface.h#L154\" rel=\"noopener noreferrer nofollow\"><strong>JResultSet<\/strong><\/a> \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0439: \u043e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <strong>JStatement<\/strong>, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u0440\u043e\u0434\u0438\u043b\u043e \u044d\u0442\u043e\u0442 <strong>JResultSet<\/strong>, \u0438 <strong>DslCursor<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443. \u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/jrd.cpp#L5436\" rel=\"noopener noreferrer nofollow\"><strong>JResultSet::fetchNext()<\/strong><\/a> \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u0432\u044b\u0437\u044b\u0432\u0430\u044f <strong>DslCursor::fetchNext()<\/strong>, \u0447\u0442\u043e \u043c\u044b \u0438 \u0432\u0438\u0434\u0435\u043b\u0438 \u0432 stacktrace.<\/p>\n<h2>Dsql@1<\/h2>\n<p>\u041a\u043b\u0430\u0441\u0441 <strong>DslCursor<\/strong> \u0442\u043e\u0436\u0435 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439. \u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0437\u0430\u043f\u0438\u0441\u044f\u043c, \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u044d\u0442\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f (\u044f \u043e\u0431\u0435\u0449\u0430\u043b \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f core-\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438). \u041c\u0435\u0442\u043e\u0434 <strong>DslCursor::fetchNext()<\/strong> \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u0435\u0442\u043e\u0434\u0443 <strong>DsqlDmlRequest::fetch()<\/strong>.<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/dsql\/DsqlRequests.cpp\" rel=\"noopener noreferrer nofollow\"><strong>DsqlDmlRequest::fetch()<\/strong><\/a> \u0443\u0436\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435.<\/p>\n<pre><code class=\"cpp\">\/\/ Fetch next record from a dynamic SQL cursor. bool DsqlDmlRequest::fetch(thread_db* tdbb, UCHAR* msgBuffer) { SET_TDBB(tdbb);  Jrd::ContextPoolHolder context(tdbb, &amp;getPool());  \/\/ if the cursor isn't open, we've got a problem if (dsqlStatement-&gt;isCursorBased()) { if (!req_cursor) { ERRD_post(Arg::Gds(isc_sqlerr) &lt;&lt; Arg::Num(-504) &lt;&lt;   Arg::Gds(isc_dsql_cursor_err) &lt;&lt;   Arg::Gds(isc_dsql_cursor_not_open)); } }  if (!request) { ERRD_post(Arg::Gds(isc_sqlerr) &lt;&lt; Arg::Num(-504) &lt;&lt;   Arg::Gds(isc_unprepared_stmt)); }  dsql_msg* message = (dsql_msg*) dsqlStatement-&gt;getReceiveMsg();  if (delayedFormat &amp;&amp; message) { parseMetadata(delayedFormat, message-&gt;msg_parameters); delayedFormat = NULL; }  \/\/ Set up things for tracing this call Jrd::Attachment* att = req_dbb-&gt;dbb_attachment; TraceDSQLFetch trace(att, this);  thread_db::TimerGuard timerGuard(tdbb, req_timer, false); if (req_timer &amp;&amp; req_timer-&gt;expired()) tdbb-&gt;checkCancelState();  UCHAR* dsqlMsgBuffer = req_msg_buffers[message-&gt;msg_buffer_number]; if (!firstRowFetched &amp;&amp; needRestarts()) { \/\/ Note: tra_handle can't be changed by executeReceiveWithRestarts below \/\/ and outMetadata and outMsg in not used there, so passing NULL's is safe. jrd_tra* tra = req_transaction;  executeReceiveWithRestarts(tdbb, &amp;tra, NULL, NULL, false, false, true); } else JRD_receive(tdbb, request, message-&gt;msg_number, message-&gt;msg_length, dsqlMsgBuffer);  firstRowFetched = true;  const dsql_par* const eof = dsqlStatement-&gt;getEof(); const USHORT* eofPtr = eof ? (USHORT*) (dsqlMsgBuffer + (IPTR) eof-&gt;par_desc.dsc_address) : NULL; const bool eofReached = eof &amp;&amp; !(*eofPtr);  if (eofReached) { if (req_timer) req_timer-&gt;stop();  trace.fetch(true, ITracePlugin::RESULT_SUCCESS); return false; }  if (msgBuffer) { Request* old = tdbb-&gt;getRequest(); Cleanup restoreRequest([tdbb, old] {tdbb-&gt;setRequest(old);}); tdbb-&gt;setRequest(request); mapInOut(tdbb, true, message, NULL, msgBuffer); }  trace.fetch(false, ITracePlugin::RESULT_SUCCESS); return true; }<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0442\u044c \u0438 \u0441\u043d\u043e\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u043c\u0435\u0442\u043e\u0434\u0443. \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0441\u044f\u043a\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u0434\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0434\u043e \u043c\u0435\u0441\u0442\u0430 &#171;dsqlStatement-&gt;getReceiveMsg()&#187;, \u0438 \u0447\u0435\u0448\u0435\u043c \u0437\u0430\u0442\u044b\u043b\u043e\u043a \u0432 \u043d\u0435\u0434\u043e\u0443\u043c\u0435\u043d\u0438\u0438: \u043a\u0430\u043a\u043e\u0439 \u0435\u0449\u0451 receiveMsg ? \u041a\u0430\u043a \u0445\u043e\u0440\u043e\u0448\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c. \u0411\u0443\u0434\u0435\u0442 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u043d\u0430 11 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438. \u041e\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434 <strong>parseMetadata()<\/strong> \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u043e\u043b\u0435\u043c <em>delayedFormat<\/em>. \u041f\u043e\u043b\u0435<em> delayedFormat<\/em> &#8212; \u044d\u0442\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e API, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u043d \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c. \u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u0442\u043e\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 API, \u043c\u0435\u0442\u043e\u0434\u043e\u043c <strong>JResultSet::setDelayedFormat()<\/strong>. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/dsql\/DsqlRequests.cpp#L230\" rel=\"noopener noreferrer nofollow\"><strong>DsqlRequest::parseMetadata()<\/strong><\/a>.<\/p>\n<pre><code class=\"cpp\">\/\/ Parse the message of a request. USHORT DsqlRequest::parseMetadata(IMessageMetadata* meta, const Array&lt;dsql_par*&gt;&amp; parameters_list) { HalfStaticArray&lt;const dsql_par*, 16&gt; parameters;  for (FB_SIZE_T i = 0; i &lt; parameters_list.getCount(); ++i) { dsql_par* param = parameters_list[i];  if (param-&gt;par_index) { if (param-&gt;par_index &gt; parameters.getCount()) parameters.grow(param-&gt;par_index); parameters[param-&gt;par_index - 1] = param; } }  \/\/ If there's no metadata, then the format of the current message buffer \/\/ is identical to the format of the previous one. if (!meta) return parameters.getCount();  FbLocalStatus st; unsigned count = meta-&gt;getCount(&amp;st);  unsigned count2 = parameters.getCount();  if (count != count2) { ERRD_post(Arg::Gds(isc_dsql_sqlda_err) &lt;&lt;   Arg::Gds(isc_dsql_wrong_param_num) &lt;&lt;Arg::Num(count2) &lt;&lt; Arg::Num(count)); }  unsigned offset = 0;  for (USHORT index = 0; index &lt; count; index++) { unsigned sqlType = meta-&gt;getType(&amp;st, index); unsigned sqlLength = meta-&gt;getLength(&amp;st, index);  dsc desc; desc.dsc_flags = 0;  unsigned dataOffset, nullOffset, dtype, dlength; offset = fb_utils::sqlTypeToDsc(offset, sqlType, sqlLength, &amp;dtype, &amp;dlength, &amp;dataOffset, &amp;nullOffset); desc.dsc_dtype = dtype; desc.dsc_length = dlength;  desc.dsc_scale = meta-&gt;getScale(&amp;st, index); desc.dsc_sub_type = meta-&gt;getSubType(&amp;st, index); unsigned textType = meta-&gt;getCharSet(&amp;st, index); desc.setTextType(textType); desc.dsc_address = (UCHAR*)(IPTR) dataOffset;  const dsql_par* const parameter = parameters[index];  \/\/ ASF: Older than 2.5 engine hasn't validating strings in DSQL. After this has been \/\/ implemented in 2.5, selecting a NONE column with UTF-8 attachment charset started \/\/ failing. The real problem is that the client encodes SQL_TEXT\/SQL_VARYING using \/\/ blr_text\/blr_varying (i.e. with the connection charset). I'm reseting the charset \/\/ here at the server as a way to make older (and not yet changed) client work \/\/ correctly. if (desc.isText() &amp;&amp; desc.getTextType() == ttype_dynamic) desc.setTextType(ttype_none);  req_user_descs.put(parameter, desc);  dsql_par* null = parameter-&gt;par_null; if (null) { desc.clear(); desc.dsc_dtype = dtype_short; desc.dsc_scale = 0; desc.dsc_length = sizeof(SSHORT); desc.dsc_address = (UCHAR*)(IPTR) nullOffset;  req_user_descs.put(null, desc); } }  return count; }  typedef struct dsc { UCHARdsc_dtype; SCHARdsc_scale; USHORTdsc_length; SSHORTdsc_sub_type; USHORTdsc_flags; UCHAR*dsc_address; \/\/ Used either as offset in a message or as a pointer }<\/code><\/pre>\n<p>\u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u0438\u0434\u0451\u0442 \u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a-\u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 <em>par_index<\/em>. \u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0438 \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0439 \u0446\u0435\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043d\u0435\u0442 &#8212; \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 <em>meta<\/em> \u0438 <em>parameters<\/em> \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0435: \u0446\u0438\u043a\u043b \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 meta. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b dsc. \u0422\u0430\u043a-\u0442\u0430\u043a, \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u044b\u043b\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <strong>Ods::Descriptor<\/strong> , \u043e\u0434\u0438\u043d-\u0432-\u043e\u0434\u0438\u043d. \u0426\u0438\u043a\u043b \u0438\u0434\u0451\u0442 \u043f\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u044f \u043b\u0435\u0436\u0430\u0442 \u0434\u0440\u0443\u0433 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u043c, \u0438 \u0440\u0430\u0441c\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 <em>dsc_address<\/em> \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0432 \u044d\u0442\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0412 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u043e\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043c\u0430\u043f\u0443 <em>req_user_desc<\/em>.<\/p>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0432 <strong>fetch()<\/strong>. \u0418\u0442\u0430\u043a, <strong>parseMetadata()<\/strong> \u0441\u043a\u0440\u0435\u0441\u0442\u0438\u043b\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438\u0437 <em>receivedMsg<\/em> \u0438 <em>delayedFormat<\/em>, \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0435\u0434\u0438\u043d\u043e\u043c \u0431\u0443\u0444\u0435\u0440\u0435 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0432 \u044d\u0442\u043e \u0432 <em>req_user_desc<\/em>. \u042d\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435 <em>delayedFormat<\/em> \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u043f\u0440\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0432\u044b\u0437\u043e\u0432\u0430\u0445 <strong>fetch()<\/strong> \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0436\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 <em>req_user_desc<\/em>.<\/p>\n<p>\u0421\u043f\u0443\u0441\u0442\u0438\u043c\u0441\u044f \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c if, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0431\u044b\u043b\u0430 \u043b\u0438 \u0443\u0436\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0430 \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 <strong>executeReceiveWithRestarts()<\/strong> \u0438\u043b\u0438 <strong>JRD_Receive()<\/strong>. \u041c\u044b \u043f\u043e\u0439\u0434\u0451\u043c \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445, \u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u0438\u043c\u0441\u044f \u0435\u0449\u0451 \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u0432 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0422\u0443\u0442 \u0435\u0441\u0442\u044c TraceDsqlFetch, \u0438 \u0435\u0441\u043b\u0438 \u043c\u044b \u0432 \u043d\u0435\u0433\u043e \u0447\u0443\u0442\u044c \u0443\u0433\u043b\u0443\u0431\u0438\u043c\u0441\u044f, \u0442\u043e \u043f\u043e\u043f\u0430\u0434\u0451\u043c \u0432 <strong>TraceManager::event_dsql_execute()<\/strong> . \u041f\u0440\u0438\u0433\u043b\u044f\u0434\u0435\u0432\u0448\u0438\u0441\u044c \u043f\u043e\u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435, \u043c\u044b \u043f\u043e\u0439\u043c\u0451\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 <strong>TraceManager<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0438\u0441\u0430\u043b \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438. \u0412 \u0444\u0430\u0439\u043b\u0435 &#171;TraceManager.h&#187; \u0443 \u043a\u043b\u0430\u0441\u0441\u0430 TraceManager \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043c\u0435\u0442\u043e\u0434\u044b \u0442\u0438\u043f\u0430 &#171;event_proc_compile&#187;, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c. \u0422\u0430\u043a \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 &#8212; \u043e\u043d \u0432\u043e\u0442 \u0442\u0443\u0442. \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043c\u0443\u0449\u0430\u0435\u0442, \u0447\u0442\u043e <strong>event_dsql_prepare()<\/strong> \u043e\u043f\u0438\u0441\u0430\u043d \u043a\u0430\u043a static \u0438 \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u0435\u0433\u043e \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0443 \u0434\u0430 \u043b\u0430\u0434\u043d\u043e, \u043a\u0430\u043a-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0442\u043e\u043c \u0440\u0430\u0437\u0431\u0435\u0440\u0443\u0441\u044c.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0435\u0449\u0451 \u043d\u0435 \u0431\u044b\u043b\u0430 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0430, \u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/dsql\/DsqlRequests.cpp#L747\" rel=\"noopener noreferrer nofollow\"><strong>executeReceiveWithRestarts()<\/strong><\/a>, \u043f\u0440\u0438\u0447\u0451\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <em>exec<\/em> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d <strong>false<\/strong>, \u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <em>fetch<\/em> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d <strong>true<\/strong>. \u0427\u0442\u043e \u0436\u0435, \u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043d\u0435\u0433\u043e.<\/p>\n<pre><code class=\"cpp\">void DsqlDmlRequest::executeReceiveWithRestarts(thread_db* tdbb, jrd_tra** traHandle, IMessageMetadata* outMetadata, UCHAR* outMsg, bool singleton, bool exec, bool fetch) { request-&gt;req_flags &amp;= ~req_update_conflict; int numTries = 0; const int MAX_RESTARTS = 10;  while (true) { AutoSavePoint savePoint(tdbb, req_transaction);  \/\/ Don't set req_restart_ready flag at last attempt to restart request. \/\/ It allows to raise update conflict error (if any) as usual and \/\/ handle error by PSQL handler. const ULONG flag = (numTries &gt;= MAX_RESTARTS) ? 0 : req_restart_ready; AutoSetRestoreFlag&lt;ULONG&gt; restartReady(&amp;request-&gt;req_flags, flag, true); try { if (exec) doExecute(tdbb, traHandle, outMetadata, outMsg, singleton);  if (fetch) { const dsql_msg* message = dsqlStatement-&gt;getReceiveMsg(); UCHAR* dsqlMsgBuffer = req_msg_buffers[message-&gt;msg_buffer_number]; JRD_receive(tdbb, request, message-&gt;msg_number, message-&gt;msg_length, dsqlMsgBuffer); } } catch (const status_exception&amp;) { if (!(req_transaction-&gt;tra_flags &amp; TRA_ex_restart)) { request-&gt;req_flags &amp;= ~req_update_conflict; throw; } }  if (!(request-&gt;req_flags &amp; req_update_conflict)) { req_transaction-&gt;tra_flags &amp;= ~TRA_ex_restart; savePoint.release();\/\/ everything is ok break; }  request-&gt;req_flags &amp;= ~req_update_conflict; req_transaction-&gt;tra_flags &amp;= ~TRA_ex_restart; fb_utils::init_status(tdbb-&gt;tdbb_status_vector);  \/\/ Undo current savepoint but preserve already taken locks. \/\/ Savepoint will be restarted at the next loop iteration. savePoint.rollback(true);  numTries++; if (numTries &gt;= MAX_RESTARTS){ gds__log(\"Update conflict: unable to get a stable set of rows in the source tables\\n\" \"\\tafter %d attempts of restart.\\n\" \"\\tQuery:\\n%s\\n\", numTries, request-&gt;getStatement()-&gt;sqlText-&gt;c_str() ); }  TraceManager::event_dsql_restart(req_dbb-&gt;dbb_attachment, req_transaction, this, numTries);  \/\/ When restart we must execute query exec = true; } }<\/code><\/pre>\n<p>\u0421\u0443\u0442\u044c \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0446\u0438\u043a\u043b\u0430 while, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f savepoint, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <strong>doExecute()<\/strong> \u0438 <strong>JRD_Receive()<\/strong>. \u0415\u0441\u043b\u0438 \u0431\u044b\u043b\u043e \u0432\u044b\u0431\u0440\u043e\u0448\u0435\u043d\u043e \u0421++ \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0442\u043e \u043e\u043d\u043e \u043b\u043e\u0432\u0438\u0442\u0441\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0444\u043b\u0430\u0433 <em>TRA_ex_restart<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043d\u0443\u043b\u043e \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439, \u043d\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c. \u0415\u0441\u043b\u0438 \u0444\u043b\u0430\u0433 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d, \u0442\u043e savepoint \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0432\u0442\u043e\u0440, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u043d\u043e\u0432\u044b\u0439 savepoint, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u043c. \u042f \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d \u043d\u0430 100%, \u043d\u043e \u043c\u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e SELECT-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432\u0441\u044f \u044d\u0442\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u043d\u0443\u0436\u043d\u0430, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u043d\u0438\u0435 savepoint-\u0430 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0437\u043b\u0438\u0448\u0435\u0441\u0442\u0432\u043e\u043c. \u041f\u043e\u043f\u043e\u0437\u0436\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u044e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0434\u043e\u0440\u043e\u0433\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u044d\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 savepoint-\u0430\u043c\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0434\u043b\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u043e\u043d\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430, \u0443\u0436\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u043e. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0445 \u043d\u0430 JOIN-\u044b.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043c\u0435\u0442\u043e\u0434 <strong>executeReceiveWithRestarts()<\/strong> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u044b\u0437\u043e\u0432\u0435\u0442 <strong>JRD_Receive()<\/strong>. \u041a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0432 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>fetch()<\/strong> \u043e\u043d \u0436\u0435 ( <strong>JRD_Receive()<\/strong> ) \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041e\u0442\u043c\u0435\u0442\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0443\u0434\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u043a\u0438\u0439 <em>request<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 <strong>DsqlDmlRequest<\/strong> \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u043b\u0435. \u0410 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0442\u0440\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <em>dsqlStatement-&gt;message<\/em>, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: \u0435\u0433\u043e \u043d\u043e\u043c\u0435\u0440 <em>msg_number<\/em>, \u0435\u0433\u043e \u0434\u043b\u0438\u043d\u0443 <em>msg_length<\/em> \u0438 \u0430\u0434\u0440\u0435\u0441 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430.<\/p>\n<h2>Exe@1<\/h2>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/jrd.cpp#L9362\" rel=\"noopener noreferrer nofollow\"><strong>JRD_Receive()<\/strong><\/a> \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f, \u0442\u0443\u0442 \u0434\u0430\u0436\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u043d\u0435\u0447\u0435\u0433\u043e.<\/p>\n<pre><code class=\"cpp\">void JRD_receive(thread_db* tdbb, Request* request, USHORT msg_type, ULONG msg_length, void* msg) {  **************************************  * Functional description  *Get a record from the host program.  **************************************\/ EXE_receive(tdbb, request, msg_type, msg_length, msg, true);  check_autocommit(tdbb, request);  if (request-&gt;req_flags &amp; req_warning) { request-&gt;req_flags &amp;= ~req_warning; ERR_punt(); } }<\/code><\/pre>\n<p>\u0427\u0442\u043e \u0438\u043c\u0435\u043b\u043e\u0441\u044c \u0432 \u0432\u0438\u0434\u0443 \u043f\u043e\u0434 &#171;host program&#187; &#8212; \u043d\u0435\u044f\u0441\u043d\u043e.<\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e \u0438\u0434\u0451\u043c \u0432 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/exe.cpp#L662\" rel=\"noopener noreferrer nofollow\"><strong>EXE_receive()<\/strong><\/a>, \u043e\u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0430\u044f. \u041d\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0443\u0433\u0430\u0442\u044c\u0441\u044f, \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0437\u0434\u0435\u0448\u043d\u0438\u0445 if-\u043e\u0432 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435.<\/p>\n<pre><code class=\"cpp\">void EXE_receive(thread_db* tdbb,  Request* request,  USHORT msg,  ULONG length,  void* buffer,  bool top_level) { SET_TDBB(tdbb); DEV_BLKCHK(request, type_req); JRD_reschedule(tdbb);  jrd_tra* transaction = request-&gt;req_transaction;  if (!(request-&gt;req_flags &amp; req_active)) ERR_post(Arg::Gds(isc_req_sync));  SavNumber savNumber = 0;  if (request-&gt;req_flags &amp; req_proc_fetch) { \/* request-&gt;req_proc_sav_point stores the request savepoints.    When going to continue execution put request save point list    into transaction-&gt;tra_save_point so that it is used in looper.    When we come back to EXE_receive() merge all work done under    stored procedure savepoints into the current transaction    savepoint, which is the savepoint for fetch and save them into the list. *\/  if (request-&gt;req_proc_sav_point) { \/\/ We assume here that the saved savepoint stack starts with the \/\/ smallest number, the logic will be broken if this ever changes savNumber = request-&gt;req_proc_sav_point-&gt;getNumber(); \/\/ Push all saved savepoints to the top of transaction savepoints stack Savepoint::mergeStacks(transaction-&gt;tra_save_point, request-&gt;req_proc_sav_point); } else { const auto savepoint = transaction-&gt;startSavepoint(); savNumber = savepoint-&gt;getNumber(); } }  try { if (nodeIs&lt;StallNode&gt;(request-&gt;req_message)) execute_looper(tdbb, request, transaction, request-&gt;req_next, Request::req_sync);  if (!(request-&gt;req_flags &amp; req_active) || request-&gt;req_operation != Request::req_send) ERR_post(Arg::Gds(isc_req_sync));  const MessageNode* message = nodeAs&lt;MessageNode&gt;(request-&gt;req_message); const Format* format = message-&gt;format;  if (msg != message-&gt;messageNumber) ERR_post(Arg::Gds(isc_req_sync));  if (length != format-&gt;fmt_length) ERR_post(Arg::Gds(isc_port_len) &lt;&lt; Arg::Num(length) &lt;&lt; Arg::Num(format-&gt;fmt_length));  memcpy(buffer, request-&gt;getImpure&lt;UCHAR&gt;(message-&gt;impureOffset), length);  \/\/ ASF: temporary blobs returned to the client should not be released \/\/ with the request, but in the transaction end. if (top_level || transaction-&gt;tra_temp_blobs_count) { for (int i = 0; i &lt; format-&gt;fmt_count; ++i) { const DSC* desc = &amp;format-&gt;fmt_desc[i];  if (desc-&gt;isBlob()) { const bid* id = (bid*) (static_cast&lt;UCHAR*&gt;(buffer) + (ULONG)(IPTR) desc-&gt;dsc_address);  if (transaction-&gt;tra_blobs-&gt;locate(id-&gt;bid_temp_id())) { BlobIndex* current = &amp;transaction-&gt;tra_blobs-&gt;current();  if (top_level &amp;&amp; current-&gt;bli_request &amp;&amp; current-&gt;bli_request-&gt;req_blobs.locate(id-&gt;bid_temp_id())) { current-&gt;bli_request-&gt;req_blobs.fastRemove(); current-&gt;bli_request = NULL; }  if (!current-&gt;bli_materialized &amp;&amp; (current-&gt;bli_blob_object-&gt;blb_flags &amp; (BLB_close_on_read | BLB_stream)) == (BLB_close_on_read | BLB_stream)) { current-&gt;bli_blob_object-&gt;BLB_close(tdbb); } } else if (top_level) { transaction-&gt;checkBlob(tdbb, id, NULL, false); } } } }  execute_looper(tdbb, request, transaction, request-&gt;req_next, Request::req_proceed); } catch (const Exception&amp;) { \/\/ In the case of error, undo changes performed under our savepoint  if (savNumber) transaction-&gt;rollbackToSavepoint(tdbb, savNumber);  throw; }  if (savNumber) { \/\/ At this point request-&gt;req_proc_sav_point == NULL that is assured by code above try { \/\/ Merge work into target savepoint and save request's savepoints (with numbers!!!) \/\/ till the next looper iteration while (transaction-&gt;tra_save_point &amp;&amp; transaction-&gt;tra_save_point-&gt;getNumber() &gt;= savNumber) { const auto savepoint = transaction-&gt;tra_save_point; transaction-&gt;releaseSavepoint(tdbb); transaction-&gt;tra_save_free = savepoint-&gt;moveToStack(request-&gt;req_proc_sav_point);  \/\/ Ensure that the priorly existing savepoints are preserved, \/\/ e.g. 10-11-12-(5-6-7) where savNumber == 5. This may happen \/\/ due to looper savepoints being reused in subsequent invokations. if (savepoint-&gt;getNumber() == savNumber) break; } } catch (...) { \/\/ If something went wrong, drop already stored savepoints to prevent memory leak Savepoint::destroy(request-&gt;req_proc_sav_point); throw; } } }<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0438\u0437 \u043d\u0435-\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445 if-\u043e\u0432 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043d\u0435\u0442 \u043b\u0438 \u043d\u0430 request-\u0435 \u0444\u043b\u0430\u0433\u0430 <em>req_proc_fetch<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0441\u0443\u0434\u044f \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u044d\u0442\u043e\u0442 if, \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a \u0432 \u043d\u0435\u0433\u043e \u0442\u043e\u0436\u0435 \u043d\u0435 \u0437\u0430\u0439\u0434\u0451\u0442.<\/p>\n<p>\u0410 \u0432\u043e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e <em>request-&gt;req_message<\/em> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043a\u0438\u043c <strong>StallNode<\/strong>, \u043f\u0440\u043e\u0439\u0434\u0451\u0442, \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d <strong>execute_looper()<\/strong>. \u0422\u043e\u0440\u043c\u043e\u0437\u043d\u0451\u043c \u043d\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u043e\u0447\u043a\u0443 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0435, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0437\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0412 <em>request-&gt;req_message<\/em> \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <strong>Jrd::StallNode<\/strong>. \u0422\u0430\u043a\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0432 <strong>execute_looper()<\/strong>, \u043f\u043e\u043c\u0438\u043c\u043e \u0441\u0430\u043c\u043e\u0433\u043e request-\u0430, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f <em>request-&gt;req_next<\/em> (\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <em>node<\/em>) \u0438 <strong>Request::req_sync<\/strong> (\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <em>next_state<\/em>). \u0412 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e <em>request-&gt;req_message<\/em> \u0438 <em>request-&gt;req_next<\/em> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442, \u0438 \u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u043e\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <strong>execute_looper()<\/strong> \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u0438 \u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u0438 \u043f\u043e\u0437\u0436\u0435 \u043c\u044b \u0435\u0451 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043b\u0443\u0447\u0448\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0451 \u0447\u0451\u0440\u043d\u044b\u043c \u044f\u0449\u0438\u043a\u043e\u043c \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 <strong>EXE_receive()<\/strong>.<\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0438\u0437 <strong>execute_looper()<\/strong> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0443 Request-\u0430 \u0441\u043d\u044f\u0442 \u0444\u043b\u0430\u0433 <em>req_active<\/em> \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <em>req_operation<\/em> \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 <em>req_send<\/em>, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0440\u0443\u0433\u0430\u0435\u043c\u0441\u044f. \u0414\u0430\u043b\u044c\u0448\u0435 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u043c <em>req_message<\/em> \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c, \u0447\u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c <strong>MessageNode<\/strong>. \u0410\u0433\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <strong>execute_looper()<\/strong> \u0442\u0430\u043c \u0431\u044b\u043b <strong>StallNode<\/strong>, \u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u0435\u043c <strong>MessageNode<\/strong>, \u0432\u0438\u0434\u0438\u043c\u043e \u044d\u0442\u043e \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043c\u0443, \u043a\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b <strong>fetch()<\/strong>. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0438\u0437 <strong>MessageNode<\/strong> \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0430\u044f \u043d\u0430\u043c \u0448\u0442\u0443\u043a\u0430 <strong>Format<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435, \u043d\u043e \u0438 \u0442\u043e, \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0441\u0435\u0442\u0438. \u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 <em>messageNumber<\/em> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443, \u0438 \u0447\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u043b \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439. \u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e, \u0442\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 <strong>MessageNode<\/strong> \u0432 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0451\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0431\u043b\u043e\u0431\u044b \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c, \u044d\u0442\u043e \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e <strong>execute_looper()<\/strong> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437, \u0443\u0436\u0435 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <strong>Request::req_proceed<\/strong>, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u041f\u043e\u0445\u043e\u0436\u0435, \u0447\u0442\u043e \u044d\u0442\u043e \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043f\u043e\u0441\u0442-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b.<\/p>\n<p>\u0425\u0432\u043e\u0441\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438 savepoint-\u044b, \u043c\u043d\u0435 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u044f\u0442\u0435\u043d, \u0435\u0433\u043e \u044f \u043f\u0440\u043e\u043f\u0443\u0449\u0443.<\/p>\n<p>\u041e\u0442\u043b\u043e\u0436\u0438\u043c \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432 <strong>execute_looper()<\/strong> \u0435\u0449\u0451 \u043d\u0435\u043d\u0430\u0434\u043e\u043b\u0433\u043e, \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0432\u0441\u043f\u043b\u044b\u0442\u0438\u0435: \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0438\u0437 <strong>EXE_receive()<\/strong>.<\/p>\n<h2>Dsql@2<\/h2>\n<p>\u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043d\u0430\u0441 \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u043e\u043c \u0431\u043b\u043e\u043a\u0443 \u043a\u043e\u0434\u0430 \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u043a \u043c\u0435\u0442\u043e\u0434\u0443 <strong>DsqlDmlRequest::fetch()<\/strong>, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0438\u0437 <strong>executeReceiveWithRestarts()<\/strong>\/<strong>JRD_receive()<\/strong> . \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 end-of-file \u0442\u0430\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/dsql\/DsqlRequests.cpp#L832\" rel=\"noopener noreferrer nofollow\"><strong>mapInOut()<\/strong><\/a><\/p>\n<pre><code class=\"cpp\">\/\/ Map data from external world into message or from message to external world. void DsqlDmlRequest::mapInOut(thread_db* tdbb, bool toExternal, const dsql_msg* message, IMessageMetadata* meta, UCHAR* dsql_msg_buf, const UCHAR* in_dsql_msg_buf) { USHORT count = parseMetadata(meta, message-&gt;msg_parameters);  USHORT count2 = 0;  for (FB_SIZE_T i = 0; i &lt; message-&gt;msg_parameters.getCount(); ++i) { dsql_par* parameter = message-&gt;msg_parameters[i];  if (parameter-&gt;par_index) {  \/\/ Make sure the message given to us is long enough  dsc desc; if (!req_user_descs.get(parameter, desc)) desc.clear();  UCHAR* msgBuffer = req_msg_buffers[parameter-&gt;par_message-&gt;msg_buffer_number];  SSHORT* flag = NULL; dsql_par* const null_ind = parameter-&gt;par_null; if (null_ind != NULL) { dsc userNullDesc; if (!req_user_descs.get(null_ind, userNullDesc)) userNullDesc.clear();  const ULONG null_offset = (IPTR) userNullDesc.dsc_address;   dsc nullDesc = null_ind-&gt;par_desc; nullDesc.dsc_address = msgBuffer + (IPTR) nullDesc.dsc_address;  if (toExternal) { flag = reinterpret_cast&lt;SSHORT*&gt;(dsql_msg_buf + null_offset); *flag = *reinterpret_cast&lt;const SSHORT*&gt;(nullDesc.dsc_address); } else { flag = reinterpret_cast&lt;SSHORT*&gt;(nullDesc.dsc_address); *flag = *reinterpret_cast&lt;const SSHORT*&gt;(in_dsql_msg_buf + null_offset); } }  const bool notNull = (!flag || *flag &gt;= 0);  dsc parDesc = parameter-&gt;par_desc; parDesc.dsc_address = msgBuffer + (IPTR) parDesc.dsc_address;  if (toExternal) { desc.dsc_address = dsql_msg_buf + (IPTR) desc.dsc_address;  if (notNull) MOVD_move(tdbb, &amp;parDesc, &amp;desc); else memset(desc.dsc_address, 0, desc.dsc_length); } else if (notNull &amp;&amp; !parDesc.isNull()) { \/\/ Safe cast because desc is used as source only. desc.dsc_address = const_cast&lt;UCHAR*&gt;(in_dsql_msg_buf) + (IPTR) desc.dsc_address; MOVD_move(tdbb, &amp;desc, &amp;parDesc); } else memset(parDesc.dsc_address, 0, parDesc.dsc_length);  ++count2; } }  if (count != count2) { ERRD_post( Arg::Gds(isc_dsql_sqlda_err) &lt;&lt; Arg::Gds(isc_dsql_wrong_param_num) &lt;&lt; Arg::Num(count) &lt;&lt;Arg::Num(count2)); }  const auto dsqlStatement = getDsqlStatement(); const dsql_par* parameter;  const dsql_par* dbkey; if (!toExternal &amp;&amp; (dbkey = dsqlStatement-&gt;getParentDbKey()) &amp;&amp; (parameter = dsqlStatement-&gt;getDbKey())) { UCHAR* parentMsgBuffer = dsqlStatement-&gt;getParentRequest() ? dsqlStatement-&gt;getParentRequest()-&gt;req_msg_buffers[dbkey-&gt;par_message-&gt;msg_buffer_number] : NULL; UCHAR* msgBuffer = req_msg_buffers[parameter-&gt;par_message-&gt;msg_buffer_number];  dsc parentDesc = dbkey-&gt;par_desc; parentDesc.dsc_address = parentMsgBuffer + (IPTR) parentDesc.dsc_address;  dsc desc = parameter-&gt;par_desc; desc.dsc_address = msgBuffer + (IPTR) desc.dsc_address;  MOVD_move(tdbb, &amp;parentDesc, &amp;desc);  dsql_par* null_ind = parameter-&gt;par_null; if (null_ind != NULL) { desc = null_ind-&gt;par_desc; desc.dsc_address = msgBuffer + (IPTR) desc.dsc_address;  SSHORT* flag = (SSHORT*) desc.dsc_address; *flag = 0; } }  const dsql_par* rec_version; if (!toExternal &amp;&amp; (rec_version = dsqlStatement-&gt;getParentRecVersion()) &amp;&amp; (parameter = dsqlStatement-&gt;getRecVersion())) { UCHAR* parentMsgBuffer = dsqlStatement-&gt;getParentRequest() ? dsqlStatement-&gt;getParentRequest()-&gt;req_msg_buffers[rec_version-&gt;par_message-&gt;msg_buffer_number] : NULL; UCHAR* msgBuffer = req_msg_buffers[parameter-&gt;par_message-&gt;msg_buffer_number];  dsc parentDesc = rec_version-&gt;par_desc; parentDesc.dsc_address = parentMsgBuffer + (IPTR) parentDesc.dsc_address;  dsc desc = parameter-&gt;par_desc; desc.dsc_address = msgBuffer + (IPTR) desc.dsc_address;  MOVD_move(tdbb, &amp;parentDesc, &amp;desc);  dsql_par* null_ind = parameter-&gt;par_null; if (null_ind != NULL) { desc = null_ind-&gt;par_desc; desc.dsc_address = msgBuffer + (IPTR) desc.dsc_address;  SSHORT* flag = (SSHORT*) desc.dsc_address; *flag = 0; } } }<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0446\u0438\u043a\u043b \u043f\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c <em>message-&gt;msg_parameters<\/em>. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 <em>desc<\/em> , \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043c\u0430\u043f\u044b <em>req_user_descs<\/em>, \u0438 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 <em>parameter-&gt;par_desc<\/em> . \u0424\u0443\u043d\u043a\u0446\u0438\u044f <strong>MOVD_move()<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0432 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439. \u0414\u0432\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 if-\u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043e\u0441\u043e\u0431\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438, \u0438 \u043d\u0430\u043c \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b.<\/p>\n<h2>Exe@2<\/h2>\n<p>\u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/exe.cpp#L1004\" rel=\"noopener noreferrer nofollow\"><strong>execute_looper()<\/strong><\/a>.<\/p>\n<pre><code class=\"cpp\">static void execute_looper(thread_db* tdbb,    Request* request,    jrd_tra* transaction,    const StmtNode* node,    Request::req_s next_state) { DEV_BLKCHK(request, type_req);  SET_TDBB(tdbb); Jrd::Attachment* const attachment = tdbb-&gt;getAttachment();  \/\/ Ensure the cancellation lock can be triggered  Lock* const lock = attachment-&gt;att_cancel_lock; if (lock &amp;&amp; lock-&gt;lck_logical == LCK_none) LCK_lock(tdbb, lock, LCK_SR, LCK_WAIT);  \/\/ Start a save point  SavNumber savNumber = 0;  if (!(request-&gt;req_flags &amp; req_proc_fetch) &amp;&amp; request-&gt;req_transaction) { if (transaction &amp;&amp; !(transaction-&gt;tra_flags &amp; TRA_system)) { if (request-&gt;req_savepoints) { request-&gt;req_savepoints = request-&gt;req_savepoints-&gt;moveToStack(transaction-&gt;tra_save_point); } else transaction-&gt;startSavepoint();  savNumber = transaction-&gt;tra_save_point-&gt;getNumber(); } }  request-&gt;req_flags &amp;= ~req_stall; request-&gt;req_operation = next_state;  try { looper_seh(tdbb, request, node); }  catch (const Exception&amp;) { \/\/ In the case of error, undo changes performed under our savepoint if (savNumber) transaction-&gt;rollbackToSavepoint(tdbb, savNumber);  throw; }  \/\/ If any requested modify\/delete\/insert ops have completed, forget them  if (savNumber) {  while (transaction-&gt;tra_save_point &amp;&amp; transaction-&gt;tra_save_point-&gt;getNumber() &gt;= savNumber) { const auto savepoint = transaction-&gt;tra_save_point; \/\/ Forget about any undo for this verb transaction-&gt;releaseSavepoint(tdbb); \/\/ Preserve savepoint for reuse transaction-&gt;tra_save_free = savepoint-&gt;moveToStack(request-&gt;req_savepoints);  \/\/ Ensure that the priorly existing savepoints are preserved, \/\/ e.g. 10-11-12-(5-6-7) where savNumber == 5. This may happen \/\/ due to looper savepoints being reused in subsequent invokations. if (savepoint-&gt;getNumber() == savNumber) break; } } }<\/code><\/pre>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u043f\u044f\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 savepoint-\u0430\u043c\u0438. \u041e\u0442\u043b\u0430\u0434\u0447\u0438\u043a \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e <em>request-&gt;req_savepoints<\/em> \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439 (\u0435\u0449\u0451 \u0431\u044b, 3 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0437\u0430\u0434 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b\u0438), \u0438 <strong>moveToStack()<\/strong> \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d, \u043d\u043e \u044d\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u043a\u0430\u043a \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0441, \u0443 \u043d\u0430\u0441 SELECT.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0443\u043f\u0430\u044f, \u043a\u0430\u043a \u044f: \u0441\u043d\u044f\u0442\u044c \u0444\u043b\u0430\u0433 <em>req_stall<\/em>, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <em>next_state<\/em> \u0432 <em>request-&gt;req_operation<\/em>, \u0438 \u043f\u043e\u0442\u043e\u043c \u0432 try\/catch \u0431\u043b\u043e\u043a\u0435 \u0432\u044b\u0437\u0432\u0430\u0442\u044c <strong>looper_seh()<\/strong>, \u043f\u043e\u0439\u043c\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u0422\u0430\u043a, \u043c\u0438\u043d\u0443\u0442\u043e\u0447\u043a\u0443, \u0433\u0434\u0435-\u0442\u043e \u0447\u0443\u0442\u044c \u0432\u044b\u0448\u0435 \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u043b\u043e\u0432\u043b\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0437\u0434\u0435\u0441\u044c-\u0442\u043e \u043e\u043d\u0430 \u0437\u0430\u0447\u0435\u043c? \u0410 \u0434\u0435\u043b\u043e \u0432\u043e\u0442 \u0432 \u0447\u0451\u043c: \u0442\u0443\u0442 \u043c\u044b \u043b\u043e\u0432\u0438\u043c \u0432\u0441\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438 \u0431\u0440\u043e\u0441\u0430\u0435\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043b\u044c\u0448\u0435. \u0410 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043b\u043e\u0432\u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c\u0435\u043a\u0430\u044e\u0442, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c, \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u043b\u0438. \u042d\u0442\u043e \u0434\u0432\u0430 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f: \u0442\u0430\u043c \u0431\u044b\u043b\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043b\u043e\u0432\u043b\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441 \u0446\u0435\u043b\u044c\u044e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0430 \u0442\u0443\u0442 &#8212; \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u0430\u044f \u043b\u043e\u0432\u043b\u044f \u0441 \u0446\u0435\u043b\u044c\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u041d\u0443 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &#8212; \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u043d\u0438\u0435 savepoint-\u0430, \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e. \u042d\u0445, \u043a\u043e\u0433\u0434\u0430 \u0443\u0436\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u0432\u0441\u044f \u044d\u0442\u0430 \u043e\u0431\u0432\u044f\u0437\u043e\u0447\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a, \u0438 \u043c\u044b \u0434\u043e\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0434\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445?<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/exe.cpp#L1574\" rel=\"noopener noreferrer nofollow\"><strong>looper_seh()<\/strong><\/a> &#8212; \u044d\u0442\u043e \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0431\u0432\u044f\u0437\u043a\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 Structured Exception Handling \u0432 Windows.<\/p>\n<pre><code class=\"cpp\">\/\/ Start looper under Windows SEH (Structured Exception Handling) control static void looper_seh(thread_db* tdbb, Request* request, const StmtNode* node) { #ifdef WIN_NT START_CHECK_FOR_EXCEPTIONS(NULL); #endif \/\/ TODO: \/\/ 1. Try to fix the problem with MSVC C++ runtime library, making \/\/ even C++ exceptions that are implemented in terms of Win32 SEH \/\/ getting catched by the SEH handler below. \/\/ 2. Check if it really is correct that only Win32 catches CPU \/\/ exceptions (such as SEH) here. Shouldn't any platform capable \/\/ of handling signals use this stuff? \/\/ (see jrd\/ibsetjmp.h for implementation of these macros)  EXE_looper(tdbb, request, node);  #ifdef WIN_NT END_CHECK_FOR_EXCEPTIONS(NULL); #endif }<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u044f \u043d\u0435 \u0441\u043f\u0435\u0446, \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0441\u043c\u043e\u0433\u0443. \u041f\u0440\u043e\u0441\u0442\u043e \u0438\u0434\u0451\u043c \u0432 <strong>EXE_looper()<\/strong>.<\/p>\n<p>\u041c\u044b \u0443\u0436\u0435 \u0432 \u0434\u0432\u0443\u0445 \u0448\u0430\u0433\u0430\u0445 \u043e\u0442 RecordSource-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u0438 \u0432\u0430\u0436\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u0442\u0443\u0442. \u0424\u0443\u043d\u043a\u0446\u0438\u044e <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/exe.cpp#L1349\" rel=\"noopener noreferrer nofollow\"><strong>EXE_looper()<\/strong><\/a> \u044f \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0440\u0435\u0437\u0430\u043b \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u0442\u0440\u043e\u043a \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u043e. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u0440\u0435\u043b\u0438\u0437\u0435 5.0 \u0432 Firebird \u0431\u044b\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (<a href=\"https:\/\/habr.com\/ru\/articles\/785590\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u043d\u0430 \u0425\u0430\u0431\u0440\u0435), \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <strong>EXE_looper()<\/strong> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u043c\u0430\u043b\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u043d\u0435\u0442, \u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0442\u0438\u043a\u043e\u0432, \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. \u042f \u0434\u0430\u0436\u0435 \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0432 \u043a\u043e\u0434\u0435, \u0433\u0434\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u041d\u043e \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0448\u0430\u0435\u0442, \u043f\u043e\u043c\u043d\u0438\u043c: \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u043b\u0438\u0441\u044c \u043d\u0430 core-\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u0441\u043b\u0435 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0442\u0430\u043b\u0430 \u0432\u043e\u0442 \u0442\u0430\u043a\u0430\u044f:<\/p>\n<pre><code class=\"cpp\">const StmtNode* EXE_looper(thread_db* tdbb, Request* request, const StmtNode* node) { if (!request-&gt;req_transaction) ERR_post(Arg::Gds(isc_req_no_trans));  SET_TDBB(tdbb); const auto dbb = tdbb-&gt;getDatabase(); const auto attachment = tdbb-&gt;getAttachment();  if (!node) BUGCHECK(147);  \/\/ Save the old pool and request to restore on exit StmtNode::ExeState exeState(tdbb, request, request-&gt;req_transaction); Jrd::ContextPoolHolder context(tdbb, request-&gt;req_pool);  request-&gt;req_caller = exeState.oldRequest;  tdbb-&gt;tdbb_flags &amp;= ~(TDBB_stack_trace_done | TDBB_sys_error);  \/\/ Execute stuff until we drop while (node &amp;&amp; !(request-&gt;req_flags &amp; req_stall)) { try { if (request-&gt;req_operation == Request::req_evaluate) { JRD_reschedule(tdbb); if (node-&gt;hasLineColumn) { request-&gt;req_src_line = node-&gt;line; request-&gt;req_src_column = node-&gt;column; } }  node = node-&gt;execute(tdbb, request, &amp;exeState);  if (exeState.exit) { return node; } }\/\/ try catch (const Exception&amp; ex) { ex.stuffException(tdbb-&gt;tdbb_status_vector);  request-&gt;adjustCallerStats();  \/\/ Skip this handling for errors coming from the nested looper calls, \/\/ as they're already handled properly. The only need is to undo \/\/ our own savepoints. if (exeState.catchDisabled) { \/\/ Put cleanup off till the point where it has meaning to avoid \/\/ sequence 1-&gt;2-&gt;3-&gt;4 being undone as 4-&gt;3-&gt;2-&gt;1 instead of 4-&gt;1  ERR_punt(); }  \/\/ If the database is already bug-checked, then get out if (dbb-&gt;dbb_flags &amp; DBB_bugcheck) status_exception::raise(tdbb-&gt;tdbb_status_vector);  exeState.errorPending = true; exeState.catchDisabled = true; request-&gt;req_operation = Request::req_unwind; request-&gt;req_label = 0;  if (!(tdbb-&gt;tdbb_flags &amp; TDBB_stack_trace_done) &amp;&amp; !(tdbb-&gt;tdbb_flags &amp; TDBB_sys_error)) { stuff_stack_trace(request); tdbb-&gt;tdbb_flags |= TDBB_stack_trace_done; } } } \/\/ while()  request-&gt;adjustCallerStats();   \/\/ If there is no node, assume we have finished processing the \/\/ request unless we are in the middle of processing an \/\/ asynchronous message  if (!node) { \/\/ Close active cursors for (const Cursor* const* ptr = request-&gt;req_cursors.begin();  ptr &lt; request-&gt;req_cursors.end(); ++ptr) { if (*ptr) (*ptr)-&gt;close(tdbb); }  if (!exeState.errorPending) TRA_release_request_snapshot(tdbb, request);  request-&gt;req_flags &amp;= ~(req_active | req_reserved); request-&gt;invalidateTimeStamp(); release_blobs(tdbb, request); }  request-&gt;req_next = node;  request-&gt;req_caller = NULL;  \/\/ In the case of a pending error condition (one which did not \/\/ result in a exception to the top of looper), we need to \/\/ release the request snapshot  if (exeState.errorPending) { TRA_release_request_snapshot(tdbb, request); ERR_punt(); }  if (request-&gt;req_flags &amp; req_abort) ERR_post(Arg::Gds(isc_req_sync));  return node; }<\/code><\/pre>\n<p>\u0412\u0438\u0434\u0438\u043c\u043e, \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0430\u0437\u0432\u0430\u043b\u0438 <strong>EXE_looper()<\/strong>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0451 \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0446\u0438\u043a\u043b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <em>node-&gt;execute()<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 <em>node<\/em>. \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 node \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u043c\u0435\u0442\u043e\u0434 <em>node::execute()<\/em> \u043c\u043e\u0436\u0435\u0442 \u0430\u0436 \u0447\u0435\u0442\u044b\u0440\u044c\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<ol>\n<li>\n<p>\u0412\u0435\u0440\u043d\u0443\u0442\u044c null<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c <em>exeState.exit<\/em><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 <em>request-&gt;req_flags<\/em> \u0444\u043b\u0430\u0433 <em>req_stall<\/em><\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<\/ol>\n<p>\u0427\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u043d\u043a\u0442 1 \u043e\u0442 \u043f\u0443\u043d\u043a\u0442\u043e\u0432 2 \u0438 3? \u0422\u0435\u043c, \u0447\u0442\u043e \u043f\u0443\u043d\u043a\u0442\u044b 2 \u0438 3 \u0432\u0435\u0440\u043d\u0443\u0442 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 <em>node<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0451\u043d \u0438\u0437 <strong>EXE_looper()<\/strong>, \u0442\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0434\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0434\u043e \u043a\u043e\u043d\u0446\u0430, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0443\u0436\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c. \u0417\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0447\u0438\u0449\u0430\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0438\u0437 \u0432\u0430\u0436\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u0442\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e <em>node<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0451\u043d \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e <strong>execute()<\/strong>, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 <em>request-&gt;req_next<\/em>.<\/p>\n<p>\u041f\u043e\u0434\u0432\u0435\u0434\u0451\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u0442\u043e\u0433. \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b Exe \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u0446\u0438\u043a\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u043a\u0438\u0435 <strong>StmtNode<\/strong>, \u0438 \u043e\u043d\u0438 \u0441\u0430\u043c\u0438 \u0440\u0435\u0448\u0430\u044e\u0442, \u043a\u0442\u043e \u0438\u0437 \u043d\u0438\u0445 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c. \u041e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 <strong>StmtNode<\/strong>? \u0415\u0441\u043b\u0438 \u0437\u0430\u0448\u043b\u0438 \u0438\u0437 <strong>EXE_receive()<\/strong>, \u0442\u043e \u0438\u0437 <em>request-&gt;req_next<\/em>. \u0412\u043e\u043e\u0431\u0449\u0435 <strong>Request<\/strong> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u043e\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0437\u0436\u0435, \u043d\u043e \u043a\u0442\u043e \u044f \u0442\u0430\u043a\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 Firebird \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c?<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 Firebird \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u0430\u0436\u043d\u043e \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0434\u0432\u0435 \u0432\u0435\u0449\u0438: \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0439 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0446\u0438\u043a\u043b\u044b. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0446\u0438\u043a\u043b \u043f\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 <strong>DsqlDmlRequest::mapInOut()<\/strong>, \u0438 \u0442\u0430\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443. \u0412\u0442\u043e\u0440\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>EXE_receive()<\/strong>, \u043d\u043e \u0442\u0430\u043c \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u0451 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<p>\u0421\u0430\u043c\u043e\u0439 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <strong>EXE_looper()<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043c\u043a\u0430\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 <strong>StmtNode<\/strong>. \u041f\u0440\u0438\u0447\u0451\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <strong>EXE_receive()<\/strong> \u0441\u0442\u0440\u043e\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u0442, \u0447\u0442\u043e <em>request-&gt;req_message<\/em> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c <strong>StallNode<\/strong> (\u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441-\u043f\u043e\u0442\u043e\u043c\u043e\u043a <strong>StmtNode<\/strong>), \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0442\u043e\u0433\u043e <strong>StmtNode<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f <em>request-&gt;req_next<\/em>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0442\u043e\u0442 <strong>StmtNode<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0438\u0437 <strong>EXE_looper()<\/strong>, \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f! \u0424\u0443\u043d\u043a\u0446\u0438\u044f <strong>EXE_receive()<\/strong> \u0431\u0435\u0440\u0451\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u0437 <em>request-&gt;req_message<\/em>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f <strong>MessageNode<\/strong> (\u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043a\u043b\u0430\u0441\u0441-\u043f\u043e\u0442\u043e\u043c\u043e\u043a <strong>StmtNode<\/strong>). \u041a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u043d \u0442\u0443\u0434\u0430 \u043f\u043e\u043f\u0430\u0434\u0451\u0442, \u043c\u044b \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u043d\u0430\u0435\u043c, \u043d\u043e \u043c\u043e\u0436\u0435\u043c \u0441\u043c\u0435\u043b\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <strong>execute()<\/strong> \u0443 \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u0432 <strong>StmtNode<\/strong>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 <strong>MessageNode::execute()<\/strong>, \u043e\u043d \u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u044d\u0442\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\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\u0435\u0442\u043e\u0434 <strong>EXE_receive()<\/strong> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <strong>execute_looper()<\/strong> \u0434\u0432\u0430 \u0440\u0430\u0437\u0430. \u0421 \u043a\u0430\u043a\u043e\u0433\u043e StmtNode \u043d\u0430\u0447\u043d\u0451\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437?<\/p>\n<\/li>\n<\/ol>\n<h2>\u0427\u0442\u043e \u043d\u0435 \u0432\u043e\u0448\u043b\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u044e<\/h2>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u043c\u0435\u0442\u043e\u0434 <strong>JResultSet::fetch()<\/strong> \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u043e\u0434\u043d\u043e\u0439, \u043d\u043e \u043d\u0435\u0443\u0436\u0435\u043b\u0438 \u043e\u043d\u0438 \u0438 \u043f\u043e \u0441\u0435\u0442\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u0439? \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043d\u0435\u0442. \u0421\u0435\u0442\u0435\u0432\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 <em>op_fetch<\/em> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043d \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442. \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0441\u0442\u0435\u043a\u0442\u0440\u0435\u0439\u0441\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u043a\u0430\u043a firebird.exe!rem_port::fetch() , \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e (<em>sqldata-&gt;p_sqldata_messages<\/em>), \u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <em>cursor-&gt;fetchNext()<\/em>.<\/p>\n<p>\u041f\u043e\u0445\u043e\u0436\u0435, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0431\u044b\u043b \u0441\u0434\u0435\u043b\u0430\u043d <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/commit\/11d5d592430d855a150d7297e9e5a634ddae8517\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u043c\u043c\u0438\u0442<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043b\u0435\u0433\u043a\u0430 \u043e\u0442\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043b \u0442\u043e\u0442 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0437\u0443\u0447\u0430\u043b\u0438. \u0411\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0432\u043e\u0434 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c \u0438 \u0437\u0430\u0447\u0435\u043c.<\/p>\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\/927374\/\"> https:\/\/habr.com\/ru\/articles\/927374\/<\/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 <a href=\"https:\/\/habr.com\/ru\/articles\/918552\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/a> \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c, \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \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. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0441 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<h2>RecordSource<\/h2>\n<p>\u041f\u043e\u0438\u0449\u0435\u043c, \u043a\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <strong>VIO_get()<\/strong>, \u0438 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0434\u0432\u0430 \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430: <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/recsrc\/BitmapTableScan.cpp#L113\" rel=\"noopener noreferrer nofollow\"><strong>BitmapTableScan::internalGetRecord()<\/strong><\/a> \u0438 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/recsrc\/IndexTableScan.cpp#L320\" rel=\"noopener noreferrer nofollow\"><strong>IndexTableScan::internalGetRecord()<\/strong><\/a>, \u043e\u0431\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \/src\/jrd\/recsrc\/ . \u042f \u043d\u0430\u0437\u043e\u0432\u0443 \u044d\u0442\u0443 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0443 &#171;Record Source&#187;, \u043d\u043e \u0435\u0449\u0451 \u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 &#171;\u041c\u0435\u0442\u043e\u0434\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430\/Access methods&#187; \u0432\u043e\u0442 \u0432 <a href=\"https:\/\/www.ibase.ru\/files\/articles\/firebird5\/data_access_methods\/firebird-dataaccess-path-ru.html\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u0439 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>. \u0420\u0430\u0441\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043c\u044b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0441 \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439: \u043a\u043b\u0430\u0441\u0441\u044b <strong>BitmapTableScan<\/strong> \u0438 <strong>IndexTableScan<\/strong> \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043c\u043a\u0430\u043c\u0438 <strong>RecordStream<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u043c <strong>RecordSource<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u043c <strong>AccessPath<\/strong>. \u0422\u043e \u0435\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0442\u0443\u0442 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 framework. \u0412 VSCode \u044f \u043d\u0435 \u0437\u043d\u0430\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u0430, \u043a\u0430\u043a \u0438\u0441\u043a\u0430\u0442\u044c, \u043a\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b, \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e &#171;Find references&#187;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0449\u0435\u0442 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u0432 \u043a\u043b\u0430\u0441\u0441\u0430\u0445-\u043f\u043e\u0442\u043e\u043c\u043a\u0430\u0445. \u0427\u0435\u0440\u0435\u0437 \u0430\u043d\u0430\u043b\u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0432\u044b\u0440\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<h2>Debugger<\/h2>\n<p>\u0427\u0442\u043e \u0436\u0435, \u043e\u043f\u044f\u0442\u044c \u043c\u0435\u043d\u044f\u0435\u043c \u043f\u043e\u0434\u0445\u043e\u0434 \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043d\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043f\u0440\u0438\u0451\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0438: \u043e\u0442\u043b\u0430\u0434\u043a\u0430! \u042f \u0431\u0443\u0434\u0443 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437 VSCode c \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 C\/C++. \u041a\u0442\u043e-\u0442\u043e \u0438\u0437 \u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u0442\u043e\u0436\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f VSCode, \u0438 \u0434\u0430\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043a\u0430\u0442\u0430\u043b\u043e\u0433 &#171;.vscode&#187; \u0432 git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u043d\u0435 \u043d\u0430\u0434\u043e \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c. \u0412\u044b\u0431\u0438\u0440\u0430\u044e \u0432 \u043c\u0435\u043d\u044e &#171;Run&#187;\/&#187;Open configurations&#187;, \u0441\u0442\u0438\u0440\u0430\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0430\u0432\u0442\u043e\u0440\u043e\u0432, \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e \u0441\u0432\u043e\u044e, \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e:<\/p>\n<pre><code class=\"json\">\"configurations\": [ { \"name\": \"(Windows) Attach\", \"type\": \"cppvsdbg\", \"request\": \"attach\", \"program\": \"C:\\\\tools\\\\firebird\\\\firebird.exe\", \"symbolSearchPath\": \"C:\\\\tools\\\\firebird\\\\;C:\\\\tools\\\\firebird\\\\plugins\\\\\", \"requireExactSource\": true }, ] <\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u044b, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0438\u0441\u044c, \u044f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0430\u043f \u0441\u0431\u043e\u0440\u043a\u0438 Firebird \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0438\u0437 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430 \u0441\u043e\u0431\u0440\u0430\u043d \u0438\u0437 \u0442\u0435\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0441\u043a\u0430\u0447\u0430\u043b \u043f\u043e git-\u0442\u0435\u0433\u0443. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043c\u043d\u0435 \u043f\u0440\u0438\u0446\u0435\u043f\u043b\u044f\u0442\u044c\u0441\u044f \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u043e\u043c \u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c\u0443 \u0438\u0437 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430. \u0425\u043e\u0440\u043e\u0448\u0430\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c: \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, VSCode \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043b\u044f \u043f\u0440\u0438\u0446\u0435\u043f\u043b\u044f\u043d\u0438\u044f, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c firebird.exe . \u0415\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e: \u0441\u0442\u0430\u0432\u043b\u044e \u044f \u0442\u043e\u0447\u043a\u0443 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 <strong>VIO_data()<\/strong>, \u0438 \u044d\u0442\u0430 \u0442\u043e\u0447\u043a\u0430 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442, \u043d\u043e VSCode \u0433\u043e\u0432\u043e\u0440\u0438\u0442: \u043d\u0435 \u043c\u043e\u0433\u0443 \u043d\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043b &#171;c:\\firebird-build\\src\\jrd\\vio.cpp&#187;. \u041d\u0443 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043e\u043d \u043d\u0435 \u043c\u043e\u0436\u0435\u0442, \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u0443\u0442\u0438 \u043b\u0435\u0436\u0430\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043d\u0430 \u0442\u043e\u0439 build-\u043c\u0430\u0448\u0438\u043d\u0435, \u0433\u0434\u0435 Firebird \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438 \u0432 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432, \u0438 \u044d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u0432 pdb-\u0444\u0430\u0439\u043b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0441\u044f, \u0430 \u0443 \u043c\u0435\u043d\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043b\u0435\u0436\u0430\u0442. \u042f \u043d\u0435 \u0437\u043d\u0430\u044e, \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0442\u0443\u0434\u0430 \u0436\u0435, \u0433\u0434\u0435 \u043e\u043d\u0438 \u043b\u0435\u0436\u0430\u043b\u0438 \u043d\u0430 build-\u043c\u0430\u0448\u0438\u043d\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451.<\/p>\n<p>\u0421\u0442\u0430\u0432\u0438\u043c \u0442\u043e\u0447\u043a\u0443 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0430 \u0432 <strong>VIO_data()<\/strong>, \u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0443\u043f\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 &#171;SELECT * FROM ORDERS&#187;, \u0442\u043e\u0447\u043a\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0430 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 stacktrace:<\/p>\n<pre><code>engine13.dll!VIO_data() engine13.dll!VIO_next_record() engine13.dll!Jrd::FullTableScan::internalGetRecord() engine13.dll!Jrd::RecordSource::getRecord() engine13.dll!Jrd::Cursor::fetchNext() engine13.dll!Jrd::ForNode::execute() engine13.dll!EXE_looper() engine13.dll!looper_seh() engine13.dll!execute_looper() engine13.dll!EXE_receive() engine13.dll!JRD_receive() engine13.dll!Jrd::DsqlDmlRequest::executeReceiveWithRestarts() engine13.dll!Jrd::DsqlDmlRequest::fetch() engine13.dll!Jrd::DsqlCursor::fetchNext() engine13.dll!Jrd::JResultSet::fetchNext() engine13.dll!Firebird::IResultSetBaseImpl::cloopfetchNextDispatcher() [Inline Frame] fbclient.dll!Firebird::IResultSet::fetchNext() fbclient.dll!Why::YResultSet::fetchNext() fbclient.dll!Firebird::IResultSetBaseImpl::cloopfetchNextDispatcher() [Inline Frame] firebird.exe!Firebird::IResultSet::fetchNext() firebird.exe!rem_port::fetch() firebird.exe!process_packet() firebird.exe!loopThread() [Inline Frame] firebird.exe!`anonymous-namespace'::ThreadArgs::run() firebird.exe!threadStart() ucrtbase.dll!00007ffc494a1bb2() kernel32.dll!00007ffc4b4a7374() ntdll.dll!00007ffc4b93cc91()<\/code><\/pre>\n<p>\u0427\u0442\u043e \u0436\u0435 \u0442\u0443\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e? \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0444\u0443\u043d\u043a\u0446\u0438\u044f <strong>VIO_data()<\/strong> \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043d\u0435 \u0438\u0437 <strong>VIO_get()<\/strong>, \u0430 \u0438\u0437 <strong>VIO_next_record()<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0435\u0449\u0451 \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438. \u0410 \u0432\u043e\u0442 \u043e\u043d\u0430 \u0443\u0436\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 <strong>FullTableScan::internalGetRecord()<\/strong>, \u044d\u0442\u043e \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0442\u0440\u043e\u043a\u0430\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0441\u043c\u044b\u0441\u043b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0442\u0443\u043f\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0430\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0434\u0440\u044f\u0434. \u041e\u043d \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u043a \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 WHERE, \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430\u0448 \u0441\u043b\u0443\u0447\u0430\u0439. \u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0441\u0442\u0435\u043a\u0442\u0440\u0435\u0439\u0441\u0443 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 RecordSource. \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0438 \u043e \u0447\u0451\u043c \u043d\u0435 \u0441\u043a\u0430\u0436\u0443\u0442, \u0438 \u0432\u0438\u0434\u0438\u043c <strong>Jrd::JResultSet::fetchNext()<\/strong>, \u044d\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 API-\u0432\u044b\u0437\u043e\u0432. \u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0443\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/remote\/server\/server.cpp#L5007\" rel=\"noopener noreferrer nofollow\"><strong>process_packet()<\/strong><\/a> \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 &#171;server.cpp&#187;. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440 \u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442 \u0441 \u0434\u0432\u0443\u043c\u044f \u0432\u0435\u0449\u0430\u043c\u0438: \u0441\u0435\u0442\u044c \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0434\u0438\u0441\u043a \u0441 \u0434\u0440\u0443\u0433\u043e\u0439. \u0422\u0430\u043a \u0432\u043e\u0442, <strong>process_packet()<\/strong> &#8212; \u044d\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u0422\u0430\u043c \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u0439 switch \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e, \u0447\u0442\u043e \u044f \u043d\u0435 \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0441\u043a\u043e\u043f\u043a\u0438 \u043e\u0442\u0442\u0443\u0434\u0430. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 Firebird, \u0442\u043e \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0447\u0430\u0442\u044c. \u041e\u0442 \u0441\u0435\u0431\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044e \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u0441 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u043c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u0432\u0441\u0451 \u043f\u043b\u043e\u0445\u043e: \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0435\u0442 \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<p>\u0420\u0430\u043d\u0435\u0435, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434, \u043c\u044b \u0448\u043b\u0438 \u043e\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043a \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u043c, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c &#171;\u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445&#187;. \u0412 \u043e\u0442\u043b\u0430\u0434\u043a\u0435 \u0442\u0430\u043a \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e: \u0442\u043e\u0447\u043a\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0430 \u043f\u043e\u043c\u043e\u0433\u043b\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u044f\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u0434\u0435\u043b\u0430\u044e \u0442\u0430\u043a: \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u0431\u0435\u0440\u0443\u0441\u044c \u043f\u043e\u0432\u044b\u0448\u0435, \u0432 <strong>JResultSet::fetchNext()<\/strong>, \u0438 \u0431\u0443\u0434\u0443 \u0441\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u0442\u0443\u0434\u0430. \u0410 stacktrace \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c. \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043f\u0440\u043e\u0439\u0434\u0451\u043c \u043f\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0445 \u0432 stacktrace.<\/p>\n<p>\u0421\u0430\u043c <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/EngineInterface.h#L154\" rel=\"noopener noreferrer nofollow\"><strong>JResultSet<\/strong><\/a> \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0439: \u043e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <strong>JStatement<\/strong>, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u0440\u043e\u0434\u0438\u043b\u043e \u044d\u0442\u043e\u0442 <strong>JResultSet<\/strong>, \u0438 <strong>DslCursor<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443. \u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/jrd\/jrd.cpp#L5436\" rel=\"noopener noreferrer nofollow\"><strong>JResultSet::fetchNext()<\/strong><\/a> \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u0432\u044b\u0437\u044b\u0432\u0430\u044f <strong>DslCursor::fetchNext()<\/strong>, \u0447\u0442\u043e \u043c\u044b \u0438 \u0432\u0438\u0434\u0435\u043b\u0438 \u0432 stacktrace.<\/p>\n<h2>Dsql@1<\/h2>\n<p>\u041a\u043b\u0430\u0441\u0441 <strong>DslCursor<\/strong> \u0442\u043e\u0436\u0435 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439. \u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0437\u0430\u043f\u0438\u0441\u044f\u043c, \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u044d\u0442\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f (\u044f \u043e\u0431\u0435\u0449\u0430\u043b \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f core-\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438). \u041c\u0435\u0442\u043e\u0434 <strong>DslCursor::fetchNext()<\/strong> \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u0435\u0442\u043e\u0434\u0443 <strong>DsqlDmlRequest::fetch()<\/strong>.<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/dsql\/DsqlRequests.cpp\" rel=\"noopener noreferrer nofollow\"><strong>DsqlDmlRequest::fetch()<\/strong><\/a> \u0443\u0436\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435.<\/p>\n<pre><code class=\"cpp\">\/\/ Fetch next record from a dynamic SQL cursor. bool DsqlDmlRequest::fetch(thread_db* tdbb, UCHAR* msgBuffer) { SET_TDBB(tdbb);  Jrd::ContextPoolHolder context(tdbb, &amp;getPool());  \/\/ if the cursor isn't open, we've got a problem if (dsqlStatement-&gt;isCursorBased()) { if (!req_cursor) { ERRD_post(Arg::Gds(isc_sqlerr) &lt;&lt; Arg::Num(-504) &lt;&lt;   Arg::Gds(isc_dsql_cursor_err) &lt;&lt;   Arg::Gds(isc_dsql_cursor_not_open)); } }  if (!request) { ERRD_post(Arg::Gds(isc_sqlerr) &lt;&lt; Arg::Num(-504) &lt;&lt;   Arg::Gds(isc_unprepared_stmt)); }  dsql_msg* message = (dsql_msg*) dsqlStatement-&gt;getReceiveMsg();  if (delayedFormat &amp;&amp; message) { parseMetadata(delayedFormat, message-&gt;msg_parameters); delayedFormat = NULL; }  \/\/ Set up things for tracing this call Jrd::Attachment* att = req_dbb-&gt;dbb_attachment; TraceDSQLFetch trace(att, this);  thread_db::TimerGuard timerGuard(tdbb, req_timer, false); if (req_timer &amp;&amp; req_timer-&gt;expired()) tdbb-&gt;checkCancelState();  UCHAR* dsqlMsgBuffer = req_msg_buffers[message-&gt;msg_buffer_number]; if (!firstRowFetched &amp;&amp; needRestarts()) { \/\/ Note: tra_handle can't be changed by executeReceiveWithRestarts below \/\/ and outMetadata and outMsg in not used there, so passing NULL's is safe. jrd_tra* tra = req_transaction;  executeReceiveWithRestarts(tdbb, &amp;tra, NULL, NULL, false, false, true); } else JRD_receive(tdbb, request, message-&gt;msg_number, message-&gt;msg_length, dsqlMsgBuffer);  firstRowFetched = true;  const dsql_par* const eof = dsqlStatement-&gt;getEof(); const USHORT* eofPtr = eof ? (USHORT*) (dsqlMsgBuffer + (IPTR) eof-&gt;par_desc.dsc_address) : NULL; const bool eofReached = eof &amp;&amp; !(*eofPtr);  if (eofReached) { if (req_timer) req_timer-&gt;stop();  trace.fetch(true, ITracePlugin::RESULT_SUCCESS); return false; }  if (msgBuffer) { Request* old = tdbb-&gt;getRequest(); Cleanup restoreRequest([tdbb, old] {tdbb-&gt;setRequest(old);}); tdbb-&gt;setRequest(request); mapInOut(tdbb, true, message, NULL, msgBuffer); }  trace.fetch(false, ITracePlugin::RESULT_SUCCESS); return true; }<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0442\u044c \u0438 \u0441\u043d\u043e\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u043c\u0435\u0442\u043e\u0434\u0443. \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0441\u044f\u043a\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u0434\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0434\u043e \u043c\u0435\u0441\u0442\u0430 &#171;dsqlStatement-&gt;getReceiveMsg()&#187;, \u0438 \u0447\u0435\u0448\u0435\u043c \u0437\u0430\u0442\u044b\u043b\u043e\u043a \u0432 \u043d\u0435\u0434\u043e\u0443\u043c\u0435\u043d\u0438\u0438: \u043a\u0430\u043a\u043e\u0439 \u0435\u0449\u0451 receiveMsg ? \u041a\u0430\u043a \u0445\u043e\u0440\u043e\u0448\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c. \u0411\u0443\u0434\u0435\u0442 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u043d\u0430 11 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438. \u041e\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434 <strong>parseMetadata()<\/strong> \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u043e\u043b\u0435\u043c <em>delayedFormat<\/em>. \u041f\u043e\u043b\u0435<em> delayedFormat<\/em> &#8212; \u044d\u0442\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e API, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u043d \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c. \u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u0442\u043e\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 API, \u043c\u0435\u0442\u043e\u0434\u043e\u043c <strong>JResultSet::setDelayedFormat()<\/strong>. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 <a href=\"https:\/\/github.com\/FirebirdSQL\/firebird\/blob\/v5.0.2\/src\/dsql\/DsqlRequests.cpp#L230\" rel=\"noopener noreferrer nofollow\"><strong>DsqlRequest::parseMetadata()<\/strong><\/a>.<\/p>\n<pre><code class=\"cpp\">\/\/ Parse the message of a request. USHORT DsqlRequest::parseMetadata(IMessageMetadata* meta, const Array&lt;dsql_par*&gt;&amp; parameters_list) { HalfStaticArray&lt;const dsql_par*, 16&gt; parameters;  for (FB_SIZE_T i = 0; i &lt; parameters_list.getCount(); ++i) { dsql_par* param = parameters_list[i];  if (param-&gt;par_index) { if (param-&gt;par_index &gt; parameters.getCount()) parameters.grow(param-&gt;par_index); parameters[param-&gt;par_index - 1] = param; } }  \/\/ If there's no metadata, then the format of the current message buffer \/\/ is identical to the format of the previous one. if (!meta) return parameters.getCount();  FbLocalStatus st; unsigned count = meta-&gt;getCount(&amp;st);  unsigned count2 = parameters.getCount();  if (count != count2) { ERRD_post(Arg::Gds(isc_dsql_sqlda_err) &lt;&lt;   Arg::Gds(isc_dsql_wrong_param_num) &lt;&lt;Arg::Num(count2) &lt;&lt; Arg::Num(count)); }  unsigned offset = 0;  for (USHORT index = 0; index &lt; count; index++) { unsigned sqlType = meta-&gt;getType(&amp;st, index); unsigned sqlLength = meta-&gt;getLength(&amp;st, index);  dsc desc;<\/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-467894","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467894","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=467894"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467894\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=467894"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=467894"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=467894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}