This commit is contained in:
Michael Kolupaev 2014-04-07 23:25:05 +04:00
commit c96e421982
3 changed files with 11 additions and 12 deletions

View File

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

View File

@ -20,7 +20,7 @@ public:
*
* ostr - куда писать результат выполнения запроса, если он есть.
*
* remaining_data_istr, если не NULL, может содержать нераспарсенный остаток запроса с данными.
* remaining_data_istr, если не nullptr, может содержать нераспарсенный остаток запроса с данными.
* (заранее может быть считан в оперативку для парсинга лишь небольшой кусок запроса, который содержит не все данные)
*
* В query_plan,

View File

@ -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<char *>(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();