Skip to content

Commit 1a47063

Browse files
authored
Merge pull request #64 from ClickHouse/fix_insert_no_answer
Throw exception if sever doesn't send eos package on insert query.
2 parents 04a4dce + 2c9350d commit 1a47063

File tree

2 files changed

+31
-16
lines changed

2 files changed

+31
-16
lines changed

clickhouse/client.cpp

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -248,9 +248,16 @@ void Client::Impl::Insert(const std::string& table_name, const Block& block) {
248248
SendData(Block());
249249

250250
// Wait for EOS.
251-
while (ReceivePacket()) {
251+
uint64_t eos_packet{0};
252+
while (ReceivePacket(&eos_packet)) {
252253
;
253254
}
255+
256+
if (eos_packet != ServerCodes::EndOfStream && eos_packet != ServerCodes::Exception
257+
&& eos_packet != ServerCodes::Log && options_.rethrow_exceptions) {
258+
throw std::runtime_error(std::string{"unexpected packet from server while receiving end of query, expected (expected Exception, EndOfStream or Log, got: "}
259+
+ (eos_packet ? std::to_string(eos_packet) : "nothing") + ")");
260+
}
254261
}
255262

256263
void Client::Impl::Ping() {
@@ -495,23 +502,29 @@ bool Client::Impl::ReceiveException(bool rethrow) {
495502
std::unique_ptr<Exception> e(new Exception);
496503
Exception* current = e.get();
497504

505+
bool exception_received = true;
498506
do {
499507
bool has_nested = false;
500508

501509
if (!WireFormat::ReadFixed(&input_, &current->code)) {
502-
return false;
510+
exception_received = false;
511+
break;
503512
}
504513
if (!WireFormat::ReadString(&input_, &current->name)) {
505-
return false;
514+
exception_received = false;
515+
break;
506516
}
507517
if (!WireFormat::ReadString(&input_, &current->display_text)) {
508-
return false;
518+
exception_received = false;
519+
break;
509520
}
510521
if (!WireFormat::ReadString(&input_, &current->stack_trace)) {
511-
return false;
522+
exception_received = false;
523+
break;
512524
}
513525
if (!WireFormat::ReadFixed(&input_, &has_nested)) {
514-
return false;
526+
exception_received = false;
527+
break;
515528
}
516529

517530
if (has_nested) {
@@ -530,7 +543,7 @@ bool Client::Impl::ReceiveException(bool rethrow) {
530543
throw ServerException(std::move(e));
531544
}
532545

533-
return true;
546+
return exception_received;
534547
}
535548

536549
void Client::Impl::SendCancel() {

clickhouse/protocol.h

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@ namespace clickhouse {
55
/// То, что передаёт сервер.
66
namespace ServerCodes {
77
enum {
8-
Hello = 0, /// Имя, версия, ревизия.
9-
Data = 1, /// Блок данных со сжатием или без.
10-
Exception = 2, /// Исключение во время обработки запроса.
11-
Progress = 3, /// Прогресс выполнения запроса: строк считано, байт считано.
12-
Pong = 4, /// Ответ на Ping.
13-
EndOfStream = 5, /// Все пакеты были переданы.
14-
ProfileInfo = 6, /// Пакет с профайлинговой информацией.
15-
Totals = 7, /// Блок данных с тотальными значениями, со сжатием или без.
16-
Extremes = 8, /// Блок данных с минимумами и максимумами, аналогично.
8+
Hello = 0, /// Имя, версия, ревизия.
9+
Data = 1, /// Блок данных со сжатием или без.
10+
Exception = 2, /// Исключение во время обработки запроса.
11+
Progress = 3, /// Прогресс выполнения запроса: строк считано, байт считано.
12+
Pong = 4, /// Ответ на Ping.
13+
EndOfStream = 5, /// Все пакеты были переданы.
14+
ProfileInfo = 6, /// Пакет с профайлинговой информацией.
15+
Totals = 7, /// Блок данных с тотальными значениями, со сжатием или без.
16+
Extremes = 8, /// Блок данных с минимумами и максимумами, аналогично.
17+
TablesStatusResponse = 9, /// Ответ на запрос TableStatus.
18+
Log = 10, /// Системный лог исполнения запроса.
1719
};
1820
}
1921

0 commit comments

Comments
 (0)