dbms: fixed segfault when query was cancelled while merging aggregate states in calculation of TOTALS [#METR-14654].

This commit is contained in:
Alexey Milovidov 2015-02-04 08:05:17 +03:00
parent 8d6862fe9a
commit 66156f5085
2 changed files with 11 additions and 4 deletions

View File

@ -39,6 +39,9 @@ public:
* Реализация по-умолчанию берёт их из себя или из первого дочернего источника, в котором они есть.
* Переопределённый метод может провести некоторые вычисления. Например, применить выражение к totals дочернего источника.
* Тотальных значений может не быть - тогда возвращается пустой блок.
*
* Вызывайте этот метод только после получения всех данных с помощью read,
* иначе будут проблемы, если какие-то данные в это же время вычисляются в другом потоке.
*/
virtual const Block & getTotals();

View File

@ -301,10 +301,14 @@ void TCPHandler::processOrdinaryQuery()
}
}
/// Если закончились данные, то отправим данные профайлинга и тотальные значения до
/// последнего нулевого блока, чтобы иметь возможность использовать
/// эту информацию в выводе суффикса output stream'а
if (!block)
/** Если закончились данные, то отправим данные профайлинга и тотальные значения до
* последнего нулевого блока, чтобы иметь возможность использовать
* эту информацию в выводе суффикса output stream'а.
* Если запрос был прерван, то вызывать методы sendTotals и другие нельзя,
* потому что мы прочитали ещё не все данные, и в это время могут производиться какие-то
* вычисления в других потоках.
*/
if (!block && !isQueryCancelled())
{
sendTotals();
sendExtremes();