mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 15:42:02 +00:00
Add docs. Add TEST version of KILL QUERY. [#CLICKHOUSE-2120]
This commit is contained in:
parent
649fd1922b
commit
891437e531
@ -216,7 +216,7 @@ private:
|
||||
/// Limit and counter for memory of all simultaneously running queries.
|
||||
MemoryTracker total_memory_tracker;
|
||||
|
||||
/// Call under lock
|
||||
/// Call under lock. Finds process with specified current_user and current_query_id.
|
||||
ProcessListElement * tryGetProcessListElement(const String & current_query_id, const String & current_user);
|
||||
|
||||
public:
|
||||
@ -265,7 +265,8 @@ public:
|
||||
NotFound = 0, /// already cancelled
|
||||
QueryIsNotInitializedYet = 1,
|
||||
CancelCannotBeSended = 2,
|
||||
CancelSended = 3
|
||||
CancelSended = 3,
|
||||
Unknown
|
||||
};
|
||||
|
||||
/// Try call cancel() for input and output streams of query with specified id and user
|
||||
|
@ -8,7 +8,8 @@ class ASTKillQueryQuery : public ASTQueryWithOutput
|
||||
{
|
||||
public:
|
||||
ASTPtr where_expression;
|
||||
bool sync;
|
||||
bool sync = false;
|
||||
bool test = false;
|
||||
|
||||
ASTKillQueryQuery() = default;
|
||||
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include <DB/Parsers/IParserBase.h>
|
||||
#include <DB/Parsers/ExpressionElementParsers.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
|
@ -1 +0,0 @@
|
||||
|
@ -6,7 +6,7 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
/** KILL QUERY WHERE <logical expression upon system.processes fields> [SYNC|ASYNC]
|
||||
/** KILL QUERY WHERE <logical expression upon system.processes fields> [SYNC|ASYNC|TEST]
|
||||
*/
|
||||
class ParserKillQueryQuery : public IParserBase
|
||||
{
|
||||
|
@ -115,12 +115,12 @@ public:
|
||||
|
||||
String getName() const override
|
||||
{
|
||||
return "SyncronizedQueryKiller";
|
||||
return "SynchronousQueryKiller";
|
||||
}
|
||||
|
||||
String getID() const override
|
||||
{
|
||||
return "SyncronizedQueryKiller_" + toString(this);
|
||||
return "SynchronousQueryKiller_" + toString(this);
|
||||
}
|
||||
|
||||
Block readImpl() override
|
||||
@ -188,13 +188,13 @@ BlockIO InterpreterKillQueryQuery::execute()
|
||||
res_io.in_sample = processes_block.cloneEmpty();
|
||||
res_io.in_sample.insert(0, {std::make_shared<ColumnString>(), std::make_shared<DataTypeString>(), "kill_status"});
|
||||
|
||||
if (!query.sync)
|
||||
if (!query.sync || query.test)
|
||||
{
|
||||
Block res = res_io.in_sample.cloneEmpty();
|
||||
|
||||
for (const auto & query_desc : queries_to_stop)
|
||||
{
|
||||
auto code = process_list.sendCancelToQuery(query_desc.query_id, query_desc.user);
|
||||
auto code = (query.test) ? CancellationCode::Unknown : process_list.sendCancelToQuery(query_desc.query_id, query_desc.user);
|
||||
insertResultRow(query_desc.source_num, code, processes_block, res);
|
||||
}
|
||||
|
||||
@ -214,8 +214,6 @@ Block InterpreterKillQueryQuery::getSelectFromSystemProcessesResult()
|
||||
String system_processes_query = "SELECT query_id, user, query FROM system.processes WHERE "
|
||||
+ queryToString(static_cast<ASTKillQueryQuery &>(*query_ptr).where_expression);
|
||||
|
||||
// std::cerr << "executing: " << system_processes_query << "\n";
|
||||
|
||||
BlockIO system_processes_io = executeQuery(system_processes_query, context, true);
|
||||
Block res = system_processes_io.in->read();
|
||||
|
||||
|
@ -15,7 +15,7 @@ void ASTKillQueryQuery::formatQueryImpl(const FormatSettings & settings, FormatS
|
||||
if (where_expression)
|
||||
where_expression->formatImpl(settings, state, frame);
|
||||
|
||||
settings.ostr << (sync ? " SYNC" : " ASYNC");
|
||||
settings.ostr << " " << (test ? "TEST" : (sync ? "SYNC" : "ASYNC"));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -46,13 +46,14 @@ bool ParserKillQueryQuery::parseImpl(Pos & pos, Pos end, ASTPtr & node, Pos & ma
|
||||
|
||||
ws.ignore(pos, end);
|
||||
|
||||
query->sync = false;
|
||||
if (ParserString{"SYNC", true, true}.ignore(pos, end))
|
||||
query->sync = true;
|
||||
else if (ParserString{"ASYNC", true, true}.ignore(pos, end))
|
||||
query->sync = false;
|
||||
else if (ParserString{"TEST", true, true}.ignore(pos, end))
|
||||
query->test = true;
|
||||
else
|
||||
expected = "[SYNC|ASYNC]";
|
||||
expected = "[SYNC|ASYNC|TEST]";
|
||||
|
||||
ws.ignore(pos, end);
|
||||
|
||||
|
@ -23,3 +23,4 @@ clickhouse-client -q "SELECT countIf(query = 'SELECT sleep(1) FROM system.number
|
||||
clickhouse-client -q "KILL QUERY WHERE 0 ASYNC"
|
||||
clickhouse-client -q "KILL QUERY WHERE 0 FORMAT TabSeparated"
|
||||
clickhouse-client -q "KILL QUERY WHERE 0 SYNC FORMAT TabSeparated"
|
||||
clickhouse-client -q "KILL QUERY WHERE 1 TEST" &>/dev/null
|
||||
|
@ -774,7 +774,6 @@ $ echo 'SELECT number FROM system.numbers LIMIT 10' | curl 'http://localhost:812
|
||||
|
||||
HTTP интерфейс позволяет передать внешние данные (внешние временные таблицы) для использования запроса. Подробнее смотрите раздел "Внешние данные для обработки запроса"
|
||||
|
||||
|
||||
==JDBC драйвер==
|
||||
|
||||
Для ClickHouse существует официальный JDBC драйвер. Смотрите <a href="https://github.com/yandex/clickhouse-jdbc">здесь</a>.
|
||||
@ -2304,6 +2303,21 @@ ORDER BY EventDate ASC
|
||||
В других случаях использование звёздочки является издевательством над системой, так как вместо преимуществ столбцовой СУБД вы получаете недостатки. То есть использовать звёздочку не рекомендуется.
|
||||
|
||||
|
||||
===KILL QUERY===
|
||||
%%KILL QUERY WHERE expression_for_system.processes [SYNC|ASYNC|TEST] [FORMAT format]%%
|
||||
|
||||
Пытается завершить исполняющиеся в данный момент запросы.
|
||||
Запросы для завершения выбираются из таблицы system.processes для которых выражение expression_for_system.processes истинно.
|
||||
Readonly-пользователи могут совершать только свои запросы.
|
||||
По-умолчанию используется асинхронный вариант запроса (ASYNC), который завершается не ожидая завершения запросов.
|
||||
Синхронный вариант (SYNC) ожидает завершения всех запросов и построчно выводит информацию о процессах по ходу их завершения.
|
||||
Ответ содержит колонку kill_status, которая может принимать следующие значения:
|
||||
1. 'finished' - запрос успешно завершился;
|
||||
2. 'waiting' - запросу отправлен сигнал завершения, ожидается его завершение;
|
||||
3. остальные значения описывают причину невозможности завершения запроса.
|
||||
Тестовый вариант запроса (TEST) только проверяет права пользователя и выводит список запросов для завершения.
|
||||
|
||||
|
||||
</div>
|
||||
<div class="island">
|
||||
<h1>Внешние данные для обработки запроса</h1>
|
||||
|
Loading…
Reference in New Issue
Block a user