diff --git a/dbms/include/DB/Interpreters/InterpreterInsertQuery.h b/dbms/include/DB/Interpreters/InterpreterInsertQuery.h index c9a66a8da97..daa0d7ad87d 100644 --- a/dbms/include/DB/Interpreters/InterpreterInsertQuery.h +++ b/dbms/include/DB/Interpreters/InterpreterInsertQuery.h @@ -17,13 +17,15 @@ public: InterpreterInsertQuery(ASTPtr query_ptr_, Context & context_); /** Выполнить запрос. - * remaining_data_istr, если не NULL, может содержать нераспарсенные данные для вставки. + * remaining_data_istr, если не nullptr, может содержать нераспарсенные данные для вставки. * (заранее может быть считан в оперативку для парсинга лишь небольшой кусок запроса, который содержит не все данные) */ void execute(ReadBuffer * remaining_data_istr); - /** Подготовить запрос к выполнению. Вернуть поток блоков, в который можно писать данные для выполнения запроса. - * Или вернуть NULL, если запрос INSERT SELECT (самодостаточный запрос - не принимает входные данные). + /** Подготовить запрос к выполнению. Вернуть потоки блоков + * - поток, в который можно писать данные для выполнения запроса, если INSERT; + * - поток, из которого можно читать результат выполнения запроса, если SELECT и подобные; + * Или ничего, если запрос INSERT SELECT (самодостаточный запрос - не принимает входные данные, не отдаёт результат). */ BlockIO execute(); diff --git a/dbms/include/DB/Interpreters/InterpreterQuery.h b/dbms/include/DB/Interpreters/InterpreterQuery.h index 032fed8265e..0f928bebb73 100644 --- a/dbms/include/DB/Interpreters/InterpreterQuery.h +++ b/dbms/include/DB/Interpreters/InterpreterQuery.h @@ -20,7 +20,7 @@ public: * * ostr - куда писать результат выполнения запроса, если он есть. * - * remaining_data_istr, если не NULL, может содержать нераспарсенный остаток запроса с данными. + * remaining_data_istr, если не nullptr, может содержать нераспарсенный остаток запроса с данными. * (заранее может быть считан в оперативку для парсинга лишь небольшой кусок запроса, который содержит не все данные) * * В query_plan, diff --git a/dbms/src/Interpreters/InterpreterInsertQuery.cpp b/dbms/src/Interpreters/InterpreterInsertQuery.cpp index f8242d30717..419338c1e29 100644 --- a/dbms/src/Interpreters/InterpreterInsertQuery.cpp +++ b/dbms/src/Interpreters/InterpreterInsertQuery.cpp @@ -84,19 +84,16 @@ void InterpreterInsertQuery::execute(ReadBuffer * remaining_data_istr) /// Данные могут содержаться в распарсенной (query.data) и ещё не распарсенной (remaining_data_istr) части запроса. - /// Если данных нет. - bool has_remaining_data = remaining_data_istr && !remaining_data_istr->eof(); - - if (!query.data && !has_remaining_data) - throw Exception("No data to insert", ErrorCodes::NO_DATA_TO_INSERT); - ConcatReadBuffer::ReadBuffers buffers; ReadBuffer buf1(const_cast(query.data), query.data ? query.end - query.data : 0, 0); if (query.data) buffers.push_back(&buf1); - if (has_remaining_data) - buffers.push_back(remaining_data_istr); + buffers.push_back(remaining_data_istr); + + /** NOTE Нельзя читать из remaining_data_istr до того, как прочтём всё между query.data и query.end. + * - потому что query.data может ссылаться на кусок памяти, использующийся в качестве буфера в remaining_data_istr. + */ ConcatReadBuffer istr(buffers); Block sample = table->getSampleBlock();