diff --git a/dbms/include/DB/Interpreters/InterpreterShowProcesslistQuery.h b/dbms/include/DB/Interpreters/InterpreterShowProcesslistQuery.h index 64916170af2f21daecd4acc1334f1ab6aa526d60..5e7e8e67d6e6261c92151e8683c021ecb3ab41f4 100644 --- a/dbms/include/DB/Interpreters/InterpreterShowProcesslistQuery.h +++ b/dbms/include/DB/Interpreters/InterpreterShowProcesslistQuery.h @@ -23,7 +23,7 @@ public: BlockIO execute() { - return executeQuery(getRewrittenQuery(), context); + return executeQuery(getRewrittenQuery(), context, true); } BlockInputStreamPtr executeAndFormat(WriteBuffer & buf) @@ -31,7 +31,7 @@ public: String query = getRewrittenQuery(); ReadBufferFromString in(query); BlockInputStreamPtr query_plan; - executeQuery(in, buf, context, query_plan); + executeQuery(in, buf, context, query_plan, true); return query_plan; } diff --git a/dbms/include/DB/Interpreters/executeQuery.h b/dbms/include/DB/Interpreters/executeQuery.h index d6f731d8825320f79871a055bd66487555490ebe..cd7c532935a48a6976dbc910eaee65d9a9bcde68 100644 --- a/dbms/include/DB/Interpreters/executeQuery.h +++ b/dbms/include/DB/Interpreters/executeQuery.h @@ -16,6 +16,7 @@ void executeQuery( WriteBuffer & ostr, /// Куда писать результат Context & context, /// БД, таблицы, типы данных, движки таблиц, функции, агрегатные функции... BlockInputStreamPtr & query_plan, /// Сюда может быть записано описание, как выполнялся запрос + bool internal = false, /// Если true - значит запрос порождён из другого запроса, и не нужно его регистировать в ProcessList-е. QueryProcessingStage::Enum stage = QueryProcessingStage::Complete); /// До какой стадии выполнять SELECT запрос. @@ -36,6 +37,7 @@ void executeQuery( BlockIO executeQuery( const String & query, /// Текст запроса, без данных INSERT-а (если есть). Данные INSERT-а следует писать в BlockIO::out. Context & context, + bool internal = false, QueryProcessingStage::Enum stage = QueryProcessingStage::Complete); } diff --git a/dbms/src/Interpreters/InterpreterShowTablesQuery.cpp b/dbms/src/Interpreters/InterpreterShowTablesQuery.cpp index 67bdf1589580ac870706450b335fdf3a4fd08ac4..861f9a1404ba41e70a7b1400a1c493ae310f0d5c 100644 --- a/dbms/src/Interpreters/InterpreterShowTablesQuery.cpp +++ b/dbms/src/Interpreters/InterpreterShowTablesQuery.cpp @@ -48,7 +48,7 @@ String InterpreterShowTablesQuery::getRewrittenQuery() BlockIO InterpreterShowTablesQuery::execute() { - return executeQuery(getRewrittenQuery(), context); + return executeQuery(getRewrittenQuery(), context, true); } @@ -57,7 +57,7 @@ BlockInputStreamPtr InterpreterShowTablesQuery::executeAndFormat(WriteBuffer & b String query = getRewrittenQuery(); ReadBufferFromString in(query); BlockInputStreamPtr query_plan; - executeQuery(in, buf, context, query_plan); + executeQuery(in, buf, context, query_plan, true); return query_plan; } diff --git a/dbms/src/Interpreters/executeQuery.cpp b/dbms/src/Interpreters/executeQuery.cpp index 393a26a9f5d6bcb38cb7d60243eff50739b2e7f2..e39deabe8c9f28894336dba3a8bf54fe2b9311fd 100644 --- a/dbms/src/Interpreters/executeQuery.cpp +++ b/dbms/src/Interpreters/executeQuery.cpp @@ -22,6 +22,7 @@ void executeQuery( WriteBuffer & ostr, Context & context, BlockInputStreamPtr & query_plan, + bool internal, QueryProcessingStage::Enum stage) { ParserQuery parser; @@ -72,7 +73,7 @@ void executeQuery( /// Положим запрос в список процессов. Но запрос SHOW PROCESSLIST класть не будем. ProcessList::EntryPtr process_list_entry; - if (NULL == dynamic_cast(&*ast)) + if (!internal && NULL == dynamic_cast(&*ast)) process_list_entry = context.getProcessList().insert(query); /// Проверка ограничений. @@ -101,6 +102,7 @@ void executeQuery( BlockIO executeQuery( const String & query, Context & context, + bool internal, QueryProcessingStage::Enum stage) { ParserQuery parser; @@ -121,12 +123,6 @@ BlockIO executeQuery( + ", expected " + (parse_res ? "end of query" : expected) + ".", ErrorCodes::SYNTAX_ERROR); - BlockIO res; - - /// Положим запрос в список процессов. Но запрос SHOW PROCESSLIST класть не будем. - if (NULL == dynamic_cast(&*ast)) - res.process_list_entry = context.getProcessList().insert(query); - /// Проверка ограничений. checkLimits(*ast, context.getSettingsRef().limits); @@ -135,6 +131,8 @@ BlockIO executeQuery( quota.checkExceeded(current_time); + BlockIO res; + try { InterpreterQuery interpreter(ast, context, stage); @@ -146,6 +144,10 @@ BlockIO executeQuery( throw; } + /// Положим запрос в список процессов. Но запрос SHOW PROCESSLIST класть не будем. + if (!internal && NULL == dynamic_cast(&*ast)) + res.process_list_entry = context.getProcessList().insert(query); + quota.addQuery(current_time); return res; } diff --git a/dbms/src/Server/TCPHandler.cpp b/dbms/src/Server/TCPHandler.cpp index a1e96bc0aac145f276b2fc685a0b40bf53a43293..9f95f6c46c84e918473afefea47c3a62015699ea 100644 --- a/dbms/src/Server/TCPHandler.cpp +++ b/dbms/src/Server/TCPHandler.cpp @@ -407,7 +407,7 @@ void TCPHandler::receiveQuery() LOG_DEBUG(log, "Query: " << state.query); LOG_DEBUG(log, "Requested stage: " << QueryProcessingStage::toString(stage)); - state.io = executeQuery(state.query, query_context, state.stage); + state.io = executeQuery(state.query, query_context, false, state.stage); }