2012-03-09 15:46:52 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
2012-03-11 08:52:56 +00:00
|
|
|
|
#include <DB/Core/Protocol.h>
|
2012-05-09 13:12:38 +00:00
|
|
|
|
#include <DB/Core/QueryProcessingStage.h>
|
2012-03-11 08:52:56 +00:00
|
|
|
|
|
2012-03-19 12:57:56 +00:00
|
|
|
|
#include <DB/IO/ReadHelpers.h>
|
|
|
|
|
#include <DB/IO/WriteHelpers.h>
|
|
|
|
|
|
2012-03-11 08:52:56 +00:00
|
|
|
|
#include <DB/DataStreams/BlockIO.h>
|
|
|
|
|
|
2015-10-05 00:44:40 +00:00
|
|
|
|
#include <DB/Common/Stopwatch.h>
|
2016-01-21 01:47:28 +00:00
|
|
|
|
#include <DB/Common/CurrentMetrics.h>
|
2012-05-09 15:15:45 +00:00
|
|
|
|
|
2012-03-09 15:46:52 +00:00
|
|
|
|
#include "Server.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
2012-03-11 08:52:56 +00:00
|
|
|
|
|
|
|
|
|
/// Состояние обработки запроса.
|
|
|
|
|
struct QueryState
|
|
|
|
|
{
|
|
|
|
|
/// Идентификатор запроса.
|
2014-02-12 17:31:02 +00:00
|
|
|
|
String query_id;
|
2012-03-11 08:52:56 +00:00
|
|
|
|
|
2014-10-25 18:33:52 +00:00
|
|
|
|
QueryProcessingStage::Enum stage = QueryProcessingStage::Complete;
|
|
|
|
|
Protocol::Compression::Enum compression = Protocol::Compression::Disable;
|
2012-03-11 08:52:56 +00:00
|
|
|
|
|
2012-03-19 12:57:56 +00:00
|
|
|
|
/// Откуда читать данные для INSERT-а.
|
|
|
|
|
SharedPtr<ReadBuffer> maybe_compressed_in;
|
|
|
|
|
BlockInputStreamPtr block_in;
|
|
|
|
|
|
|
|
|
|
/// Куда писать возвращаемые данные.
|
|
|
|
|
SharedPtr<WriteBuffer> maybe_compressed_out;
|
|
|
|
|
BlockOutputStreamPtr block_out;
|
|
|
|
|
|
2012-03-11 08:52:56 +00:00
|
|
|
|
/// Текст запроса.
|
|
|
|
|
String query;
|
|
|
|
|
/// Потоки блоков, с помощью которых выполнять запрос.
|
|
|
|
|
BlockIO io;
|
|
|
|
|
|
2014-02-14 15:59:01 +00:00
|
|
|
|
/// Отменен ли запрос
|
2014-10-25 18:33:52 +00:00
|
|
|
|
bool is_cancelled = false;
|
2014-02-14 15:59:01 +00:00
|
|
|
|
/// Пустой или нет
|
2014-10-25 18:33:52 +00:00
|
|
|
|
bool is_empty = true;
|
2012-05-09 15:15:45 +00:00
|
|
|
|
/// Данные были отправлены.
|
2014-10-25 18:33:52 +00:00
|
|
|
|
bool sent_all_data = false;
|
2014-11-08 23:54:03 +00:00
|
|
|
|
/// Запрос требует приёма данных от клиента (INSERT, но не INSERT SELECT).
|
|
|
|
|
bool need_receive_data_for_insert = false;
|
2012-05-09 15:15:45 +00:00
|
|
|
|
|
2012-05-09 16:34:41 +00:00
|
|
|
|
/// Для вывода прогресса - разница после предыдущей отправки прогресса.
|
2014-10-25 18:33:52 +00:00
|
|
|
|
Progress progress;
|
2013-11-02 21:18:54 +00:00
|
|
|
|
|
2012-05-09 15:50:42 +00:00
|
|
|
|
|
2012-03-11 08:52:56 +00:00
|
|
|
|
void reset()
|
|
|
|
|
{
|
2012-05-09 08:16:09 +00:00
|
|
|
|
*this = QueryState();
|
2012-03-11 08:52:56 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool empty()
|
|
|
|
|
{
|
2014-02-14 15:59:01 +00:00
|
|
|
|
return is_empty;
|
2012-03-11 08:52:56 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2012-03-09 15:46:52 +00:00
|
|
|
|
class TCPHandler : public Poco::Net::TCPServerConnection
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
TCPHandler(Server & server_, const Poco::Net::StreamSocket & socket_)
|
2013-02-01 19:02:04 +00:00
|
|
|
|
: Poco::Net::TCPServerConnection(socket_), server(server_),
|
|
|
|
|
log(&Logger::get("TCPHandler")), client_revision(0),
|
2013-09-14 05:14:22 +00:00
|
|
|
|
connection_context(*server.global_context), query_context(connection_context)
|
2012-03-09 15:46:52 +00:00
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void run();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
Server & server;
|
|
|
|
|
Logger * log;
|
|
|
|
|
|
2013-02-01 19:02:04 +00:00
|
|
|
|
UInt64 client_revision;
|
|
|
|
|
|
2012-05-17 19:15:53 +00:00
|
|
|
|
Context connection_context;
|
2013-02-01 19:02:04 +00:00
|
|
|
|
Context query_context;
|
2012-05-17 19:15:53 +00:00
|
|
|
|
|
2014-02-27 22:24:38 +00:00
|
|
|
|
/// Потоки для чтения/записи из/в сокет соединения с клиентом.
|
|
|
|
|
SharedPtr<ReadBuffer> in;
|
|
|
|
|
SharedPtr<WriteBuffer> out;
|
2012-05-21 06:49:05 +00:00
|
|
|
|
|
2012-05-09 15:15:45 +00:00
|
|
|
|
/// Время после последней проверки остановки запроса и отправки прогресса.
|
|
|
|
|
Stopwatch after_check_cancelled;
|
|
|
|
|
Stopwatch after_send_progress;
|
2012-05-30 06:46:57 +00:00
|
|
|
|
|
|
|
|
|
String default_database;
|
2012-12-06 17:32:48 +00:00
|
|
|
|
|
|
|
|
|
/// На данный момент, поддерживается одновременное выполнение только одного запроса в соединении.
|
|
|
|
|
QueryState state;
|
|
|
|
|
|
2016-01-21 01:47:28 +00:00
|
|
|
|
CurrentMetrics::Increment metric_increment{CurrentMetrics::TCPConnection};
|
|
|
|
|
|
2012-05-09 08:16:09 +00:00
|
|
|
|
|
2012-03-09 15:46:52 +00:00
|
|
|
|
void runImpl();
|
2012-03-11 08:52:56 +00:00
|
|
|
|
|
2012-05-21 06:49:05 +00:00
|
|
|
|
void receiveHello();
|
|
|
|
|
bool receivePacket();
|
|
|
|
|
void receiveQuery();
|
|
|
|
|
bool receiveData();
|
2014-03-04 15:31:56 +00:00
|
|
|
|
void readData(const Settings & global_settings);
|
2012-05-17 19:15:53 +00:00
|
|
|
|
|
2012-05-21 06:49:05 +00:00
|
|
|
|
/// Обработать запрос INSERT
|
2013-12-20 10:07:10 +00:00
|
|
|
|
void processInsertQuery(const Settings & global_settings);
|
2012-05-17 19:15:53 +00:00
|
|
|
|
|
2012-05-21 06:49:05 +00:00
|
|
|
|
/// Обработать запрос, который не требует приёма блоков данных от клиента
|
|
|
|
|
void processOrdinaryQuery();
|
2012-03-11 08:52:56 +00:00
|
|
|
|
|
2012-05-21 06:49:05 +00:00
|
|
|
|
void sendHello();
|
|
|
|
|
void sendData(Block & block); /// Записать в сеть блок.
|
2012-05-30 06:46:57 +00:00
|
|
|
|
void sendException(const Exception & e);
|
2013-11-02 21:18:54 +00:00
|
|
|
|
void sendProgress();
|
2012-05-21 06:49:05 +00:00
|
|
|
|
void sendEndOfStream();
|
2013-05-22 14:57:43 +00:00
|
|
|
|
void sendProfileInfo();
|
2013-09-05 20:22:43 +00:00
|
|
|
|
void sendTotals();
|
2013-09-07 02:03:13 +00:00
|
|
|
|
void sendExtremes();
|
2013-09-05 20:22:43 +00:00
|
|
|
|
|
|
|
|
|
/// Создаёт state.block_in/block_out для чтения/записи блоков, в зависимости от того, включено ли сжатие.
|
|
|
|
|
void initBlockInput();
|
|
|
|
|
void initBlockOutput();
|
2012-05-09 08:16:09 +00:00
|
|
|
|
|
2012-05-21 06:49:05 +00:00
|
|
|
|
bool isQueryCancelled();
|
2012-07-21 07:02:55 +00:00
|
|
|
|
|
2013-11-02 21:18:54 +00:00
|
|
|
|
/// Эта функция вызывается из разных потоков.
|
2014-10-25 18:33:52 +00:00
|
|
|
|
void updateProgress(const Progress & value);
|
2012-03-09 15:46:52 +00:00
|
|
|
|
};
|
|
|
|
|
|
2012-03-11 08:52:56 +00:00
|
|
|
|
|
2012-03-09 15:46:52 +00:00
|
|
|
|
}
|